ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTAxMTYKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjZmNjUKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorYmluCisqfgorKi5iYWsKK1RodW1icy5kYgorKi5jbGFzcworKi5EU19TdG9yZQpkaWZmIC0tZ2l0IGEvLnByb2plY3QgYi8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJiYzIzCi0tLSAvZGV2L251bGwKKysrIGIvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+YW50LWdsb2I8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5tayBiL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4OWVkZgotLS0gL2Rldi9udWxsCisrKyBiL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBPbmx5IGNvbXBpbGUgc291cmNlIGphdmEgZmlsZXMgaW4gdGhpcyBsaWIuCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gc3JjCisKK0xPQ0FMX01PRFVMRSA6PSBhbnQtZ2xvYgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9NT0RVTEVfTElDRU5TRV9BUEwgYi9NT0RVTEVfTElDRU5TRV9BUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL01PRFVMRV9MSUNFTlNFX0FQTApkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjZmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RJQ0UKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworICoKKyAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisgKgorICogICAxLiBEZWZpbml0aW9ucy4KKyAqCisgKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorICoKKyAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorICoKKyAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKyAqCisgKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKyAqCisgKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgKgorICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorICoKKyAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKyAqCisgKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisgKgorICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisgKgorICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisgKgorICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisgKgorICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKyAqCisgKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorICoKKyAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorICoKKyAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorICoKKyAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorICoKKyAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKyAqCisgKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKyAqCisgKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorICoKKyAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisgKgorICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisgKgorICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisgKgorICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitXM0OuIFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRQoraHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQorCitUaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCityZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZworbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKSBhZ3JlZQordGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZAorY29uZGl0aW9ucy4KKworUGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uLAord2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzCitoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlCitzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uczoKKworICAxLiBUaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2YgdGhlCisgICAgIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLiAKKyAgMi4gQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCisgICAgIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCB0aGUgVzNDIFNvZnR3YXJlIFNob3J0IE5vdGljZSBzaG91bGQgYmUKKyAgICAgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSB3aXRoaW4gdGhlIGJvZHkKKyAgICAgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlLgorICAzLiBOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZQorICAgICBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tCisgICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKQorICAgICAKK1RISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UKK05PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQKK1RIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZCitQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KKworQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCisKK1RoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KK1RpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQKK2FsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy4KKworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK1RoaXMgZm9ybXVsYXRpb24gb2YgVzNDJ3Mgbm90aWNlIGFuZCBsaWNlbnNlIGJlY2FtZSBhY3RpdmUgb24gRGVjZW1iZXIgMzEgMjAwMi4KK1RoaXMgdmVyc2lvbiByZW1vdmVzIHRoZSBjb3B5cmlnaHQgb3duZXJzaGlwIG5vdGljZSBzdWNoIHRoYXQgdGhpcyBsaWNlbnNlIGNhbgorYmUgdXNlZCB3aXRoIG1hdGVyaWFscyBvdGhlciB0aGFuIHRob3NlIG93bmVkIGJ5IHRoZSBXM0MsIHJlZmxlY3RzIHRoYXQgRVJDSU0KK2lzIG5vdyBhIGhvc3Qgb2YgdGhlIFczQywgaW5jbHVkZXMgcmVmZXJlbmNlcyB0byB0aGlzIHNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YKK3RoZSBsaWNlbnNlLCBhbmQgcmVtb3ZlcyB0aGUgYW1iaWd1b3VzIGdyYW50IG9mICJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbgoraXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5IGFuZCBPU0kncyBjZXJ0aWZpY2F0aW9uCit1bmRlciB0aGUgT3BlbiBTb3VyY2UgRGVmaW5pdGlvbi4gUGxlYXNlIHNlZSBvdXIgQ29weXJpZ2h0IEZBUSBmb3IgY29tbW9uCitxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYyB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIgcXVlc3Rpb25zIGFib3V0Cit0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gc2l0ZS1wb2xpY3lAdzMub3JnLgorIAorSm9zZXBoIFJlYWdsZSA8c2l0ZS1wb2xpY3lAdzMub3JnPiAKKworVGhpcyBsaWNlbnNlIGNhbWUgZnJvbTogaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9jb3B5aW5nLmh0bWwKKyAgSG93ZXZlciBwbGVhc2Ugbm90ZSBmdXR1cmUgdmVyc2lvbnMgb2YgU0FYIG1heSBiZSBjb3ZlcmVkIAorICB1bmRlciBodHRwOi8vc2F4cHJvamVjdC5vcmcvP3NlbGVjdGVkPXBkCisKK1NBWDIgaXMgRnJlZSEKKworSSBoZXJlYnkgYWJhbmRvbiBhbnkgcHJvcGVydHkgcmlnaHRzIHRvIFNBWCAyLjAgKHRoZSBTaW1wbGUgQVBJIGZvcgorWE1MKSwgYW5kIHJlbGVhc2UgYWxsIG9mIHRoZSBTQVggMi4wIHNvdXJjZSBjb2RlLCBjb21waWxlZCBjb2RlLCBhbmQKK2RvY3VtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGludG8gdGhlIFB1YmxpYyBEb21haW4uCitTQVggY29tZXMgd2l0aCBOTyBXQVJSQU5UWSBvciBndWFyYW50ZWUgb2YgZml0bmVzcyBmb3IgYW55CitwdXJwb3NlLgorCitEYXZpZCBNZWdnaW5zb24sIGRhdmlkQG1lZ2dpbnNvbi5jb20KKzIwMDAtMDUtMDUKZGlmZiAtLWdpdCBhL1JFQURNRS50eHQgYi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjY0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjcgQEAKK0FudCBHbG9iIHN1cHBvcnQKKworQXBhY2hlIEFudAorQ29weXJpZ2h0IDE5OTktMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwcm9qZWN0IGlzIGEgZm9yayBvZiBhIHN1YnNldCBvZiBBbnQgMS44LjM6CitodHRwOi8vYW50LmFwYWNoZS5jb20vCisKK1NwZWNpZmljYWxseSwgaXQgY29udGFpbnMgdGhlIHN1YnNldCBvZiBBbnQgcmVsYXRlZCB0byBtYXRjaGluZyBnbG9iIHBhdHRlcm5zCit0byBwYXRocworCitUaGUgZm9yayB3YXMgbW9kaWZpZWQgYXMgZm9sbG93czoKKyogU3RhcnRlZCB3aXRoIHZlcnNpb24gMS44LjMKKworKiBFeHRyYWN0ZWQKKyAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JVdGlscworICBhbmQgdGhlbiBldmVyeXRoaW5nIGl0IHRyYW5zaXRpdmVseSByZWZlcmVuY2VzIHRoYXQgd2FzIHRydWx5IG5lZWRlZDoKKyAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlscywKKyAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uLAorICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PUywKKyAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbgorCisqIEZpbGVVdGlscyB3YXMgcHJ1bmVkIHRvIGtlZXAgb25seSAyIG1ldGhvZHMsIHdoaWNoIGJyb3VnaHQgT1MgKHdoaWNoCisgIGJyb3VnaHQgQ29uZGl0aW9uKS4gSW4gdHVybiB0aGlzIGJyb3VnaHQgaW4gQnVpbGRFeGNlcHRpb24gd2hpY2ggd2FzIHRyaW1tZWQKKyAgdXAgYSBiaXQgKHJlbW92aW5nIHJlZmVyZW5jZXMgdG8gTG9jYXRpb24pCisKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbi5qYXZhIGIvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0N2NkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKy8qKgorICogU2lnbmFscyBhbiBlcnJvciBjb25kaXRpb24gZHVyaW5nIGEgYnVpbGQKKyAqLworcHVibGljIGNsYXNzIEJ1aWxkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBidWlsZCBleGNlcHRpb24gd2l0aCBubyBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBhcworICAgICAqIGEgcm9vdCBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIGEgY2F1c2UgaXMgc3BlY2lmaWVkLgorICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgZXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuCisgICAgICogICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgaW5pdENhdXNlKGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24gYXMgYSByb290IGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhdXNlIFRoZSBleGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4KKyAgICAgKiAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubworICAgICAqICAgICAgICAgZXhjZXB0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9uZQorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldENhdXNlfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRDYXVzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29uZGl0aW9uLmphdmEgYi9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWRiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGNvbmRpdGlvbnMgdG8gdXNlIGluc2lkZSB0aGUgJmx0O2NvbmRpdGlvbiZndDsgdGFzay4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29uZGl0aW9uIHsKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGNvbmRpdGlvbiB0cnVlPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pcy5qYXZhIGIvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTBlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL09zLmphdmEKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogQ29uZGl0aW9uIHRoYXQgdGVzdHMgdGhlIE9TIHR5cGUuCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGNsYXNzIE9zIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfTkFNRSA9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfQVJDSCA9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfVkVSU0lPTiA9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MudmVyc2lvbiIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVAgPQorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CisKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdG8gbG9vayBmb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmYW1pbHk7CisgICAgLyoqCisgICAgICogTmFtZSBvZiBPUworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgLyoqCisgICAgICogdmVyc2lvbiBvZiBPUworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb247CisgICAgLyoqCisgICAgICogT1MgYXJjaGl0ZWN0dXJlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXJjaDsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfV0lORE9XUyA9ICJ3aW5kb3dzIjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfOVggPSAid2luOXgiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9OVCA9ICJ3aW5udCI7CisgICAgLyoqCisgICAgICogT1MgZmFtaWx5IHRoYXQgY2FuIGJlIHRlc3RlZCBmb3IuIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZX09TMiA9ICJvcy8yIjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfTkVUV0FSRSA9ICJuZXR3YXJlIjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfRE9TID0gImRvcyI7CisgICAgLyoqCisgICAgICogT1MgZmFtaWx5IHRoYXQgY2FuIGJlIHRlc3RlZCBmb3IuIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZX01BQyA9ICJtYWMiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9UQU5ERU0gPSAidGFuZGVtIjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfVU5JWCA9ICJ1bml4IjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfVk1TID0gIm9wZW52bXMiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9aT1MgPSAiei9vcyI7CisgICAgLyoqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9PUzQwMCA9ICJvcy80MDAiOworCisgICAgLyoqCisgICAgICogT3BlbkpESyBpcyByZXBvcnRlZCB0byBjYWxsIE1hY09TIFggIkRhcndpbiIKKyAgICAgKiBAc2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ0ODg5CisgICAgICogQHNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0hBRE9PUC0zMzE4CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBUldJTiA9ICJkYXJ3aW4iOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICovCisgICAgcHVibGljIE9zKCkgeworICAgICAgICAvL2RlZmF1bHQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHNldHMgdGhlIGZhbWlseSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gZmFtaWx5IGEgU3RyaW5nIHZhbHVlCisgICAgICovCisgICAgcHVibGljIE9zKFN0cmluZyBmYW1pbHkpIHsKKyAgICAgICAgc2V0RmFtaWx5KGZhbWlseSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCBPUyBmYW1pbHkgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIGYgICAgICBUaGUgT1MgZmFtaWx5IHR5cGUgZGVzaXJlZDxiciAvPgorICAgICAqICAgICAgICAgICAgICAgUG9zc2libGUgdmFsdWVzOjxiciAvPgorICAgICAqICAgICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgICAgPGxpPmRvczwvbGk+CisgICAgICogICAgICAgICAgICAgICA8bGk+bWFjPC9saT4KKyAgICAgKiAgICAgICAgICAgICAgIDxsaT5uZXR3YXJlPC9saT4KKyAgICAgKiAgICAgICAgICAgICAgIDxsaT5vcy8yPC9saT4KKyAgICAgKiAgICAgICAgICAgICAgIDxsaT50YW5kZW08L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPnVuaXg8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPndpbmRvd3M8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPndpbjl4PC9saT4KKyAgICAgKiAgICAgICAgICAgICAgIDxsaT56L29zPC9saT4KKyAgICAgKiAgICAgICAgICAgICAgIDxsaT5vcy80MDA8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYW1pbHkoU3RyaW5nIGYpIHsKKyAgICAgICAgZmFtaWx5ID0gZi50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCBPUyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgIFRoZSBPUyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXNpcmVkIE9TIGFyY2hpdGVjdHVyZQorICAgICAqCisgICAgICogQHBhcmFtIGFyY2ggICBUaGUgT1MgYXJjaGl0ZWN0dXJlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJjaChTdHJpbmcgYXJjaCkgeworICAgICAgICB0aGlzLmFyY2ggPSBhcmNoLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXNpcmVkIE9TIHZlcnNpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uICAgVGhlIE9TIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb24udG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIE9TIG9uIHdoaWNoIEFudCBpcyBleGVjdXRpbmcgbWF0Y2hlcyB0aGUgdHlwZSBvZgorICAgICAqIHRoYXQgc2V0IGluIHNldEZhbWlseS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9zIG1hdGNoZXMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKiBAc2VlIE9zI3NldEZhbWlseShTdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpc09zKGZhbWlseSwgbmFtZSwgYXJjaCwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgT1Mgb24gd2hpY2ggQW50IGlzIGV4ZWN1dGluZyBtYXRjaGVzIHRoZQorICAgICAqIGdpdmVuIE9TIGZhbWlseS4KKyAgICAgKiBAcGFyYW0gZmFtaWx5IHRoZSBmYW1pbHkgdG8gY2hlY2sgZm9yCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBPUyBtYXRjaGVzCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhbWlseShTdHJpbmcgZmFtaWx5KSB7CisgICAgICAgIHJldHVybiBpc09zKGZhbWlseSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgT1Mgb24gd2hpY2ggQW50IGlzIGV4ZWN1dGluZyBtYXRjaGVzIHRoZQorICAgICAqIGdpdmVuIE9TIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgT1MgbmFtZSB0byBjaGVjayBmb3IKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIE9TIG1hdGNoZXMKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gaXNPcyhudWxsLCBuYW1lLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBPUyBvbiB3aGljaCBBbnQgaXMgZXhlY3V0aW5nIG1hdGNoZXMgdGhlCisgICAgICogZ2l2ZW4gT1MgYXJjaGl0ZWN0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGFyY2ggdGhlIE9TIGFyY2hpdGVjdHVyZSB0byBjaGVjayBmb3IKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIE9TIG1hdGNoZXMKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJjaChTdHJpbmcgYXJjaCkgeworICAgICAgICByZXR1cm4gaXNPcyhudWxsLCBudWxsLCBhcmNoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBPUyBvbiB3aGljaCBBbnQgaXMgZXhlY3V0aW5nIG1hdGNoZXMgdGhlCisgICAgICogZ2l2ZW4gT1MgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBPUyB2ZXJzaW9uIHRvIGNoZWNrIGZvcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgT1MgbWF0Y2hlcworICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBpc09zKG51bGwsIG51bGwsIG51bGwsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIE9TIG9uIHdoaWNoIEFudCBpcyBleGVjdXRpbmcgbWF0Y2hlcyB0aGUKKyAgICAgKiBnaXZlbiBPUyBmYW1pbHksIG5hbWUsIGFyY2hpdGVjdHVyZSBhbmQgdmVyc2lvbgorICAgICAqCisgICAgICogQHBhcmFtIGZhbWlseSAgIFRoZSBPUyBmYW1pbHkKKyAgICAgKiBAcGFyYW0gbmFtZSAgIFRoZSBPUyBuYW1lCisgICAgICogQHBhcmFtIGFyY2ggICBUaGUgT1MgYXJjaGl0ZWN0dXJlCisgICAgICogQHBhcmFtIHZlcnNpb24gICBUaGUgT1MgdmVyc2lvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgT1MgbWF0Y2hlcworICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcyhTdHJpbmcgZmFtaWx5LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCisgICAgICAgIGlmIChmYW1pbHkgIT0gbnVsbCB8fCBuYW1lICE9IG51bGwgfHwgYXJjaCAhPSBudWxsCisgICAgICAgICAgICB8fCB2ZXJzaW9uICE9IG51bGwpIHsKKworICAgICAgICAgICAgYm9vbGVhbiBpc0ZhbWlseSA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGlzTmFtZSA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGlzQXJjaCA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGlzVmVyc2lvbiA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChmYW1pbHkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLy93aW5kb3dzIHByb2JpbmcgbG9naWMgcmVsaWVzIG9uIHRoZSB3b3JkICd3aW5kb3dzJyBpbgorICAgICAgICAgICAgICAgIC8vdGhlIE9TCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1dpbmRvd3MgPSBPU19OQU1FLmluZGV4T2YoRkFNSUxZX1dJTkRPV1MpID4gLTE7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpczl4ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc05UID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93cykgeworICAgICAgICAgICAgICAgICAgICAvL3RoZXJlIGFyZSBvbmx5IGZvdXIgOXggcGxhdGZvcm1zIHRoYXQgd2UgbG9vayBmb3IKKyAgICAgICAgICAgICAgICAgICAgaXM5eCA9IChPU19OQU1FLmluZGV4T2YoIjk1IikgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuaW5kZXhPZigiOTgiKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgT1NfTkFNRS5pbmRleE9mKCJtZSIpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmNlIGlzbid0IHJlYWxseSA5eCwgYnV0IGNyaXBwbGVkIGVub3VnaCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmUgYSBtdWNobmVzcy4gQW50IGRvZXNudCBydW4gb24gQ0UsIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBPU19OQU1FLmluZGV4T2YoImNlIikgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlzTlQgPSAhaXM5eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX1dJTkRPV1MpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfOVgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzICYmIGlzOXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9OVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBpc1dpbmRvd3MgJiYgaXNOVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX09TMikpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmluZGV4T2YoRkFNSUxZX09TMikgPiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX05FVFdBUkUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9ORVRXQVJFKSA+IC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfRE9TKSkgeworICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IFBBVEhfU0VQLmVxdWFscygiOyIpICYmICFpc0ZhbWlseShGQU1JTFlfTkVUV0FSRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9NQUMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9NQUMpID4gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuaW5kZXhPZihEQVJXSU4pID4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9UQU5ERU0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKCJub25zdG9wX2tlcm5lbCIpID4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9VTklYKSkgeworICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IFBBVEhfU0VQLmVxdWFscygiOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNGYW1pbHkoRkFNSUxZX1ZNUykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghaXNGYW1pbHkoRkFNSUxZX01BQykgfHwgT1NfTkFNRS5lbmRzV2l0aCgieCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgT1NfTkFNRS5pbmRleE9mKERBUldJTikgPiAtMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9aT1MpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9aT1MpID4gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuaW5kZXhPZigib3MvMzkwIikgPiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX09TNDAwKSkgeworICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IE9TX05BTUUuaW5kZXhPZihGQU1JTFlfT1M0MDApID4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9WTVMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9WTVMpID4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkRvblwndCBrbm93IGhvdyB0byBkZXRlY3Qgb3MgZmFtaWx5IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmYW1pbHkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXNOYW1lID0gbmFtZS5lcXVhbHMoT1NfTkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXNBcmNoID0gYXJjaC5lcXVhbHMoT1NfQVJDSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXNWZXJzaW9uID0gdmVyc2lvbi5lcXVhbHMoT1NfVkVSU0lPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRWYWx1ZSA9IGlzRmFtaWx5ICYmIGlzTmFtZSAmJiBpc0FyY2ggJiYgaXNWZXJzaW9uOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRWYWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yVXRpbHMuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OGQ0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yVXRpbHMuamF2YQpAQCAtMCwwICsxLDY0NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiA8cD5UaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB1c2VkIGJ5IHNlbGVjdG9ycyBhbmQgRGlyZWN0b3J5U2Nhbm5lci4gVGhlCisgKiBmdW5jdGlvbmFsaXR5IG1vcmUgcHJvcGVybHkgYmVsb25ncyBqdXN0IHRvIHNlbGVjdG9ycywgYnV0IHVuZm9ydHVuYXRlbHkKKyAqIERpcmVjdG9yeVNjYW5uZXIgZXhwb3NlZCB0aGVzZSBhcyBwcm90ZWN0ZWQgbWV0aG9kcy4gVGh1cyB3ZSBoYXZlIHRvCisgKiBzdXBwb3J0IGFueSBzdWJjbGFzc2VzIG9mIERpcmVjdG9yeVNjYW5uZXIgdGhhdCBtYXkgYWNjZXNzIHRoZXNlIG1ldGhvZHMuCisgKiA8L3A+CisgKiA8cD5UaGlzIGlzIGEgU2luZ2xldG9uLjwvcD4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWxlY3RvclV0aWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGRpcmVjdG9yaWVzLgorICAgICAqIEBzaW5jZSBBbnQgMS44LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUVQX1RSRUVfTUFUQ0ggPSAiKioiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VsZWN0b3JVdGlscyBpbnN0YW5jZSA9IG5ldyBTZWxlY3RvclV0aWxzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHJpdmF0ZSBTZWxlY3RvclV0aWxzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIFNpbmdsZXRvbi4KKyAgICAgKiBAcmV0dXJuIHNpbmdsZXRvbiBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VsZWN0b3JVdGlscyBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIHRoZSBzdGFydCBvZiBhIGdpdmVuCisgICAgICogcGF0dGVybiB1cCB0byB0aGUgZmlyc3QgIioqIi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5vdCBhIGdlbmVyYWwgcHVycG9zZSB0ZXN0IGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdQorICAgICAqIGNhbiBsaXZlIHdpdGggZmFsc2UgcG9zaXRpdmVzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGF0dGVybj0qKlxhPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zdHI9YjwvY29kZT4gd2lsbCB5aWVsZCA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN0ciAgICAgVGhlIHBhdGggdG8gbWF0Y2gsIGFzIGEgU3RyaW5nLiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIHBhdGggbWF0Y2hlcyB0aGUgc3RhcnQgb2YgYSBnaXZlbgorICAgICAqIHBhdHRlcm4gdXAgdG8gdGhlIGZpcnN0ICIqKiIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0dGVyblN0YXJ0KFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBtYXRjaFBhdHRlcm5TdGFydChwYXR0ZXJuLCBzdHIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIHRoZSBzdGFydCBvZiBhIGdpdmVuCisgICAgICogcGF0dGVybiB1cCB0byB0aGUgZmlyc3QgIioqIi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5vdCBhIGdlbmVyYWwgcHVycG9zZSB0ZXN0IGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdQorICAgICAqIGNhbiBsaXZlIHdpdGggZmFsc2UgcG9zaXRpdmVzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGF0dGVybj0qKlxhPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zdHI9YjwvY29kZT4gd2lsbCB5aWVsZCA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN0ciAgICAgVGhlIHBhdGggdG8gbWF0Y2gsIGFzIGEgU3RyaW5nLiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgV2hldGhlciBvciBub3QgbWF0Y2hpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZW5zaXRpdmVseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4KKyAgICAgKiBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFBhdHRlcm5TdGFydChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgLy8gV2hlbiBzdHIgc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgcGF0dGVybiBoYXMgdG8gc3RhcnQgd2l0aCBhCisgICAgICAgIC8vIEZpbGUuc2VwYXJhdG9yLgorICAgICAgICAvLyBXaGVuIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgc3RyIGhhcyB0byBzdGFydCB3aXRoIGEKKyAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3IuCisgICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikKKyAgICAgICAgICAgICAgICAhPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBwYXREaXJzID0gdG9rZW5pemVQYXRoQXNBcnJheShwYXR0ZXJuKTsKKyAgICAgICAgU3RyaW5nW10gc3RyRGlycyA9IHRva2VuaXplUGF0aEFzQXJyYXkoc3RyKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoUGF0dGVyblN0YXJ0KHBhdERpcnMsIHN0ckRpcnMsIGlzQ2FzZVNlbnNpdGl2ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIHBhdGggbWF0Y2hlcyB0aGUgc3RhcnQgb2YgYSBnaXZlbgorICAgICAqIHBhdHRlcm4gdXAgdG8gdGhlIGZpcnN0ICIqKiIuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgdGVzdCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKKyAgICAgKiBjYW4gbGl2ZSB3aXRoIGZhbHNlIHBvc2l0aXZlcy4gRm9yIGV4YW1wbGUsIDxjb2RlPnBhdHRlcm49KipcYTwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+c3RyPWI8L2NvZGU+IHdpbGwgeWllbGQgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0RGlycyBUaGUgdG9rZW5pemVkIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyRGlycyBUaGUgdG9rZW5pemVkIHBhdGggdG8gbWF0Y2guIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBXaGV0aGVyIG9yIG5vdCBtYXRjaGluZyBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbnNpdGl2ZWx5LgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIHBhdGggbWF0Y2hlcyB0aGUgc3RhcnQgb2YgYSBnaXZlbgorICAgICAqIHBhdHRlcm4gdXAgdG8gdGhlIGZpcnN0ICIqKiIuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuU3RhcnQoU3RyaW5nW10gcGF0RGlycywgU3RyaW5nW10gc3RyRGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgcGF0SWR4RW5kID0gcGF0RGlycy5sZW5ndGggLSAxOworICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgc3RySWR4RW5kID0gc3RyRGlycy5sZW5ndGggLSAxOworCisgICAgICAgIC8vIHVwIHRvIGZpcnN0ICcqKicKKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0IDw9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXREaXIgPSBwYXREaXJzW3BhdElkeFN0YXJ0XTsKKyAgICAgICAgICAgIGlmIChwYXREaXIuZXF1YWxzKERFRVBfVFJFRV9NQVRDSCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWF0Y2gocGF0RGlyLCBzdHJEaXJzW3N0cklkeFN0YXJ0XSwgaXNDYXNlU2Vuc2l0aXZlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7CisgICAgICAgICAgICBzdHJJZHhTdGFydCsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpTaW1wbGlmeUJvb2xlYW5SZXR1cm5DaGVjayBPRkYKKyAgICAgICAgLy8gQ2hlY2sgdHVybmVkIG9mZiBhcyB0aGUgY29kZSBuZWVkcyB0aGUgY29tbWVudHMgZm9yIHRoZSB2YXJpb3VzCisgICAgICAgIC8vIGNvZGUgcGF0aHMuCisgICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgeworICAgICAgICAgICAgLy8gU3RyaW5nIGlzIGV4aGF1c3RlZAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAocGF0SWR4U3RhcnQgPiBwYXRJZHhFbmQpIHsKKyAgICAgICAgICAgIC8vIFN0cmluZyBub3QgZXhoYXVzdGVkLCBidXQgcGF0dGVybiBpcy4gRmFpbHVyZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBhdHRlcm4gbm93IGhvbGRzICoqIHdoaWxlIHN0cmluZyBpcyBub3QgZXhoYXVzdGVkCisgICAgICAgICAgICAvLyB0aGlzIHdpbGwgZ2VuZXJhdGUgZmFsc2UgcG9zaXRpdmVzIGJ1dCB3ZSBjYW4gbGl2ZSB3aXRoIHRoYXQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybi4KKyAgICAgKgorICAgICAqIElmIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZQorICAgICAqIHBhdHRlcm4geW91IHNob3VsZCByYXRoZXIgdXNlIFRva2VuaXplZFBhdGgKKyAgICAgKgorICAgICAqIEBzZWUgVG9rZW5pemVkUGF0aAorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgcGF0aCB0byBtYXRjaCwgYXMgYSBTdHJpbmcuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYWdhaW5zdCB0aGUgc3RyaW5nLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXRoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7CisgICAgICAgIFN0cmluZ1tdIHBhdERpcnMgPSB0b2tlbml6ZVBhdGhBc0FycmF5KHBhdHRlcm4pOworICAgICAgICByZXR1cm4gbWF0Y2hQYXRoKHBhdERpcnMsIHRva2VuaXplUGF0aEFzQXJyYXkoc3RyKSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgYSBnaXZlbiBwYXR0ZXJuLgorICAgICAqCisgICAgICogSWYgeW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lCisgICAgICogcGF0dGVybiB5b3Ugc2hvdWxkIHJhdGhlciB1c2UgVG9rZW5pemVkUGF0dGVybgorICAgICAqCisgICAgICogQHNlZSBUb2tlbml6ZWRQYXR0ZXJuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBwYXRoIHRvIG1hdGNoLCBhcyBhIFN0cmluZy4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIFdoZXRoZXIgb3Igbm90IG1hdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vuc2l0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYWdhaW5zdCB0aGUgc3RyaW5nLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXRoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgU3RyaW5nW10gcGF0RGlycyA9IHRva2VuaXplUGF0aEFzQXJyYXkocGF0dGVybik7CisgICAgICAgIHJldHVybiBtYXRjaFBhdGgocGF0RGlycywgdG9rZW5pemVQYXRoQXNBcnJheShzdHIpLCBpc0Nhc2VTZW5zaXRpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcmUgaW1wbGVtZW50YXRpb24gb2YgbWF0Y2hQYXRoLiAgSXQgaXMgaXNvbGF0ZWQgc28gdGhhdCBpdAorICAgICAqIGNhbiBiZSBjYWxsZWQgZnJvbSBUb2tlbml6ZWRQYXR0ZXJuLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0aChTdHJpbmdbXSB0b2tlbml6ZWRQYXR0ZXJuLCBTdHJpbmdbXSBzdHJEaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgcGF0SWR4RW5kID0gdG9rZW5pemVkUGF0dGVybi5sZW5ndGggLSAxOworICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgc3RySWR4RW5kID0gc3RyRGlycy5sZW5ndGggLSAxOworCisgICAgICAgIC8vIHVwIHRvIGZpcnN0ICcqKicKKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0IDw9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXREaXIgPSB0b2tlbml6ZWRQYXR0ZXJuW3BhdElkeFN0YXJ0XTsKKyAgICAgICAgICAgIGlmIChwYXREaXIuZXF1YWxzKERFRVBfVFJFRV9NQVRDSCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWF0Y2gocGF0RGlyLCBzdHJEaXJzW3N0cklkeFN0YXJ0XSwgaXNDYXNlU2Vuc2l0aXZlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7CisgICAgICAgICAgICBzdHJJZHhTdGFydCsrOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgeworICAgICAgICAgICAgLy8gU3RyaW5nIGlzIGV4aGF1c3RlZAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0b2tlbml6ZWRQYXR0ZXJuW2ldLmVxdWFscyhERUVQX1RSRUVfTUFUQ0gpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwYXRJZHhTdGFydCA+IHBhdElkeEVuZCkgeworICAgICAgICAgICAgICAgIC8vIFN0cmluZyBub3QgZXhoYXVzdGVkLCBidXQgcGF0dGVybiBpcy4gRmFpbHVyZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB1cCB0byBsYXN0ICcqKicKKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0IDw9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXREaXIgPSB0b2tlbml6ZWRQYXR0ZXJuW3BhdElkeEVuZF07CisgICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscyhERUVQX1RSRUVfTUFUQ0gpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoKHBhdERpciwgc3RyRGlyc1tzdHJJZHhFbmRdLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0SWR4RW5kLS07CisgICAgICAgICAgICBzdHJJZHhFbmQtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIC8vIFN0cmluZyBpcyBleGhhdXN0ZWQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghdG9rZW5pemVkUGF0dGVybltpXS5lcXVhbHMoREVFUF9UUkVFX01BVENIKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocGF0SWR4U3RhcnQgIT0gcGF0SWR4RW5kICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgeworICAgICAgICAgICAgaW50IHBhdElkeFRtcCA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0ICsgMTsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZWRQYXR0ZXJuW2ldLmVxdWFscyhERUVQX1RSRUVfTUFUQ0gpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdElkeFRtcCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRJZHhUbXAgPT0gcGF0SWR4U3RhcnQgKyAxKSB7CisgICAgICAgICAgICAgICAgLy8gJyoqLyoqJyBzaXR1YXRpb24sIHNvIHNraXAgb25lCisgICAgICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhdHRlcm4gYmV0d2VlbiBwYWRJZHhTdGFydCAmIHBhZElkeFRtcCBpbiBzdHIgYmV0d2VlbgorICAgICAgICAgICAgLy8gc3RySWR4U3RhcnQgJiBzdHJJZHhFbmQKKyAgICAgICAgICAgIGludCBwYXRMZW5ndGggPSAocGF0SWR4VG1wIC0gcGF0SWR4U3RhcnQgLSAxKTsKKyAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kIC0gc3RySWR4U3RhcnQgKyAxKTsKKyAgICAgICAgICAgIGludCBmb3VuZElkeCA9IC0xOworICAgICAgICAgICAgc3RyTG9vcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViUGF0ID0gdG9rZW5pemVkUGF0dGVybltwYXRJZHhTdGFydCArIGogKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlN0ciA9IHN0ckRpcnNbc3RySWR4U3RhcnQgKyBpICsgal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2goc3ViUGF0LCBzdWJTdHIsIGlzQ2FzZVNlbnNpdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZElkeCA9IHN0cklkeFN0YXJ0ICsgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvdW5kSWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRJZHhTdGFydCA9IHBhdElkeFRtcDsKKyAgICAgICAgICAgIHN0cklkeFN0YXJ0ID0gZm91bmRJZHggKyBwYXRMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghdG9rZW5pemVkUGF0dGVybltpXS5lcXVhbHMoREVFUF9UUkVFX01BVENIKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGEgc3RyaW5nIG1hdGNoZXMgYWdhaW5zdCBhIHBhdHRlcm4uCisgICAgICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gdHdvIHNwZWNpYWwgY2hhcmFjdGVyczo8YnI+CisgICAgICogJyonIG1lYW5zIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzPGJyPgorICAgICAqICc/JyBtZWFucyBvbmUgYW5kIG9ubHkgb25lIGNoYXJhY3RlcgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgc3RyaW5nIHdoaWNoIG11c3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBwYXR0ZXJuLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGF0dGVybiwKKyAgICAgKiAgICAgICAgIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBtYXRjaChwYXR0ZXJuLCBzdHIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGEgc3RyaW5nIG1hdGNoZXMgYWdhaW5zdCBhIHBhdHRlcm4uCisgICAgICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gdHdvIHNwZWNpYWwgY2hhcmFjdGVyczo8YnI+CisgICAgICogJyonIG1lYW5zIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzPGJyPgorICAgICAqICc/JyBtZWFucyBvbmUgYW5kIG9ubHkgb25lIGNoYXJhY3RlcgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgc3RyaW5nIHdoaWNoIG11c3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBwYXR0ZXJuLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIFdoZXRoZXIgb3Igbm90IG1hdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vuc2l0aXZlbHkuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0cmluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBhdHRlcm4sCisgICAgICogICAgICAgICBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIGNoYXJbXSBwYXRBcnIgPSBwYXR0ZXJuLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJbXSBzdHJBcnIgPSBzdHIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHBhdElkeEVuZCA9IHBhdEFyci5sZW5ndGggLSAxOworICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgc3RySWR4RW5kID0gc3RyQXJyLmxlbmd0aCAtIDE7CisgICAgICAgIGNoYXIgY2g7CisKKyAgICAgICAgYm9vbGVhbiBjb250YWluc1N0YXIgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRBcnIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gPT0gJyonKSB7CisgICAgICAgICAgICAgICAgY29udGFpbnNTdGFyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udGFpbnNTdGFyKSB7CisgICAgICAgICAgICAvLyBObyAnKidzLCBzbyB3ZSBtYWtlIGEgc2hvcnRjdXQKKyAgICAgICAgICAgIGlmIChwYXRJZHhFbmQgIT0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBQYXR0ZXJuIGFuZCBzdHJpbmcgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltpXTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbnQoY2FzZVNlbnNpdGl2ZSwgY2gsIHN0ckFycltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gU3RyaW5nIG1hdGNoZXMgYWdhaW5zdCBwYXR0ZXJuCisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0SWR4RW5kID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBQYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonLCB3aGljaCBtYXRjaGVzIGFueXRoaW5nCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIGNoYXJhY3RlcnMgYmVmb3JlIGZpcnN0IHN0YXIKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0XTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnKicgfHwgc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCAhPSAnPycpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW50KGNhc2VTZW5zaXRpdmUsIGNoLCBzdHJBcnJbc3RySWR4U3RhcnRdKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIENoYXJhY3RlciBtaXNtYXRjaAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7CisgICAgICAgICAgICBzdHJJZHhTdGFydCsrOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgeworICAgICAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZQorICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCisgICAgICAgICAgICByZXR1cm4gYWxsU3RhcnMocGF0QXJyLCBwYXRJZHhTdGFydCwgcGF0SWR4RW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgY2hhcmFjdGVycyBhZnRlciBsYXN0IHN0YXIKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGNoID0gcGF0QXJyW3BhdElkeEVuZF07CisgICAgICAgICAgICBpZiAoY2ggPT0gJyonIHx8IHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVudChjYXNlU2Vuc2l0aXZlLCBjaCwgc3RyQXJyW3N0cklkeEVuZF0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0SWR4RW5kLS07CisgICAgICAgICAgICBzdHJJZHhFbmQtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUKKyAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgorICAgICAgICAgICAgcmV0dXJuIGFsbFN0YXJzKHBhdEFyciwgcGF0SWR4U3RhcnQsIHBhdElkeEVuZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHBhdHRlcm4gYmV0d2VlbiBzdGFycy4gcGFkSWR4U3RhcnQgYW5kIHBhdElkeEVuZCBwb2ludAorICAgICAgICAvLyBhbHdheXMgdG8gYSAnKicuCisgICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCAhPSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICBpbnQgcGF0SWR4VG1wID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQgKyAxOyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0SWR4VG1wID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhdElkeFRtcCA9PSBwYXRJZHhTdGFydCArIDEpIHsKKyAgICAgICAgICAgICAgICAvLyBUd28gc3RhcnMgbmV4dCB0byBlYWNoIG90aGVyLCBza2lwIHRoZSBmaXJzdCBvbmUuCisgICAgICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhdHRlcm4gYmV0d2VlbiBwYWRJZHhTdGFydCAmIHBhZElkeFRtcCBpbiBzdHIgYmV0d2VlbgorICAgICAgICAgICAgLy8gc3RySWR4U3RhcnQgJiBzdHJJZHhFbmQKKyAgICAgICAgICAgIGludCBwYXRMZW5ndGggPSAocGF0SWR4VG1wIC0gcGF0SWR4U3RhcnQgLSAxKTsKKyAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kIC0gc3RySWR4U3RhcnQgKyAxKTsKKyAgICAgICAgICAgIGludCBmb3VuZElkeCA9IC0xOworICAgICAgICAgICAgc3RyTG9vcDoKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltwYXRJZHhTdGFydCArIGogKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc/JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVudChjYXNlU2Vuc2l0aXZlLCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyQXJyW3N0cklkeFN0YXJ0ICsgaSArIGpdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3VuZElkeCA9IHN0cklkeFN0YXJ0ICsgaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvdW5kSWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRJZHhTdGFydCA9IHBhdElkeFRtcDsKKyAgICAgICAgICAgIHN0cklkeFN0YXJ0ID0gZm91bmRJZHggKyBwYXRMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlIGxlZnQKKyAgICAgICAgLy8gaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgorICAgICAgICByZXR1cm4gYWxsU3RhcnMocGF0QXJyLCBwYXRJZHhTdGFydCwgcGF0SWR4RW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFsbFN0YXJzKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGNoYXJzW2ldICE9ICcqJykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpZmZlcmVudCgKKyAgICAgICAgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBjaGFyIGNoLCBjaGFyIG90aGVyKSB7CisgICAgICAgIHJldHVybiBjYXNlU2Vuc2l0aXZlCisgICAgICAgICAgICA/IGNoICE9IG90aGVyCisgICAgICAgICAgICA6IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCkgIT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCcmVha3MgYSBwYXRoIHVwIGludG8gYSBWZWN0b3Igb2YgcGF0aCBlbGVtZW50cywgdG9rZW5pemluZyBvbgorICAgICAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdG9rZW5pemUuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIFZlY3RvciBvZiBwYXRoIGVsZW1lbnRzIGZyb20gdGhlIHRva2VuaXplZCBwYXRoCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvciB0b2tlbml6ZVBhdGggKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiB0b2tlbml6ZVBhdGgocGF0aCwgRmlsZS5zZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJyZWFrcyBhIHBhdGggdXAgaW50byBhIFZlY3RvciBvZiBwYXRoIGVsZW1lbnRzLCB0b2tlbml6aW5nIG9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRva2VuaXplLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIHRoZSBzZXBhcmF0b3IgYWdhaW5zdCB3aGljaCB0byB0b2tlbml6ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBWZWN0b3Igb2YgcGF0aCBlbGVtZW50cyBmcm9tIHRoZSB0b2tlbml6ZWQgcGF0aAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeworICAgICAgICAgICAgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIKKyAgICB9KQorICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yIHRva2VuaXplUGF0aCAoU3RyaW5nIHBhdGgsIFN0cmluZyBzZXBhcmF0b3IpIHsKKyAgICAgICAgVmVjdG9yIHJldCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaWYgKEZpbGVVdGlscy5pc0Fic29sdXRlUGF0aChwYXRoKSkgeworICAgICAgICAgICAgU3RyaW5nW10gcyA9IEZJTEVfVVRJTFMuZGlzc2VjdChwYXRoKTsKKyAgICAgICAgICAgIHJldC5hZGQoc1swXSk7CisgICAgICAgICAgICBwYXRoID0gc1sxXTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsIHNlcGFyYXRvcik7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHJldC5hZGRFbGVtZW50KHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICN0b2tlbml6ZVBhdGggdG9rZW5pemVQYXRofSBidXQgaG9wZWZ1bGx5IGZhc3Rlci4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemVQYXRoQXNBcnJheShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgcm9vdCA9IG51bGw7CisgICAgICAgIGlmIChGaWxlVXRpbHMuaXNBYnNvbHV0ZVBhdGgocGF0aCkpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBGSUxFX1VUSUxTLmRpc3NlY3QocGF0aCk7CisgICAgICAgICAgICByb290ID0gc1swXTsKKyAgICAgICAgICAgIHBhdGggPSBzWzFdOworICAgICAgICB9CisgICAgICAgIGNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBpbnQgbGVuID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgbGVuOyBwb3MrKykgeworICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KHBvcykgPT0gc2VwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcyAhPSBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFydCA9IHBvcyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiAhPSBzdGFydCkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBsID0gbmV3IFN0cmluZ1tjb3VudCArICgocm9vdCA9PSBudWxsKSA/IDAgOiAxKV07CisKKyAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbFswXSA9IHJvb3Q7CisgICAgICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBsZW47IHBvcysrKSB7CisgICAgICAgICAgICBpZiAocGF0aC5jaGFyQXQocG9zKSA9PSBzZXApIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zICE9IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2sgPSBwYXRoLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgbFtjb3VudCsrXSA9IHRvazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwb3MgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsZW4gIT0gc3RhcnQpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2sgPSBwYXRoLnN1YnN0cmluZyhzdGFydCk7CisgICAgICAgICAgICBsW2NvdW50LyorKyovXSA9IHRvazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gb24gdGhlc2UgdHdvIGZpbGVzLiBJZiBzcmMgaGFzIGJlZW4KKyAgICAgKiBtb2RpZmllZCBsYXRlciB0aGFuIHRhcmdldCwgaXQgcmV0dXJucyB0cnVlLiBJZiB0YXJnZXQgZG9lc24ndCBleGlzdCwKKyAgICAgKiBpdCBsaWtld2lzZSByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgdGFyZ2V0IGlzIG5ld2VyIHRoYW4gc3JjIGFuZAorICAgICAqIGlzIG5vdCBvdXQgb2YgZGF0ZSwgdGh1cyB0aGUgbWV0aG9kIHJldHVybnMgZmFsc2UuIEl0IGFsc28gcmV0dXJucworICAgICAqIGZhbHNlIGlmIHRoZSBzcmMgZmlsZSBkb2Vzbid0IGV2ZW4gZXhpc3QsIHNpbmNlIGhvdyBjb3VsZCB0aGUKKyAgICAgKiB0YXJnZXQgdGhlbiBiZSBvdXQgb2YgZGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgdGhlIG9yaWdpbmFsIGZpbGUKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBmaWxlIGJlaW5nIGNvbXBhcmVkIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgdGhlIGFtb3VudCBpbiBzZWNvbmRzIG9mIHNsYWNrIHdlIHdpbGwgZ2l2ZSBpbgorICAgICAqICAgICAgICBkZXRlcm1pbmluZyBvdXQgb2YgZGF0ZW5lc3MKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHRhcmdldCBpcyBvdXQgb2YgZGF0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc091dE9mRGF0ZShGaWxlIHNyYywgRmlsZSB0YXJnZXQsIGludCBncmFudWxhcml0eSkgeworICAgICAgICBpZiAoIXNyYy5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghdGFyZ2V0LmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNyYy5sYXN0TW9kaWZpZWQoKSAtIGdyYW51bGFyaXR5KSA+IHRhcmdldC5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqICJGbGF0dGVucyIgYSBzdHJpbmcgYnkgcmVtb3ZpbmcgYWxsIHdoaXRlc3BhY2UgKHNwYWNlLCB0YWIsIGxpbmVmZWVkLAorICAgICAqIGNhcnJpYWdlIHJldHVybiwgYW5kIGZvcm1mZWVkKS4gVGhpcyB1c2VzIFN0cmluZ1Rva2VuaXplciBhbmQgdGhlCisgICAgICogZGVmYXVsdCBzZXQgb2YgdG9rZW5zIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHNpbmdsZSBhcmd1ZW1lbnQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgYSBTdHJpbmcgdG8gcmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLgorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgdGhhdCBoYXMgaGFkIGFsbCB3aGl0ZXNwYWNlIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlV2hpdGVzcGFjZShTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wdXQpOworICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3QubmV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiBhIHN0cmluZyBjb250YWlucyBzdGFycyBvciBxdWVzdGlvbiBtYXJrcworICAgICAqIEBwYXJhbSBpbnB1dCBhIFN0cmluZyB3aGljaCBvbmUgd2FudHMgdG8gdGVzdCBmb3IgY29udGFpbmluZyB3aWxkY2FyZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGF0IGxlYXN0IGEgc3RhciBvciBhIHF1ZXN0aW9uIG1hcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzV2lsZGNhcmRzKFN0cmluZyBpbnB1dCkgeworICAgICAgICByZXR1cm4gKGlucHV0LmluZGV4T2YoJyonKSAhPSAtMSB8fCBpbnB1dC5pbmRleE9mKCc/JykgIT0gLTEpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzLmphdmEgYi9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzc0YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIFRoaXMgY2xhc3MgYWxzbyBlbmNhcHN1bGF0ZXMgbWV0aG9kcyB3aGljaCBhbGxvdyBGaWxlcyB0byBiZQorICogcmVmZXJyZWQgdG8gdXNpbmcgYWJzdHJhY3QgcGF0aCBuYW1lcyB3aGljaCBhcmUgdHJhbnNsYXRlZCB0byBuYXRpdmUKKyAqIHN5c3RlbSBmaWxlIHBhdGhzIGF0IHJ1bnRpbWUgYXMgd2VsbCBhcyBjb3B5aW5nIGZpbGVzIG9yIHNldHRpbmcKKyAqIHRoZWlyIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUuCisgKgorICovCitwdWJsaWMgY2xhc3MgRmlsZVV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX1JFVFJZX1NMRUVQX01JTExJUyA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfU1BBQ0UgPSA1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgUFJJTUFSWV9JTlNUQU5DRSA9IG5ldyBGaWxlVXRpbHMoKTsKKworICAgIC8vZ2V0IHNvbWUgbm9uLWNyeXB0by1ncmFkZSByYW5kb21uZXNzIGZyb20gdmFyaW91cyBwbGFjZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgICAgICArIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OX05FVFdBUkUgPSBPcy5pc0ZhbWlseSgibmV0d2FyZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05fRE9TID0gT3MuaXNGYW1pbHkoImRvcyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05fV0lOOVggPSBPcy5pc0ZhbWlseSgid2luOXgiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OX1dJTkRPV1MgPSBPcy5pc0ZhbWlseSgid2luZG93cyIpOworCisgICAgc3RhdGljIGZpbmFsIGludCBCVUZfU0laRSA9IDgxOTI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBncmFudWxhcml0eSBvZiB0aW1lc3RhbXBzIHVuZGVyIEZBVC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkFUX0ZJTEVfVElNRVNUQU1QX0dSQU5VTEFSSVRZID0gMjAwMDsKKworICAgIC8qKgorICAgICAqIFRoZSBncmFudWxhcml0eSBvZiB0aW1lc3RhbXBzIHVuZGVyIFVuaXguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVOSVhfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFkgPSAxMDAwOworCisgICAgLyoqCisgICAgICogVGhlIGdyYW51bGFyaXR5IG9mIHRpbWVzdGFtcHMgdW5kZXIgdGhlIE5UIEZpbGUgU3lzdGVtLgorICAgICAqIE5URlMgaGFzIGEgZ3JhbnVsYXJpdHkgb2YgMTAwIG5hbm9zZWNvbmRzLCB3aGljaCBpcyBsZXNzCisgICAgICogdGhhbiAxIG1pbGxpc2Vjb25kLCBzbyB3ZSByb3VuZCB0aGlzIHVwIHRvIDEgbWlsbGlzZWNvbmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE5URlNfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFkgPSAxOworCisgICAgLyoqCisgICAgICogQSBvbmUgaXRlbSBjYWNoZSBmb3IgZnJvbVVyaS4KKyAgICAgKiBmcm9tVXJpIGlzIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IHdoZW4gcGFyc2VpbmcgYW50IGJ1aWxkCisgICAgICogZmlsZXMuIEl0IGlzIGEgY29zdGx5IG9wZXJhdGlvbi4gVGhpcyBqdXN0IGNhY2hlcyB0aGUgcmVzdWx0CisgICAgICogb2YgdGhlIGxhc3QgY2FsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBjYWNoZUZyb21VcmlMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgU3RyaW5nIGNhY2hlRnJvbVVyaVJlcXVlc3QgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGNhY2hlRnJvbVVyaVJlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBGaWxlVXRpbHMuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICAgICAqICAgICAgICAgICAgIFVzZSBnZXRGaWxlVXRpbHMgaW5zdGVhZCwKKyAgICAgKiBGaWxlVXRpbHMgZG8gbm90IGhhdmUgc3RhdGUuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIEZpbGVVdGlscyBuZXdGaWxlVXRpbHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZVV0aWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIHJldHJpZXZlIFRoZSBGaWxlVXRpbHMsIHdoaWNoIGlzIHNoYXJlZCBieSBhbGwgdXNlcnMgb2YgdGhpcworICAgICAqIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIEZpbGVVdGlscy4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlVXRpbHMgZ2V0RmlsZVV0aWxzKCkgeworICAgICAgICByZXR1cm4gUFJJTUFSWV9JTlNUQU5DRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZVV0aWxzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSByZXByZXNlbnRzIGFuIGFic29sdXRlIHBhdGguCisgICAgICogRGlmZmVycyBmcm9tIG5ldyBqYXZhLmlvLkZpbGUoImZpbGVuYW1lIikuaXNBYnNvbHV0ZSgpIGluIHRoYXQgYSBwYXRoCisgICAgICogYmVnaW5uaW5nIHdpdGggYSBkb3VibGUgZmlsZSBzZXBhcmF0b3ItLXNpZ25pZnlpbmcgYSBXaW5kb3dzIFVOQy0tbXVzdAorICAgICAqIGF0IG1pbmltdW0gbWF0Y2ggIlxcYVxiIiB0byBiZSBjb25zaWRlcmVkIGFuIGFic29sdXRlIHBhdGguCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGZpbGVuYW1lIGlzIG51bGwuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlUGF0aChTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCcvJywgc2VwKS5yZXBsYWNlKCdcXCcsIHNlcCk7CisgICAgICAgIGNoYXIgYyA9IGZpbGVuYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgaWYgKCEoT05fRE9TIHx8IE9OX05FVFdBUkUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGMgPT0gc2VwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSBzZXApIHsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICBpZiAoIShPTl9ET1MgJiYgbGVuID4gNCAmJiBmaWxlbmFtZS5jaGFyQXQoMSkgPT0gc2VwKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgICAgIGludCBuZXh0c2VwID0gZmlsZW5hbWUuaW5kZXhPZihzZXAsIDIpOworICAgICAgICAgICAgcmV0dXJuIG5leHRzZXAgPiAyICYmIG5leHRzZXAgKyAxIDwgbGVuOworICAgICAgICB9CisgICAgICAgIGludCBjb2xvbiA9IGZpbGVuYW1lLmluZGV4T2YoJzonKTsKKyAgICAgICAgcmV0dXJuIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgJiYgY29sb24gPT0gMQorICAgICAgICAgICAgICAgICYmIGZpbGVuYW1lLmxlbmd0aCgpID4gMiAmJiBmaWxlbmFtZS5jaGFyQXQoMikgPT0gc2VwKQorICAgICAgICAgICAgICAgIHx8IChPTl9ORVRXQVJFICYmIGNvbG9uID4gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzc2VjdCB0aGUgc3BlY2lmaWVkIGFic29sdXRlIHBhdGguCisgICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gZGlzc2VjdC4KKyAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIHtyb290LCByZW1haW5pbmcgcGF0aH0uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcGF0aCBpcyBudWxsLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGRpc3NlY3QoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy8nLCBzZXApLnJlcGxhY2UoJ1xcJywgc2VwKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYXJlIGRlYWxpbmcgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoCisgICAgICAgIGlmICghaXNBYnNvbHV0ZVBhdGgocGF0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihwYXRoICsgIiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByb290ID0gbnVsbDsKKyAgICAgICAgaW50IGNvbG9uID0gcGF0aC5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChjb2xvbiA+IDAgJiYgKE9OX0RPUyB8fCBPTl9ORVRXQVJFKSkgeworCisgICAgICAgICAgICBpbnQgbmV4dCA9IGNvbG9uICsgMTsKKyAgICAgICAgICAgIHJvb3QgPSBwYXRoLnN1YnN0cmluZygwLCBuZXh0KTsKKyAgICAgICAgICAgIGNoYXJbXSBjYSA9IHBhdGgudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIHJvb3QgKz0gc2VwOworICAgICAgICAgICAgLy9yZW1vdmUgdGhlIGluaXRpYWwgc2VwYXJhdG9yOyB0aGUgcm9vdCBoYXMgaXQuCisgICAgICAgICAgICBuZXh0ID0gKGNhW25leHRdID09IHNlcCkgPyBuZXh0ICsgMSA6IG5leHQ7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYlBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAvLyBFbGltaW5hdGUgY29uc2VjdXRpdmUgc2xhc2hlcyBhZnRlciB0aGUgZHJpdmUgc3BlYzoKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuZXh0OyBpIDwgY2EubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FbaV0gIT0gc2VwIHx8IGNhW2kgLSAxXSAhPSBzZXApIHsKKyAgICAgICAgICAgICAgICAgICAgc2JQYXRoLmFwcGVuZChjYVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0aCA9IHNiUGF0aC50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgaWYgKHBhdGgubGVuZ3RoKCkgPiAxICYmIHBhdGguY2hhckF0KDEpID09IHNlcCkgeworICAgICAgICAgICAgLy8gVU5DIGRyaXZlCisgICAgICAgICAgICBpbnQgbmV4dHNlcCA9IHBhdGguaW5kZXhPZihzZXAsIDIpOworICAgICAgICAgICAgbmV4dHNlcCA9IHBhdGguaW5kZXhPZihzZXAsIG5leHRzZXAgKyAxKTsKKyAgICAgICAgICAgIHJvb3QgPSAobmV4dHNlcCA+IDIpID8gcGF0aC5zdWJzdHJpbmcoMCwgbmV4dHNlcCArIDEpIDogcGF0aDsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJvb3QgPSBGaWxlLnNlcGFyYXRvcjsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtyb290LCBwYXRofTsKKyAgICB9CisKK30K