ZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC8ub3V0cHV0LmNyYyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC8ub3V0cHV0LmNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk5NWFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0Ly5vdXRwdXQuY3JjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9CcmlkZ2VQYXRoIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L0JyaWRnZVBhdGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTBmMGE4YQotLS0gL2Rldi9udWxsCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9CcmlkZ2VQYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9DeWNsZVBhdGggYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS9yZXN1bHQvQ3ljbGVQYXRoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkNTBkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS9yZXN1bHQvQ3ljbGVQYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9Mb25nUGF0aCBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9Mb25nUGF0aApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTA0MGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L0xvbmdQYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9QYXRoIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L1BhdGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzZiMWEwZQotLS0gL2Rldi9udWxsCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9QYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9TaW1wbGVQYXRoIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L1NpbXBsZVBhdGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGZhYmM0MwotLS0gL2Rldi9udWxsCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9TaW1wbGVQYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9TaW5nbGVQYXRoIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L1NpbmdsZVBhdGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjMyOWFhNgotLS0gL2Rldi9udWxsCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9TaW5nbGVQYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9UaHJlZUttZXIgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS9yZXN1bHQvVGhyZWVLbWVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwNDM1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS9yZXN1bHQvVGhyZWVLbWVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9UcmVlUGF0aCBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9UcmVlUGF0aApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYzhkMTZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L1RyZWVQYXRoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9Ud29LbWVyIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvcmVzdWx0L1R3b0ttZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMwMjRkYgotLS0gL2Rldi9udWxsCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3Jlc3VsdC9Ud29LbWVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3dlYm1hcC9yZWR1Y2Utb3V0IGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvd2VibWFwL3JlZHVjZS1vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyNjZiZTUuLjAwMDAwMDAKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvd2VibWFwL3JlZHVjZS1vdXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS93ZWJtYXAvc2VxdWVuY2VTaG9ydEZpbGVNZXJnZVRlc3QgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS93ZWJtYXAvc2VxdWVuY2VTaG9ydEZpbGVNZXJnZVRlc3QKaW5kZXggZWRkMWU1OS4uOTZmN2ZjOSAxMDA3NTUKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvd2VibWFwL3NlcXVlbmNlU2hvcnRGaWxlTWVyZ2VUZXN0CisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9kYXRhL3dlYm1hcC9zZXF1ZW5jZVNob3J0RmlsZU1lcmdlVGVzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS93ZWJtYXAvdGVzdC5kYXQgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvZGF0YS93ZWJtYXAvdGVzdC5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmE0ZjQuLjAwMDAwMDAKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L2RhdGEvd2VibWFwL3Rlc3QuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0GIBEKLQcgIgotGyBECi0tIIgKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiNjc4NC4uMDAwMDAwMAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0JpbmFyeUxvYWRHcmFwaElucHV0Rm9ybWF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1wYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXg7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLQotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgudHlwZS5LbWVyQ291bnRWYWx1ZTsKLWltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuZ3JhcGguVmVydGV4OwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5pby5WZXJ0ZXhSZWFkZXI7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLnV0aWwuQnNwVXRpbHM7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvLk1lc3NhZ2VXcml0YWJsZTsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmFwaS5pby5iaW5hcnkuQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQ7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5hcGkuaW8uYmluYXJ5LkJpbmFyeVZlcnRleElucHV0Rm9ybWF0LkJpbmFyeVZlcnRleFJlYWRlcjsKLQotcHVibGljIGNsYXNzIEJpbmFyeUxvYWRHcmFwaElucHV0Rm9ybWF0IGV4dGVuZHMKLQlCaW5hcnlWZXJ0ZXhJbnB1dEZvcm1hdDxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTWVzc2FnZVdyaXRhYmxlPnsKLQlzdGF0aWMgaW50IG51bWJlciA9IDA7Ci0JLyoqCi0JICogRm9ybWF0IElOUFVUCi0JICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZlcnRleFJlYWRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTWVzc2FnZVdyaXRhYmxlPiBjcmVhdGVWZXJ0ZXhSZWFkZXIoCi0gICAgICAgICAgICBJbnB1dFNwbGl0IHNwbGl0LCBUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAJdHJ5ewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oInNwbGl0OiAiICArIG51bWJlcisrICsgIiBsZW5ndGg6Iisgc3BsaXQuZ2V0TGVuZ3RoKCkpOwotICAgIAl9Y2F0Y2ggKEV4Y2VwdGlvbiBleCl7Ci0gICAgCQkKLSAgICAJfQotICAgICAgICByZXR1cm4gbmV3IEJpbmFyeUxvYWRHcmFwaFJlYWRlcihiaW5hcnlJbnB1dEZvcm1hdC5jcmVhdGVSZWNvcmRSZWFkZXIoc3BsaXQsIGNvbnRleHQpKTsKLSAgICB9CQotfQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotY2xhc3MgQmluYXJ5TG9hZEdyYXBoUmVhZGVyIGV4dGVuZHMKLSAgICAgICAgQmluYXJ5VmVydGV4UmVhZGVyPEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCBNZXNzYWdlV3JpdGFibGU+IHsKLSAgICBwcml2YXRlIFZlcnRleCB2ZXJ0ZXg7Ci0gICAgcHJpdmF0ZSBCeXRlc1dyaXRhYmxlIHZlcnRleElkID0gbmV3IEJ5dGVzV3JpdGFibGUoKTsKLSAgICBwcml2YXRlIEJ5dGVXcml0YWJsZSB2ZXJ0ZXhWYWx1ZSA9IG5ldyBCeXRlV3JpdGFibGUoKTsKLQotICAgIHB1YmxpYyBCaW5hcnlMb2FkR3JhcGhSZWFkZXIoUmVjb3JkUmVhZGVyPEJ5dGVzV3JpdGFibGUsS21lckNvdW50VmFsdWU+IHJlY29yZFJlYWRlcikgewotICAgICAgICBzdXBlcihyZWNvcmRSZWFkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG5leHRWZXJ0ZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFJlY29yZFJlYWRlcigpLm5leHRLZXlWYWx1ZSgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWZXJ0ZXg8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT4gZ2V0Q3VycmVudFZlcnRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZlcnRleCA9PSBudWxsKQotICAgICAgICAgICAgdmVydGV4ID0gKFZlcnRleCkgQnNwVXRpbHMuY3JlYXRlVmVydGV4KGdldENvbnRleHQoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCi0gICAgICAgIHZlcnRleC5nZXRNc2dMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgdmVydGV4LmdldEVkZ2VzKCkuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIHZlcnRleC5yZXNldCgpOwotICAgICAgICBpZihnZXRSZWNvcmRSZWFkZXIoKSAhPSBudWxsKXsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogc2V0IHRoZSBzcmMgdmVydGV4IGlkCi0gICAgICAgICAgICAgKi8KLSAgICAJCXZlcnRleElkLnNldChnZXRSZWNvcmRSZWFkZXIoKS5nZXRDdXJyZW50S2V5KCkpOwotICAgIAkJdmVydGV4LnNldFZlcnRleElkKHZlcnRleElkKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogc2V0IHRoZSB2ZXJ0ZXggdmFsdWUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgS21lckNvdW50VmFsdWUga21lckNvdW50VmFsdWUgPSBnZXRSZWNvcmRSZWFkZXIoKS5nZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgICAgIHZlcnRleFZhbHVlLnNldChrbWVyQ291bnRWYWx1ZS5nZXRBZGpCaXRNYXAoKSk7IAotICAgICAgICAgICAgdmVydGV4LnNldFZlcnRleFZhbHVlKHZlcnRleFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHZlcnRleDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0JpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9CaW5hcnlMb2FkR3JhcGhPdXRwdXRGb3JtYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMTNiOC4uMDAwMDAwMAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0JpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci0KLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmFwaS5pby5iaW5hcnkuQmluYXJ5VmVydGV4T3V0cHV0Rm9ybWF0OwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5ncmFwaC5WZXJ0ZXg7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmlvLlZlcnRleFdyaXRlcjsKLQotcHVibGljIGNsYXNzIEJpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdCBleHRlbmRzIAotCUJpbmFyeVZlcnRleE91dHB1dEZvcm1hdDxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZT4gewotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmVydGV4V3JpdGVyPEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlPiBjcmVhdGVWZXJ0ZXhXcml0ZXIoVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlPiByZWNvcmRXcml0ZXIgPSBiaW5hcnlPdXRwdXRGb3JtYXQuZ2V0UmVjb3JkV3JpdGVyKGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIocmVjb3JkV3JpdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNpbXBsZSBWZXJ0ZXhXcml0ZXIgdGhhdCBzdXBwb3J0cyB7QGxpbmsgQmluYXJ5TG9hZEdyYXBoVmVydGV4fQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5hcnlMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIgZXh0ZW5kcwotICAgICAgICAgICAgICAgIEJpbmFyeVZlcnRleFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZT4gewotICAgICAgICAgICAgcHVibGljIEJpbmFyeUxvYWRHcmFwaFZlcnRleFdyaXRlcihSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlPiBsaW5lUmVjb3JkV3JpdGVyKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIobGluZVJlY29yZFdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGVWZXJ0ZXgoVmVydGV4PEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCA/PiB2ZXJ0ZXgpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGdldFJlY29yZFdyaXRlcigpLndyaXRlKHZlcnRleC5nZXRWZXJ0ZXhJZCgpLHZlcnRleC5nZXRWZXJ0ZXhWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9HcmFwaFZlcnRleE9wZXJhdGlvbi5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9HcmFwaFZlcnRleE9wZXJhdGlvbi5qYXZhCmluZGV4IDBjOTQ1MTIuLmM4YWVhN2MgMTAwNjQ0Ci0tLSBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvR3JhcGhWZXJ0ZXhPcGVyYXRpb24uamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0dyYXBoVmVydGV4T3BlcmF0aW9uLmphdmEKQEAgLTEsNyArMSw2IEBACiBwYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXg7CiAKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CkBAIC0xNywzMyArMTYsNDkgQEAKIAogaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgudHlwZS5LbWVyOwogaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgudHlwZS5LbWVyVXRpbDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LlNlcXVlbmNlRmlsZS5HZW5lcmF0ZVNlcXVlbmNlRmlsZTsKIGltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmJpdHdpc2UuQml0d2lzZU9wZXJhdGlvbjsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuaW8uTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5pby5NZXNzYWdlV3JpdGFibGU7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvLlZhbHVlU3RhdGVXcml0YWJsZTsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmhkZnMuSERGU09wZXJhdGlvbjsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLkxvZ0FsZ29yaXRobU1lc3NhZ2VXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLk1lc3NhZ2VXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLlZhbHVlU3RhdGVXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnNlcXVlbmNlZmlsZS5HZW5lcmF0ZVNlcXVlbmNlRmlsZTsKIAogcHVibGljIGNsYXNzIEdyYXBoVmVydGV4T3BlcmF0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrID0gMzsgLy9rbWVyLCBrOiB0aGUgbGVuZ3RoIG9mIGttZXIKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrID0gNTsgLy9rbWVyLCBrOiB0aGUgbGVuZ3RoIG9mIGttZXIKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1CeXRlcyA9IChHcmFwaFZlcnRleE9wZXJhdGlvbi5rLTEpLzQgKyAxOwogCXN0YXRpYyBwcml2YXRlIGZpbmFsIFBhdGggVE1QX0RJUiA9IG5ldyBQYXRoKAogCQkJR2VuZXJhdGVTZXF1ZW5jZUZpbGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIl9JTlRFUklNIik7CiAJLyoqCiAJICogU2luZ2xlIFZlcnRleDogaW4tZGVncmVlID0gb3V0LWRlZ3JlZSA9IDEKIAkgKiBAcGFyYW0gdmVydGV4VmFsdWUgCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0aFZlcnRleChCeXRlV3JpdGFibGUgdmVydGV4VmFsdWUpewotCQlieXRlIHZhbHVlID0gdmVydGV4VmFsdWUuZ2V0KCk7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0aFZlcnRleChieXRlIHZhbHVlKXsKIAkJaWYoS21lclV0aWwuaW5EZWdyZWUodmFsdWUpID09IDEgJiYgS21lclV0aWwub3V0RGVncmVlKHZhbHVlKSA9PSAxKQogCQkJcmV0dXJuIHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJLyoqIAorCSAqIEhlYWQgVmVydGV4OiAgb3V0LWRlZ3JlZSA+IDAsIAorCSAqIEBwYXJhbSB2ZXJ0ZXhWYWx1ZSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIZWFkVmVydGV4KGJ5dGUgdmFsdWUpeworCQlpZihLbWVyVXRpbC5vdXREZWdyZWUodmFsdWUpID4gMCAmJiAhaXNQYXRoVmVydGV4KHZhbHVlKSkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qKgorCSAqIFJlYXIgVmVydGV4OiAgaW4tZGVncmVlID4gMCwgCisJICogQHBhcmFtIHZlcnRleFZhbHVlIAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYXJWZXJ0ZXgoYnl0ZSB2YWx1ZSl7CisJCWlmKEttZXJVdGlsLmluRGVncmVlKHZhbHVlKSA+IDAgJiYgIWlzUGF0aFZlcnRleCh2YWx1ZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiogCiAJICogSGVhZCBWZXJ0ZXg6ICBpbi1kZWdyZWUgIT0gMSwgb3V0LWRlZ3JlZSA9IDEsIAogCSAqIEBwYXJhbSB2ZXJ0ZXhWYWx1ZSAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIZWFkKEJ5dGVXcml0YWJsZSB2ZXJ0ZXhWYWx1ZSl7Ci0JCWJ5dGUgdmFsdWUgPSB2ZXJ0ZXhWYWx1ZS5nZXQoKTsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIZWFkKGJ5dGUgdmFsdWUpewogCQlpZihLbWVyVXRpbC5pbkRlZ3JlZSh2YWx1ZSkgIT0gMSAmJiBLbWVyVXRpbC5vdXREZWdyZWUodmFsdWUpID09IDEpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNTIsOCArNjcsNyBAQAogCSAqIFJlYXIgVmVydGV4OiAgaW4tZGVncmVlID0gMSwgb3V0LWRlZ3JlZSAhPSAxLCAKIAkgKiBAcGFyYW0gdmVydGV4VmFsdWUgCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhcihCeXRlV3JpdGFibGUgdmVydGV4VmFsdWUpewotCQlieXRlIHZhbHVlID0gdmVydGV4VmFsdWUuZ2V0KCk7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhcihieXRlIHZhbHVlKXsKIAkJaWYoS21lclV0aWwuaW5EZWdyZWUodmFsdWUpID09IDEgJiYgS21lclV0aWwub3V0RGVncmVlKHZhbHVlKSAhPSAxKQogCQkJcmV0dXJuIHRydWU7CiAJCXJldHVybiBmYWxzZTsKQEAgLTI1NywxMyArMjcxLDE4IEBACiAJICogdXBkYXRlIHJpZ2h0IG5laWdoYmVyCiAJICovCiAJcHVibGljIHN0YXRpYyBieXRlIHVwZGF0ZVJpZ2h0TmVpZ2hiZXIoYnl0ZSBvbGRWZXJ0ZXhWYWx1ZSwgYnl0ZSBuZXdWZXJ0ZXhWYWx1ZSl7Ci0JCXJldHVybiBCaXR3aXNlT3BlcmF0aW9uLnJlcGxhY2VMYXN0Rm91ckJpdHMob2xkVmVydGV4VmFsdWUsIG5ld1ZlcnRleFZhbHVlKTsKKwkJcmV0dXJuIChieXRlKSAoKGJ5dGUpKG9sZFZlcnRleFZhbHVlICYgMHhGMCkgfCAoYnl0ZSkgKG5ld1ZlcnRleFZhbHVlICYgMHgwRikpOwogCX0KIAkvKioKIAkgKiB1cGRhdGUgcmlnaHQgbmVpZ2hiZXIgYmFzZWQgb24gbmV4dCB2ZXJ0ZXhJZAogCSAqLwogCXB1YmxpYyBzdGF0aWMgYnl0ZSB1cGRhdGVSaWdodE5laWdoYmVyQnlWZXJ0ZXhJZChieXRlIG9sZFZlcnRleFZhbHVlLCBieXRlW10gbmVpZ2hiZXJWZXJ0ZXhJZCl7Ci0JCVN0cmluZyBvbGRWZXJ0ZXggPSBCaXR3aXNlT3BlcmF0aW9uLmNvbnZlcnRCeXRlVG9CaW5hcnlTdHJpbmcob2xkVmVydGV4VmFsdWUpOworCQkKKwkJU3RyaW5nIG5laWdoYmVyVmVydGV4ID0gS21lci5yZWNvdmVyS21lckZyb20oR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaywgbmVpZ2hiZXJWZXJ0ZXhJZCwgMCwgbmVpZ2hiZXJWZXJ0ZXhJZC5sZW5ndGgpOworCQkKKwkJYnl0ZSBuZXdCaXQgPSBLbWVyLkdFTkVfQ09ERS5nZXRBZGpCaXQoKGJ5dGUpbmVpZ2hiZXJWZXJ0ZXguY2hhckF0KG5laWdoYmVyVmVydGV4Lmxlbmd0aCgpIC0gMSkpOworCQlyZXR1cm4gKGJ5dGUpICgoYnl0ZSkob2xkVmVydGV4VmFsdWUgJiAweEYwKSB8IChieXRlKSAobmV3Qml0ICYgMHgwRikpOworCQkvKlN0cmluZyBvbGRWZXJ0ZXggPSBCaXR3aXNlT3BlcmF0aW9uLmNvbnZlcnRCeXRlVG9CaW5hcnlTdHJpbmcob2xkVmVydGV4VmFsdWUpOwogCQlTdHJpbmcgbmVpZ2hiZXIgPSBCaXR3aXNlT3BlcmF0aW9uLmNvbnZlcnRCeXRlc1RvQmluYXJ5U3RyaW5nS21lcihuZWlnaGJlclZlcnRleElkLCBrKTsKIAkJU3RyaW5nIGxhc3RUd29CaXRzID0gbmVpZ2hiZXIuc3Vic3RyaW5nKDIqay0yLDIqayk7CiAJCWlmKGxhc3RUd29CaXRzLmNvbXBhcmVUbygiMDAiKSA9PSAwKQpAQCAtMjc1LDcgKzI5NCw3IEBACiAJCWVsc2UgaWYobGFzdFR3b0JpdHMuY29tcGFyZVRvKCIxMSIpID09IDApCiAJCQlyZXR1cm4gQml0d2lzZU9wZXJhdGlvbi5jb252ZXJ0QmluYXJ5U3RyaW5nVG9CeXRlKG9sZFZlcnRleC5zdWJzdHJpbmcoMCw0KSArICIxMDAwIik7CiAJCQotCQlyZXR1cm4gKEJ5dGUpIG51bGw7CisJCXJldHVybiAoQnl0ZSkgbnVsbDsqLwogCX0KIAkvKioKIAkgKiBnZXQgcHJlY3Vyc29yIGluIHZlcnRleFZhbHVlIGZyb20gZ2VuZSBjb2RlCmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvYWRHcmFwaFZlcnRleC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Mb2FkR3JhcGhWZXJ0ZXguamF2YQppbmRleCBkOTI4NTU1Li4zYjJlZjUyIDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvYWRHcmFwaFZlcnRleC5qYXZhCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTG9hZEdyYXBoVmVydGV4LmphdmEKQEAgLTEsMjIgKzEsMTcgQEAKIHBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLlRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlJlY29yZFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0F0dGVtcHRDb250ZXh0OwogCitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5jbGllbnQuQ2xpZW50OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZm9ybWF0LkJpbmFyeUxvYWRHcmFwaElucHV0Rm9ybWF0OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZm9ybWF0LkJpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdDsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLk1lc3NhZ2VXcml0YWJsZTsKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuZ3JhcGguVmVydGV4OwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5pby5WZXJ0ZXhXcml0ZXI7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmlvLnRleHQuVGV4dFZlcnRleE91dHB1dEZvcm1hdDsKLWltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuaW8udGV4dC5UZXh0VmVydGV4T3V0cHV0Rm9ybWF0LlRleHRWZXJ0ZXhXcml0ZXI7CiBpbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmpvYi5QcmVnZWxpeEpvYjsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuY2xpZW50LkNsaWVudDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuaW8uTWVzc2FnZVdyaXRhYmxlOwogCiAvKgogICogdmVydGV4SWQ6IEJ5dGVzV3JpdGFibGUKQEAgLTQ3LDc1ICs0MiwyOSBAQAogICogVGhlIGRldGFpbHMgYWJvdXQgbWVzc2FnZSBhcmUgaW4gZWR1LnVjaS5pY3MucHJlZ2VsaXguZXhhbXBsZS5pby5NZXNzYWdlV3JpdGFibGUuIAogICovCiBwdWJsaWMgY2xhc3MgTG9hZEdyYXBoVmVydGV4IGV4dGVuZHMgVmVydGV4PEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCBNZXNzYWdlV3JpdGFibGU+ewotCQotCXByaXZhdGUgQnl0ZVdyaXRhYmxlIHRtcFZlcnRleFZhbHVlID0gbmV3IEJ5dGVXcml0YWJsZSgpOwotCQorCiAJLyoqCi0JICogRm9yIHRlc3QsIGluIGNvbXB1dGUgbWV0aG9kLCBtYWtlIGVhY2ggdmVydGV4VmFsdWUgc2hpZnQgMSB0byBsZWZ0LgotCSAqIEl0IHdpbGwgYmUgbW9kaWZpZWQgd2hlbiBnb2luZyBmb3J3YXJkIHRvIG5leHQgc3RlcC4KKwkgKiBGb3IgdGVzdCwganVzdCBvdXRwdXQgb3JpZ2luYWwgZmlsZQogCSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNvbXB1dGUoSXRlcmF0b3I8TWVzc2FnZVdyaXRhYmxlPiBtc2dJdGVyYXRvcikgewotCQlpZihnZXRTdXBlcnN0ZXAoKSA9PSAxKXsKLQkJCXRtcFZlcnRleFZhbHVlLnNldChnZXRWZXJ0ZXhWYWx1ZSgpLmdldCgpKTsKLQkJCXRtcFZlcnRleFZhbHVlLnNldCgoYnl0ZSkgKHRtcFZlcnRleFZhbHVlLmdldCgpIDw8IDEpKTsKLQkJCXNldFZlcnRleFZhbHVlKHRtcFZlcnRleFZhbHVlKTsKLQkJfQotCQllbHNlCi0JCQl2b3RlVG9IYWx0KCk7Ci0JIH0KLQkKLSAgICAvKioKLSAgICAgKiBTaW1wbGUgVmVydGV4V3JpdGVyIHRoYXQgc3VwcG9ydHMge0BsaW5rIFNpbXBsZUxvYWRHcmFwaFZlcnRleH0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUxvYWRHcmFwaFZlcnRleFdyaXRlciBleHRlbmRzCi0gICAgICAgICAgICBUZXh0VmVydGV4V3JpdGVyPEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlPiB7Ci0gICAgICAgIHB1YmxpYyBTaW1wbGVMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIoUmVjb3JkV3JpdGVyPFRleHQsIFRleHQ+IGxpbmVSZWNvcmRXcml0ZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGxpbmVSZWNvcmRXcml0ZXIpOwotICAgICAgICB9CisJCXZvdGVUb0hhbHQoKTsKKwl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVmVydGV4KFZlcnRleDxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgPz4gdmVydGV4KSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgZ2V0UmVjb3JkV3JpdGVyKCkud3JpdGUobmV3IFRleHQodmVydGV4LmdldFZlcnRleElkKCkudG9TdHJpbmcoKSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0KHZlcnRleC5nZXRWZXJ0ZXhWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBWZXJ0ZXhPdXRwdXRGb3JtYXQgdGhhdCBzdXBwb3J0cyB7QGxpbmsgU2ltcGxlTG9hZEdyYXBoVmVydGV4fQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlTG9hZEdyYXBoVmVydGV4T3V0cHV0Rm9ybWF0IGV4dGVuZHMKLSAgICAgICAgICAgIFRleHRWZXJ0ZXhPdXRwdXRGb3JtYXQ8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGU+IHsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZlcnRleFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZT4gY3JlYXRlVmVydGV4V3JpdGVyKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgUmVjb3JkV3JpdGVyPFRleHQsIFRleHQ+IHJlY29yZFdyaXRlciA9IHRleHRPdXRwdXRGb3JtYXQuZ2V0UmVjb3JkV3JpdGVyKGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIocmVjb3JkV3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQkKIAkvKioKIAkgKiBAcGFyYW0gYXJncwogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCQkvL2ZpbmFsIGludCBrID0gSW50ZWdlci5wYXJzZUludChhcmdzWzBdKTsKICAgICAgICAgUHJlZ2VsaXhKb2Igam9iID0gbmV3IFByZWdlbGl4Sm9iKExvYWRHcmFwaFZlcnRleC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwogICAgICAgICBqb2Iuc2V0VmVydGV4Q2xhc3MoTG9hZEdyYXBoVmVydGV4LmNsYXNzKTsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRleHRJbnB1dCBhbmQgVGV4dE91dHB1dAotICAgICAgICAgKi8gCi0gICAgICAgICAgam9iLnNldFZlcnRleElucHV0Rm9ybWF0Q2xhc3MoVGV4dExvYWRHcmFwaElucHV0Rm9ybWF0LmNsYXNzKTsKLSAgICAgICAgICBqb2Iuc2V0VmVydGV4T3V0cHV0Rm9ybWF0Q2xhc3MoU2ltcGxlTG9hZEdyYXBoVmVydGV4T3V0cHV0Rm9ybWF0LmNsYXNzKTsgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLyoqCiAgICAgICAgICAqIEJpbmFyeUlucHV0IGFuZCBCaW5hcnlPdXRwdXQKICAgICAgICAgICovCi0gICAgICAvKiAgam9iLnNldFZlcnRleElucHV0Rm9ybWF0Q2xhc3MoQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQuY2xhc3MpOyAKKyAgICAgICAgam9iLnNldFZlcnRleElucHV0Rm9ybWF0Q2xhc3MoQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQuY2xhc3MpOyAKICAgICAgICAgam9iLnNldFZlcnRleE91dHB1dEZvcm1hdENsYXNzKEJpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5jbGFzcyk7IAogICAgICAgICBqb2Iuc2V0T3V0cHV0S2V5Q2xhc3MoQnl0ZXNXcml0YWJsZS5jbGFzcyk7Ci0gICAgICAgIGpvYi5zZXRPdXRwdXRWYWx1ZUNsYXNzKEJ5dGVXcml0YWJsZS5jbGFzcyk7Ki8KKyAgICAgICAgam9iLnNldE91dHB1dFZhbHVlQ2xhc3MoQnl0ZVdyaXRhYmxlLmNsYXNzKTsKICAgICAgICAgQ2xpZW50LnJ1bihhcmdzLCBqb2IpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaFZlcnRleC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoVmVydGV4LmphdmEKaW5kZXggYzUyMTA3NC4uZDg0MDIwYSAxMDA2NDQKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoVmVydGV4LmphdmEKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoVmVydGV4LmphdmEKQEAgLTEsMjkgKzEsMjQgQEAKIHBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRlNEYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlV3JpdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5OdWxsV3JpdGFibGU7CiAKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuZ3JhcGguVmVydGV4OwogaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5qb2IuUHJlZ2VsaXhKb2I7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLnV0aWwuQnNwVXRpbHM7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5iaXR3aXNlLkJpdHdpc2VPcGVyYXRpb247Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguZGF0YWZsb3cudXRpbC5JdGVyYXRpb25VdGlsczsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuY2xpZW50LkNsaWVudDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuaW8uTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5pby5WYWx1ZVN0YXRlV3JpdGFibGU7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5jbGllbnQuQ2xpZW50OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZm9ybWF0LkxvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdDsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmZvcm1hdC5Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoT3V0cHV0Rm9ybWF0OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW8uTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW8uVmFsdWVTdGF0ZVdyaXRhYmxlOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXgubG9nLkxvZ0FsZ29yaXRobUxvZ0Zvcm1hdHRlcjsKIGltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnR5cGUuTWVzc2FnZTsKIGltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnR5cGUuU3RhdGU7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXI7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXJVdGlsOwogCiAvKgogICogdmVydGV4SWQ6IEJ5dGVzV3JpdGFibGUKQEAgLTU0LDI4MyArNDksMzQ3IEBACiAgKiBUaGUgZGV0YWlscyBhYm91dCBtZXNzYWdlIGFyZSBpbiBlZHUudWNpLmljcy5wcmVnZWxpeC5leGFtcGxlLmlvLk1lc3NhZ2VXcml0YWJsZS4gCiAgKi8KIHB1YmxpYyBjbGFzcyBMb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoVmVydGV4IGV4dGVuZHMgVmVydGV4PEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCBMb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGU+eworCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaFZlcnRleC5jbGFzcy5nZXROYW1lKCkpOyAKKwlMb2dBbGdvcml0aG1Mb2dGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IExvZ0FsZ29yaXRobUxvZ0Zvcm1hdHRlcigpOworCXB1YmxpYyBzdGF0aWMgRmlsZUhhbmRsZXIgaGFuZGxlcjsKIAkKLQlwcml2YXRlIGJ5dGVbXSB0bXBWZXJ0ZXh0SWQ7Ci0JcHJpdmF0ZSBieXRlW10gdG1wU291cmNlVmVydGV4dElkOworCXByaXZhdGUgYnl0ZVtdIHRtcFZlcnRleElkOwogCXByaXZhdGUgYnl0ZVtdIHRtcERlc3RWZXJ0ZXhJZDsKKwlwcml2YXRlIEJ5dGVzV3JpdGFibGUgZGVzdFZlcnRleElkID0gbmV3IEJ5dGVzV3JpdGFibGUoKTsKIAlwcml2YXRlIGJ5dGVbXSBtZXJnZUNoYWluVmVydGV4SWQ7CiAJcHJpdmF0ZSBpbnQgbGVuZ3RoT2ZNZXJnZUNoYWluVmVydGV4OwotCXByaXZhdGUgYnl0ZVtdIHRtcE1lcmdlQ2hhaW5WZXJ0ZXhJZDsKLQlwcml2YXRlIGludCB0bXBMZW5ndGhPZk1lcmdlQ2hhaW5WZXJ0ZXg7CiAJcHJpdmF0ZSBieXRlIHRtcFZlcnRleFZhbHVlOwotCXByaXZhdGUgaW50IHRtcFZlcnRleFN0YXRlOwotCXByaXZhdGUgaW50IHRtcE1lc3NhZ2U7CiAJcHJpdmF0ZSBWYWx1ZVN0YXRlV3JpdGFibGUgdG1wVmFsID0gbmV3IFZhbHVlU3RhdGVXcml0YWJsZSgpOwogCXByaXZhdGUgTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlIHRtcE1zZyA9IG5ldyBMb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGUoKTsKLQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyOyAKIAkvKioKIAkgKiBMb2cgQWxnb3JpdGhtIGZvciBwYXRoIG1lcmdlIGdyYXBoCiAJICovCisJcHVibGljIExvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhWZXJ0ZXgoKXsKKwkJaWYoaGFuZGxlciA9PSBudWxsKXsKKwkJCXRyeSB7CisJCQkJaGFuZGxlciA9IG5ldyBGaWxlSGFuZGxlcigibG9nLyIgKyBMb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoVmVydGV4LmNsYXNzLmdldE5hbWUoKSArICIubG9nIik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpO30gCisJCX0KKwl9CisJCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY29tcHV0ZShJdGVyYXRvcjxMb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGU+IG1zZ0l0ZXJhdG9yKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJ0ZXN0L2NoZWNrX0xvZyIsdHJ1ZSkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZTEpIHsgZTEucHJpbnRTdGFja1RyYWNlKCk7fQotCQl0bXBWZXJ0ZXh0SWQgPSBHcmFwaFZlcnRleE9wZXJhdGlvbi5nZW5lcmF0ZVZhbGlkRGF0YUZyb21CeXRlc1dyaXRhYmxlKGdldFZlcnRleElkKCkpOworCisJCXRtcFZlcnRleElkID0gR3JhcGhWZXJ0ZXhPcGVyYXRpb24uZ2VuZXJhdGVWYWxpZERhdGFGcm9tQnl0ZXNXcml0YWJsZShnZXRWZXJ0ZXhJZCgpKTsKKwkJdG1wVmFsID0gZ2V0VmVydGV4VmFsdWUoKTsKIAkJaWYgKGdldFN1cGVyc3RlcCgpID09IDEpIHsKLQkJCXRtcFZhbCA9IGdldFZlcnRleFZhbHVlKCk7Ci0JCQl0bXBWZXJ0ZXhWYWx1ZSA9IHRtcFZhbC5nZXRWYWx1ZSgpOwogCQkJdG1wTXNnLnNldENoYWluVmVydGV4SWQobmV3IGJ5dGVbMF0pOwotCQkJaWYoR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaXNIZWFkKG5ldyBCeXRlV3JpdGFibGUodG1wVmVydGV4VmFsdWUpKSl7CisJCQlpZihHcmFwaFZlcnRleE9wZXJhdGlvbi5pc0hlYWRWZXJ0ZXgodG1wVmFsLmdldFZhbHVlKCkpKXsKIAkJCQl0bXBNc2cuc2V0TWVzc2FnZShNZXNzYWdlLlNUQVJUKTsKLQkJCQl0bXBEZXN0VmVydGV4SWQgPSBHcmFwaFZlcnRleE9wZXJhdGlvbi5nZXREZXN0VmVydGV4SWQodG1wVmVydGV4dElkLCB0bXBWZXJ0ZXhWYWx1ZSk7IAotCQkJCXNlbmRNc2cobmV3IEJ5dGVzV3JpdGFibGUodG1wRGVzdFZlcnRleElkKSx0bXBNc2cpOwotCQkJCS8vdGVzdAotCQkJCUdyYXBoVmVydGV4T3BlcmF0aW9uLnRlc3RMb2dNZXNzYWdlQ29tbXVuaWNhdGlvbih3cml0ZXIsIGdldFN1cGVyc3RlcCgpLAotCQkJCQkJdG1wVmVydGV4dElkLCB0bXBEZXN0VmVydGV4SWQsIHRtcE1zZyk7Ci0JCQkJLy92b3RlVG9IYWx0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmKEdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUmVhcihuZXcgQnl0ZVdyaXRhYmxlKHRtcFZlcnRleFZhbHVlKSkpewotCQkJCXRtcE1zZy5zZXRNZXNzYWdlKE1lc3NhZ2UuRU5EKTsKLQkJCQl0bXBEZXN0VmVydGV4SWQgPSBHcmFwaFZlcnRleE9wZXJhdGlvbi5nZXRMZWZ0RGVzdFZlcnRleElkKHRtcFZlcnRleHRJZCwgdG1wVmVydGV4VmFsdWUpOwotCQkJCXNlbmRNc2cobmV3IEJ5dGVzV3JpdGFibGUodG1wRGVzdFZlcnRleElkKSx0bXBNc2cpOwotCQkJCS8vdGVzdAotCQkJCUdyYXBoVmVydGV4T3BlcmF0aW9uLnRlc3RTZXRWZXJ0ZXhTdGF0ZSh3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCBnZXRWZXJ0ZXhJZCgpLmdldEJ5dGVzKCksIAotCQkJCQkJdG1wRGVzdFZlcnRleElkLCB0bXBNc2csIHRtcFZhbCk7Ci0JCQkJLy92b3RlVG9IYWx0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmKEdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUGF0aFZlcnRleChuZXcgQnl0ZVdyaXRhYmxlKHRtcFZlcnRleFZhbHVlKSkpewotCQkJCXRtcFZhbCA9IGdldFZlcnRleFZhbHVlKCk7Ci0JCQkJdG1wVmFsLnNldFN0YXRlKFN0YXRlLk1JRF9WRVJURVgpOwotCQkJCXNldFZlcnRleFZhbHVlKHRtcFZhbCk7Ci0JCQkJLy90ZXN0Ci0JCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdFNldFZlcnRleFN0YXRlKHdyaXRlciwgZ2V0U3VwZXJzdGVwKCksdG1wVmVydGV4dElkICwgCi0JCQkJCQludWxsLCBudWxsLCB0bXBWYWwpOyAKLQkJCX0KLQkJCXZvdGVUb0hhbHQoKTsKLQkJfQotCQllbHNlIGlmKGdldFN1cGVyc3RlcCgpID09IDIpewotCQkJaWYobXNnSXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQl0bXBNc2cgPSBtc2dJdGVyYXRvci5uZXh0KCk7Ci0JCQkJdG1wTWVzc2FnZSA9IHRtcE1zZy5nZXRNZXNzYWdlKCk7Ci0JCQkJdG1wVmFsID0gZ2V0VmVydGV4VmFsdWUoKTsKLQkJCQl0bXBWZXJ0ZXhTdGF0ZSA9IHRtcFZhbC5nZXRTdGF0ZSgpOwotCQkJCWlmKHRtcE1lc3NhZ2UgPT0gTWVzc2FnZS5TVEFSVCAmJiB0bXBWZXJ0ZXhTdGF0ZSA9PSBTdGF0ZS5NSURfVkVSVEVYKXsKLQkJCQkJdG1wVmFsLnNldFN0YXRlKFN0YXRlLlNUQVJUX1ZFUlRFWCk7Ci0JCQkJCXNldFZlcnRleFZhbHVlKHRtcFZhbCk7Ci0JCQkJCS8vdGVzdAotCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0U2V0VmVydGV4U3RhdGUod3JpdGVyLCBnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4dElkLCAKLQkJCQkJCQludWxsLCBudWxsLCB0bXBWYWwpOwotCQkJCX0KLQkJCQllbHNlIGlmKHRtcE1lc3NhZ2UgPT0gTWVzc2FnZS5FTkQgJiYgdG1wVmVydGV4U3RhdGUgPT0gU3RhdGUuTUlEX1ZFUlRFWCl7Ci0JCQkJCXRtcFZhbC5zZXRTdGF0ZShTdGF0ZS5FTkRfVkVSVEVYKTsKLQkJCQkJc2V0VmVydGV4VmFsdWUodG1wVmFsKTsKLQkJCQkJLy90ZXN0Ci0JCQkJCUdyYXBoVmVydGV4T3BlcmF0aW9uLnRlc3RTZXRWZXJ0ZXhTdGF0ZSh3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXh0SWQsIAotCQkJCQkJCW51bGwsIG51bGwsIHRtcFZhbCk7CisJCQkJZm9yKGJ5dGUgeCA9IEttZXIuR0VORV9DT0RFLkE7IHg8PSBLbWVyLkdFTkVfQ09ERS5UIDsgeCsrKXsKKwkJCQkJaWYoKHRtcFZhbC5nZXRWYWx1ZSgpICYgKDEgPDwgeCkpICE9IDApeworCQkJCQkJdG1wRGVzdFZlcnRleElkID0gS21lclV0aWwuc2hpZnRLbWVyV2l0aE5leHRDb2RlKEdyYXBoVmVydGV4T3BlcmF0aW9uLmssIHRtcFZlcnRleElkLCB4KTsKKwkJCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQkJCXNlbmRNc2coZGVzdFZlcnRleElkLHRtcE1zZyk7CisJCQkJCQkvL2xvZworCQkJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQkJCWxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJbG9nZ2VyLmluZm8oIiMjIyMjIEl0IGlzIHRoZSBoZWFkISAjIyMjIyIpOworCQkJCQl9CiAJCQkJfQogCQkJCXZvdGVUb0hhbHQoKTsKIAkJCX0KKwkJCWlmKEdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUmVhclZlcnRleCh0bXBWYWwuZ2V0VmFsdWUoKSkpeworCQkJCXRtcE1zZy5zZXRNZXNzYWdlKE1lc3NhZ2UuRU5EKTsKKwkJCQkKKwkJCQlmb3IoYnl0ZSB4ID0gS21lci5HRU5FX0NPREUuQTsgeDw9IEttZXIuR0VORV9DT0RFLlQgOyB4KyspeworCQkJCQlpZigoKHRtcFZhbC5nZXRWYWx1ZSgpPj4gNCkgJiAoMSA8PCB4KSkgIT0gMCl7CisJCQkJCQl0bXBEZXN0VmVydGV4SWQgPSBLbWVyVXRpbC5zaGlmdEttZXJXaXRoUHJlQ29kZShHcmFwaFZlcnRleE9wZXJhdGlvbi5rLCB0bXBWZXJ0ZXhJZCwgeCk7CisJCQkJCQlkZXN0VmVydGV4SWQuc2V0KHRtcERlc3RWZXJ0ZXhJZCwgMCwgdG1wRGVzdFZlcnRleElkLmxlbmd0aCk7CisJCQkJCQlzZW5kTXNnKGRlc3RWZXJ0ZXhJZCx0bXBNc2cpOworCisJCQkJCQkvL2xvZworCQkJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQkJCWxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJbG9nZ2VyLmluZm8oIiMjIyMjIEl0IGlzIHRoZSByZWFyISAjIyMjIyIpOworCQkJCQl9CisJCQkJfQorCQkJCXZvdGVUb0hhbHQoKTsKKwkJCX0KKwkJCWlmKEdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUGF0aFZlcnRleCh0bXBWYWwuZ2V0VmFsdWUoKSkpeworCQkJCXRtcFZhbC5zZXRTdGF0ZShTdGF0ZS5NSURfVkVSVEVYKTsKKwkJCQlzZXRWZXJ0ZXhWYWx1ZSh0bXBWYWwpOworCQkJCQorCQkJCS8vbG9nCisJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJaWYobG9nZ2VyLmdldEhhbmRsZXJzKCkgIT0gbnVsbCkKKwkJCQkJbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaGFuZGxlcik7CisJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQlsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKwkJCQlsb2dnZXIuaW5mbygiIyMjIyMgSXQgaXMgdGhlIHBhdGghICMjIyMjIik7CisJCQl9CisJCX0KKwkJZWxzZSBpZihnZXRTdXBlcnN0ZXAoKSA9PSAyKXsKKwkJCXdoaWxlKG1zZ0l0ZXJhdG9yLmhhc05leHQoKSl7CisJCQkJaWYoIUdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUGF0aFZlcnRleCh0bXBWYWwuZ2V0VmFsdWUoKSkpeworCQkJCQltc2dJdGVyYXRvci5uZXh0KCk7CisJCQkJCXZvdGVUb0hhbHQoKTsKKwkJCQl9CisJCQkJZWxzZXsKKwkJCQkJdG1wTXNnID0gbXNnSXRlcmF0b3IubmV4dCgpOworCQkJCQkKKwkJCQkJaWYodG1wTXNnLmdldE1lc3NhZ2UoKSA9PSBNZXNzYWdlLlNUQVJUICYmIHRtcFZhbC5nZXRTdGF0ZSgpID09IFN0YXRlLk1JRF9WRVJURVgpeworCQkJCQkJdG1wVmFsLnNldFN0YXRlKFN0YXRlLlNUQVJUX1ZFUlRFWCk7CisJCQkJCQlzZXRWZXJ0ZXhWYWx1ZSh0bXBWYWwpOworCQkJCQkJLy9sb2cKKwkJCQkJCWZvcm1hdHRlci5zZXQoZ2V0U3VwZXJzdGVwKCksIHRtcFZlcnRleElkLCB0bXBEZXN0VmVydGV4SWQsIHRtcE1zZywgdG1wVmFsLmdldFN0YXRlKCksIEdyYXBoVmVydGV4T3BlcmF0aW9uLmspOworCQkJCQkJaWYobG9nZ2VyLmdldEhhbmRsZXJzKCkgIT0gbnVsbCkKKwkJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCWhhbmRsZXIuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcik7CisJCQkJCQlsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBTZXQgc3RhdGUhICMjIyMjIik7CisJCQkJCX0KKwkJCQkJZWxzZSBpZih0bXBNc2cuZ2V0TWVzc2FnZSgpID09IE1lc3NhZ2UuRU5EICYmIHRtcFZhbC5nZXRTdGF0ZSgpID09IFN0YXRlLk1JRF9WRVJURVgpeworCQkJCQkJdG1wVmFsLnNldFN0YXRlKFN0YXRlLkVORF9WRVJURVgpOworCQkJCQkJc2V0VmVydGV4VmFsdWUodG1wVmFsKTsKKwkJCQkJCXZvdGVUb0hhbHQoKTsKKwkJCQkJCS8vbG9nCisJCQkJCQlmb3JtYXR0ZXIuc2V0KGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXhJZCwgdG1wRGVzdFZlcnRleElkLCB0bXBNc2csIHRtcFZhbC5nZXRTdGF0ZSgpLCBHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkJCQkJCWlmKGxvZ2dlci5nZXRIYW5kbGVycygpICE9IG51bGwpCisJCQkJCQkJbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaGFuZGxlcik7CisJCQkJCQloYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpOworCQkJCQkJbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7CisJCQkJCQlsb2dnZXIuaW5mbygiIyMjIyMgU2V0IHN0YXRlISAjIyMjIyIpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXZvdGVUb0hhbHQoKTsKKwkJCQkJCisKKwkJCQl9CisJCQl9CiAJCX0KIAkJLy9oZWFkIG5vZGUgc2VuZHMgbWVzc2FnZSB0byBwYXRoIG5vZGUKIAkJZWxzZSBpZihnZXRTdXBlcnN0ZXAoKSUzID09IDApewotCQkJdG1wVmFsID0gZ2V0VmVydGV4VmFsdWUoKTsKLQkJCXRtcFZlcnRleFZhbHVlID0gdG1wVmFsLmdldFZhbHVlKCk7Ci0JCQl0bXBWZXJ0ZXhTdGF0ZSA9IHRtcFZhbC5nZXRTdGF0ZSgpOwotCQkJdG1wU291cmNlVmVydGV4dElkID0gZ2V0VmVydGV4SWQoKS5nZXRCeXRlcygpOworCQkJLy90bXBWYWwgPSBnZXRWZXJ0ZXhWYWx1ZSgpOwogCiAJCQlpZihnZXRTdXBlcnN0ZXAoKSA9PSAzKXsKIAkJCQl0bXBNc2cgPSBuZXcgTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlKCk7Ci0JCQkJdG1wRGVzdFZlcnRleElkID0gR3JhcGhWZXJ0ZXhPcGVyYXRpb24uZ2V0RGVzdFZlcnRleElkKHRtcFNvdXJjZVZlcnRleHRJZCwgCi0JCQkJCQlnZXRWZXJ0ZXhWYWx1ZSgpLmdldFZhbHVlKCkpOwotCQkJCWlmKHRtcFZlcnRleFN0YXRlID09IFN0YXRlLlNUQVJUX1ZFUlRFWCl7CisJCQkJdG1wRGVzdFZlcnRleElkID0gS21lclV0aWwuc2hpZnRLbWVyV2l0aE5leHRDb2RlKEdyYXBoVmVydGV4T3BlcmF0aW9uLmssIHRtcFZlcnRleElkLCAKKwkJCQkJCUttZXIuR0VORV9DT0RFLmdldEdlbmVDb2RlRnJvbUJpdE1hcCgoYnl0ZSkodG1wVmFsLmdldFZhbHVlKCkgJiAweDBGKSkpOworCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQlpZih0bXBWYWwuZ2V0U3RhdGUoKSA9PSBTdGF0ZS5TVEFSVF9WRVJURVgpewogCQkJCQl0bXBNc2cuc2V0TWVzc2FnZShNZXNzYWdlLlNUQVJUKTsKLQkJCQkJdG1wTXNnLnNldFNvdXJjZVZlcnRleElkKHRtcFNvdXJjZVZlcnRleHRJZCk7Ci0JCQkJCXNlbmRNc2cobmV3IEJ5dGVzV3JpdGFibGUodG1wRGVzdFZlcnRleElkKSx0bXBNc2cpOwotCQkJCQkvL3Rlc3QKLQkJCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdE1lc3NhZ2VDb21tdW5pY2F0aW9uMih3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXh0SWQsCi0JCQkJCQkJdG1wRGVzdFZlcnRleElkLCB0bXBNc2csIG51bGwpOworCQkJCQl0bXBNc2cuc2V0U291cmNlVmVydGV4SWQoZ2V0VmVydGV4SWQoKS5nZXRCeXRlcygpKTsKKwkJCQkJc2VuZE1zZyhkZXN0VmVydGV4SWQsIHRtcE1zZyk7CisJCQkJCXZvdGVUb0hhbHQoKTsKIAkJCQl9Ci0JCQkJZWxzZSBpZih0bXBWZXJ0ZXhTdGF0ZSAhPSBTdGF0ZS5FTkRfVkVSVEVYKXsKKwkJCQllbHNlIGlmKHRtcFZhbC5nZXRTdGF0ZSgpICE9IFN0YXRlLkVORF9WRVJURVgpewogCQkJCQl0bXBNc2cuc2V0TWVzc2FnZShNZXNzYWdlLk5PTik7Ci0JCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZCh0bXBTb3VyY2VWZXJ0ZXh0SWQpOwotCQkJCQlzZW5kTXNnKG5ldyBCeXRlc1dyaXRhYmxlKHRtcERlc3RWZXJ0ZXhJZCksdG1wTXNnKTsKLQkJCQkJLy90ZXN0Ci0JCQkJCUdyYXBoVmVydGV4T3BlcmF0aW9uLnRlc3RNZXNzYWdlQ29tbXVuaWNhdGlvbjIod3JpdGVyLCBnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4dElkLAotCQkJCQkJCXRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCBudWxsKTsKKwkJCQkJdG1wTXNnLnNldFNvdXJjZVZlcnRleElkKGdldFZlcnRleElkKCkuZ2V0Qnl0ZXMoKSk7CisJCQkJCXNlbmRNc2coZGVzdFZlcnRleElkLHRtcE1zZyk7CisJCQkJCXZvdGVUb0hhbHQoKTsKIAkJCQl9CisJCQkJCisJCQkJLy9sb2cKKwkJCQlmb3JtYXR0ZXIuc2V0KGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXhJZCwgdG1wRGVzdFZlcnRleElkLCB0bXBNc2csIHRtcFZhbC5nZXRTdGF0ZSgpLCBHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQloYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpOworCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBoZWFkIG5vZGUgc2VuZHMgbWVzc2FnZSB0byBwYXRoIG5vZGUhICMjIyMjIik7CisJCQkJCiAJCQl9CiAJCQllbHNlewogCQkJCWlmKG1zZ0l0ZXJhdG9yLmhhc05leHQoKSl7CiAJCQkJCXRtcE1zZyA9IG1zZ0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdG1wTGVuZ3RoT2ZNZXJnZUNoYWluVmVydGV4ID0gdG1wVmFsLmdldExlbmd0aE9mTWVyZ2VDaGFpbigpOwotCQkJCQl0bXBNZXJnZUNoYWluVmVydGV4SWQgPSB0bXBWYWwuZ2V0TWVyZ2VDaGFpbigpOwotCQkJCQlieXRlW10gbGFzdEttZXIgPSBHcmFwaFZlcnRleE9wZXJhdGlvbi5nZXRMYXN0S21lcih0bXBNZXJnZUNoYWluVmVydGV4SWQsIAotCQkJCQkJCXRtcExlbmd0aE9mTWVyZ2VDaGFpblZlcnRleCk7Ci0JCQkJCXRtcERlc3RWZXJ0ZXhJZCA9IEdyYXBoVmVydGV4T3BlcmF0aW9uLmdldERlc3RWZXJ0ZXhJZChsYXN0S21lciwgCi0JCQkJCQkJdG1wTXNnLmdldE5laWdoYmVySW5mbygpKTsKLQkJCQkJaWYodG1wVmVydGV4U3RhdGUgPT0gU3RhdGUuU1RBUlRfVkVSVEVYKXsKKwkJCQkJYnl0ZVtdIGxhc3RLbWVyID0gS21lclV0aWwuZ2V0TGFzdEttZXJGcm9tQ2hhaW4oR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaywKKwkJCQkJCQl0bXBWYWwuZ2V0TGVuZ3RoT2ZNZXJnZUNoYWluKCksCisJCQkJCQkJdG1wVmFsLmdldE1lcmdlQ2hhaW4oKSk7CisJCQkJCXRtcERlc3RWZXJ0ZXhJZCA9IEttZXJVdGlsLnNoaWZ0S21lcldpdGhOZXh0Q29kZShHcmFwaFZlcnRleE9wZXJhdGlvbi5rLCBsYXN0S21lciwgCisJCQkJCQkJS21lci5HRU5FX0NPREUuZ2V0R2VuZUNvZGVGcm9tQml0TWFwKChieXRlKSh0bXBWYWwuZ2V0VmFsdWUoKSAmIDB4MEYpKSk7IC8vdG1wTXNnLmdldE5laWdoYmVySW5mbygpCisJCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQkJaWYodG1wVmFsLmdldFN0YXRlKCkgPT0gU3RhdGUuU1RBUlRfVkVSVEVYKXsKIAkJCQkJCXRtcE1zZy5zZXRNZXNzYWdlKE1lc3NhZ2UuU1RBUlQpOwotCQkJCQkJdG1wTXNnLnNldFNvdXJjZVZlcnRleElkKHRtcFNvdXJjZVZlcnRleHRJZCk7Ci0JCQkJCQlzZW5kTXNnKG5ldyBCeXRlc1dyaXRhYmxlKHRtcERlc3RWZXJ0ZXhJZCksdG1wTXNnKTsKLQkJCQkJCS8vdGVzdAotCQkJCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdE1lc3NhZ2VDb21tdW5pY2F0aW9uMih3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXh0SWQsCi0JCQkJCQkJCXRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCBudWxsKTsKKwkJCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZChnZXRWZXJ0ZXhJZCgpLmdldEJ5dGVzKCkpOworCQkJCQkJc2VuZE1zZyhkZXN0VmVydGV4SWQsIHRtcE1zZyk7CisJCQkJCQkvL2xvZworCQkJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQkJCWxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJbG9nZ2VyLmluZm8oIiMjIyMjIGhlYWQgbm9kZSBzZW5kcyBtZXNzYWdlIHRvIHBhdGggbm9kZSEgIyMjIyMiKTsKKwkJCQkJCXZvdGVUb0hhbHQoKTsKIAkJCQkJfQotCQkJCQllbHNlIGlmKHRtcFZlcnRleFN0YXRlICE9IFN0YXRlLkVORF9WRVJURVgpeworCQkJCQllbHNlIGlmKHRtcFZhbC5nZXRTdGF0ZSgpICE9IFN0YXRlLkVORF9WRVJURVgpewogCQkJCQkJdG1wTXNnLnNldE1lc3NhZ2UoTWVzc2FnZS5OT04pOwotCQkJCQkJdG1wTXNnLnNldFNvdXJjZVZlcnRleElkKHRtcFNvdXJjZVZlcnRleHRJZCk7Ci0JCQkJCQlzZW5kTXNnKG5ldyBCeXRlc1dyaXRhYmxlKHRtcERlc3RWZXJ0ZXhJZCksdG1wTXNnKTsKLQkJCQkJCS8vdGVzdAotCQkJCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdE1lc3NhZ2VDb21tdW5pY2F0aW9uMih3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXh0SWQsCi0JCQkJCQkJCXRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCBudWxsKTsKKwkJCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZChnZXRWZXJ0ZXhJZCgpLmdldEJ5dGVzKCkpOworCQkJCQkJc2VuZE1zZyhkZXN0VmVydGV4SWQsdG1wTXNnKTsKKwkJCQkJCQorCQkJCQkJLy9sb2cKKwkJCQkJCWZvcm1hdHRlci5zZXQoZ2V0U3VwZXJzdGVwKCksIHRtcFZlcnRleElkLCB0bXBEZXN0VmVydGV4SWQsIHRtcE1zZywgdG1wVmFsLmdldFN0YXRlKCksIEdyYXBoVmVydGV4T3BlcmF0aW9uLmspOworCQkJCQkJaWYobG9nZ2VyLmdldEhhbmRsZXJzKCkgIT0gbnVsbCkKKwkJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCWhhbmRsZXIuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcik7CisJCQkJCQlsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBoZWFkIG5vZGUgc2VuZHMgbWVzc2FnZSB0byBwYXRoIG5vZGUhICMjIyMjIik7CiAJCQkJCX0KKwkJCQkJCiAJCQkJfQotCQkJCWVsc2UKLQkJCQkJdm90ZVRvSGFsdCgpOwogCQkJfQotCQkJdm90ZVRvSGFsdCgpOwogCQl9CisJCQogCQkvL3BhdGggbm9kZSBzZW5kcyBtZXNzYWdlIGJhY2sgdG8gaGVhZCBub2RlCiAJCWVsc2UgaWYoZ2V0U3VwZXJzdGVwKCklMyA9PSAxKXsKIAkJCWlmKG1zZ0l0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQkJdG1wVmFsID0gZ2V0VmVydGV4VmFsdWUoKTsKIAkJCQl0bXBNc2cgPSBtc2dJdGVyYXRvci5uZXh0KCk7Ci0JCQkJdG1wTWVzc2FnZSA9IHRtcE1zZy5nZXRNZXNzYWdlKCk7Ci0JCQkJdG1wU291cmNlVmVydGV4dElkID0gdG1wTXNnLmdldFNvdXJjZVZlcnRleElkKCk7CisJCQkJaW50IG1lc3NhZ2UgPSB0bXBNc2cuZ2V0TWVzc2FnZSgpOwogCQkJCWlmKHRtcFZhbC5nZXRMZW5ndGhPZk1lcmdlQ2hhaW4oKSA9PSAwKXsKIAkJCQkJdG1wVmFsLnNldExlbmd0aE9mTWVyZ2VDaGFpbihHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKLQkJCQkJdG1wVmFsLnNldE1lcmdlQ2hhaW4odG1wVmVydGV4dElkKTsKKwkJCQkJdG1wVmFsLnNldE1lcmdlQ2hhaW4odG1wVmVydGV4SWQpOwogCQkJCQlzZXRWZXJ0ZXhWYWx1ZSh0bXBWYWwpOwogCQkJCX0KKwkJCQkKIAkJCQl0bXBNc2cuc2V0TGVuZ3RoT2ZDaGFpbih0bXBWYWwuZ2V0TGVuZ3RoT2ZNZXJnZUNoYWluKCkpOwogCQkJCXRtcE1zZy5zZXRDaGFpblZlcnRleElkKHRtcFZhbC5nZXRNZXJnZUNoYWluKCkpOwogCQkJCQogCQkJCXRtcE1zZy5zZXROZWlnaGJlckluZm8odG1wVmFsLmdldFZhbHVlKCkpOyAvL3NldCBuZWlnaGJlcgogCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhTdGF0ZSh0bXBWYWwuZ2V0U3RhdGUoKSk7Ci0JCQkJaWYodG1wVmFsLmdldFN0YXRlKCkgPT0gU3RhdGUuRU5EX1ZFUlRFWCkKKwkJCQkKKwkJCQkvL2tpbGwgTWVzc2FnZSBiZWNhdXNlIGl0IGhhcyBiZWVuIG1lcmdlZCBieSB0aGUgaGVhZAorCQkJCWlmKHRtcFZhbC5nZXRTdGF0ZSgpID09IFN0YXRlLkVORF9WRVJURVgpewogCQkJCQl0bXBNc2cuc2V0TWVzc2FnZShNZXNzYWdlLkVORCk7CisJCQkJCS8vdG1wVmFsLnNldFN0YXRlKFN0YXRlLkZJTkFMX0RFTEVURSk7CisJCQkJCS8vc2V0VmVydGV4VmFsdWUodG1wVmFsKTsKKwkJCQkJLy9kZWxldGVWZXJ0ZXgoZ2V0VmVydGV4SWQoKSk7CisJCQkJfQogCQkJCWVsc2UKIAkJCQkJdG1wTXNnLnNldE1lc3NhZ2UoTWVzc2FnZS5OT04pOwotCi0JCQkJc2VuZE1zZyhuZXcgQnl0ZXNXcml0YWJsZSh0bXBTb3VyY2VWZXJ0ZXh0SWQpLHRtcE1zZyk7Ci0JCQkJLy90ZXN0Ci0JCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdE1lc3NhZ2VDb21tdW5pY2F0aW9uMih3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXh0SWQsCi0JCQkJCQl0bXBTb3VyY2VWZXJ0ZXh0SWQsIHRtcE1zZywgdG1wU291cmNlVmVydGV4dElkKTsKLQkJCQkvL2tpbGwgTWVzc2FnZSBiZWNhdXNlIGl0IGhhcyBiZWVuIG1lcmdlZCBieSB0aGUgaGVhZAotCQkJCWlmKHRtcE1lc3NhZ2UgPT0gTWVzc2FnZS5TVEFSVCl7CisJCQkJCisJCQkJaWYobWVzc2FnZSA9PSBNZXNzYWdlLlNUQVJUKXsKIAkJCQkJdG1wVmFsLnNldFN0YXRlKFN0YXRlLlRPREVMRVRFKTsKIAkJCQkJc2V0VmVydGV4VmFsdWUodG1wVmFsKTsKIAkJCQl9CisJCQkJZGVzdFZlcnRleElkLnNldCh0bXBNc2cuZ2V0U291cmNlVmVydGV4SWQoKSwgMCwgdG1wTXNnLmdldFNvdXJjZVZlcnRleElkKCkubGVuZ3RoKTsKKwkJCQlzZW5kTXNnKGRlc3RWZXJ0ZXhJZCx0bXBNc2cpOworCQkJCQorCQkJCS8vbG9nCisJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcE1zZy5nZXRTb3VyY2VWZXJ0ZXhJZCgpLCB0bXBNc2csIHRtcFZhbC5nZXRTdGF0ZSgpLCBHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQloYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpOworCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBwYXRoIG5vZGUgc2VuZHMgbWVzc2FnZSBiYWNrIHRvIGhlYWQgbm9kZSEgIyMjIyMiKTsKKwkJCQkKIAkJCX0KIAkJCWVsc2V7CisJCQkJLy9TdHJpbmcgc291cmNlMiA9IEttZXIucmVjb3ZlckttZXJGcm9tKDUsIHRtcFZlcnRleElkLCAwLCB0bXBWZXJ0ZXhJZC5sZW5ndGgpOwogCQkJCWlmKGdldFZlcnRleFZhbHVlKCkuZ2V0U3RhdGUoKSAhPSBTdGF0ZS5TVEFSVF9WRVJURVgKLQkJCQkJCSYmIGdldFZlcnRleFZhbHVlKCkuZ2V0U3RhdGUoKSAhPSBTdGF0ZS5FTkRfVkVSVEVYCi0JCQkJCQkmJiB0bXBNZXNzYWdlICE9IE1lc3NhZ2UuRU5EICYmIHRtcE1lc3NhZ2UgIT0gTWVzc2FnZS5TVEFSVCl7CisJCQkJCQkmJiBnZXRWZXJ0ZXhWYWx1ZSgpLmdldFN0YXRlKCkgIT0gU3RhdGUuRU5EX1ZFUlRFWCl7CiAJCQkJCQotCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0RGVsZXRlVmVydGV4SW5mbyh3cml0ZXIsIGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXh0SWQsICJub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZSIpOworCQkJCQkvL2xvZworCQkJCQlmb3JtYXR0ZXIuc2V0KGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXhJZCwgbnVsbCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCWZvcm1hdHRlci5zZXRPcGVyYXRpb24oMSk7CisJCQkJCWlmKGxvZ2dlci5nZXRIYW5kbGVycygpICE9IG51bGwpCisJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7CisJCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBEZWxldGUhIE5vdCByZWNlaXZlIG1lc3NhZ2UhICMjIyMjIik7CiAJCQkJCWRlbGV0ZVZlcnRleChnZXRWZXJ0ZXhJZCgpKTsgLy9raWxsU2VsZiBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVjZWl2ZSBhbnkgbWVzc2FnZQogCQkJCX0KIAkJCX0KIAkJfQogCQllbHNlIGlmKGdldFN1cGVyc3RlcCgpJTMgPT0gMil7Ci0JCQlpZihtc2dJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCXRtcE1zZyA9IG1zZ0l0ZXJhdG9yLm5leHQoKTsKLQkJCQl0bXBWYWwgPSBnZXRWZXJ0ZXhWYWx1ZSgpOwotCQkJCXRtcFZlcnRleFN0YXRlID0gdG1wVmFsLmdldFN0YXRlKCk7Ci0JCQkJdG1wU291cmNlVmVydGV4dElkID0gdG1wVmVydGV4dElkOwotCQkJCWlmKHRtcFZlcnRleFN0YXRlID09IFN0YXRlLlRPREVMRVRFKXsKLQkJCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdERlbGV0ZVZlcnRleEluZm8od3JpdGVyLCBnZXRTdXBlcnN0ZXAoKSwKLQkJCQkJCQl0bXBTb3VyY2VWZXJ0ZXh0SWQsICJhbHJlYWR5IG1lcmdlZCBieSBoZWFkIik7Ci0JCQkJCWRlbGV0ZVZlcnRleChuZXcgQnl0ZXNXcml0YWJsZSh0bXBTb3VyY2VWZXJ0ZXh0SWQpKTsgLy9raWxsU2VsZgotCQkJCX0KLQkJCQllbHNleworCQkJaWYodG1wVmFsLmdldFN0YXRlKCkgPT0gU3RhdGUuVE9ERUxFVEUpeworCQkJCS8vbG9nCisJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJaWYobG9nZ2VyLmdldEhhbmRsZXJzKCkgIT0gbnVsbCkKKwkJCQkJbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaGFuZGxlcik7CisJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQlsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKwkJCQlsb2dnZXIuaW5mbygiIyMjIyMgRGVsZXRlISBBbHJlYWR5IG1lcmdlIGJ5IGhlYWQhICMjIyMjIik7CisJCQkJZm9ybWF0dGVyLnNldE9wZXJhdGlvbigwKTsKKwkJCQkKKwkJCQlkZWxldGVWZXJ0ZXgoZ2V0VmVydGV4SWQoKSk7IC8va2lsbFNlbGYKKwkJCX0KKwkJCWVsc2V7CisJCQkJaWYobXNnSXRlcmF0b3IuaGFzTmV4dCgpKXsKKwkJCQkJdG1wTXNnID0gbXNnSXRlcmF0b3IubmV4dCgpOworCiAJCQkJCWlmKHRtcE1zZy5nZXRNZXNzYWdlKCkgPT0gTWVzc2FnZS5FTkQpewotCQkJCQkJaWYodG1wVmVydGV4U3RhdGUgIT0gU3RhdGUuU1RBUlRfVkVSVEVYKQotCQkJCQkJCXRtcFZlcnRleFN0YXRlID0gU3RhdGUuRU5EX1ZFUlRFWDsKKwkJCQkJCWlmKHRtcFZhbC5nZXRTdGF0ZSgpICE9IFN0YXRlLlNUQVJUX1ZFUlRFWCkKKwkJCQkJCQl0bXBWYWwuc2V0U3RhdGUoU3RhdGUuRU5EX1ZFUlRFWCk7CiAJCQkJCQllbHNlCi0JCQkJCQkJdG1wVmVydGV4U3RhdGUgPSBTdGF0ZS5GSU5BTF9WRVJURVg7CisJCQkJCQkJdG1wVmFsLnNldFN0YXRlKFN0YXRlLkZJTkFMX1ZFUlRFWCk7CiAJCQkJCX0KIAkJCQkJCQotCQkJCQl0bXBWYWwuc2V0U3RhdGUodG1wVmVydGV4U3RhdGUpOwogCQkJCQlpZihnZXRTdXBlcnN0ZXAoKSA9PSA1KXsKIAkJCQkJCWxlbmd0aE9mTWVyZ2VDaGFpblZlcnRleCA9IEdyYXBoVmVydGV4T3BlcmF0aW9uLms7Ci0JCQkJCQltZXJnZUNoYWluVmVydGV4SWQgPSB0bXBWZXJ0ZXh0SWQ7CisJCQkJCQltZXJnZUNoYWluVmVydGV4SWQgPSB0bXBWZXJ0ZXhJZDsKIAkJCQkJfQogCQkJCQllbHNlewogCQkJCQkJbGVuZ3RoT2ZNZXJnZUNoYWluVmVydGV4ID0gdG1wVmFsLmdldExlbmd0aE9mTWVyZ2VDaGFpbigpOyAKIAkJCQkJCW1lcmdlQ2hhaW5WZXJ0ZXhJZCA9IHRtcFZhbC5nZXRNZXJnZUNoYWluKCk7IAogCQkJCQl9Ci0JCQkJCW1lcmdlQ2hhaW5WZXJ0ZXhJZCA9IEdyYXBoVmVydGV4T3BlcmF0aW9uLm1lcmdlVHdvQ2hhaW5WZXJ0ZXgobWVyZ2VDaGFpblZlcnRleElkLAotCQkJCQkJCWxlbmd0aE9mTWVyZ2VDaGFpblZlcnRleCwgdG1wTXNnLmdldENoYWluVmVydGV4SWQoKSwgdG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSk7IC8vdG1wTXNnLmdldFNvdXJjZVZlcnRleElkKCkKKwkJCQkJbWVyZ2VDaGFpblZlcnRleElkID0gS21lclV0aWwubWVyZ2VUd29LbWVyKGxlbmd0aE9mTWVyZ2VDaGFpblZlcnRleCwgCisJCQkJCQkJbWVyZ2VDaGFpblZlcnRleElkLAorCQkJCQkJCXRtcE1zZy5nZXRMZW5ndGhPZkNoYWluKCkgLSBHcmFwaFZlcnRleE9wZXJhdGlvbi5rICsgMSwgCisJCQkJCQkJS21lclV0aWwuZ2V0TGFzdEttZXJGcm9tQ2hhaW4odG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSAtIEdyYXBoVmVydGV4T3BlcmF0aW9uLmsgKyAxLAorCQkJCQkJCQkJdG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSwgdG1wTXNnLmdldENoYWluVmVydGV4SWQoKSkpOwogCQkJCQlsZW5ndGhPZk1lcmdlQ2hhaW5WZXJ0ZXggPSBsZW5ndGhPZk1lcmdlQ2hhaW5WZXJ0ZXggKyB0bXBNc2cuZ2V0TGVuZ3RoT2ZDaGFpbigpCiAJCQkJCQkJLSBHcmFwaFZlcnRleE9wZXJhdGlvbi5rICsgMTsKIAkJCQkJdG1wVmFsLnNldExlbmd0aE9mTWVyZ2VDaGFpbihsZW5ndGhPZk1lcmdlQ2hhaW5WZXJ0ZXgpOwogCQkJCQl0bXBWYWwuc2V0TWVyZ2VDaGFpbihtZXJnZUNoYWluVmVydGV4SWQpOwogCQkJCQkKLQkJCQkJLy90ZXN0Ci0JCQkJCUdyYXBoVmVydGV4T3BlcmF0aW9uLnRlc3RNZXJnZUNoYWluVmVydGV4KHdyaXRlciwgZ2V0U3VwZXJzdGVwKCksCi0JCQkJCQkJbWVyZ2VDaGFpblZlcnRleElkLCBsZW5ndGhPZk1lcmdlQ2hhaW5WZXJ0ZXgpOwotCQkJCQlieXRlIHRtcEJ5dGUgPSB0bXBNc2cuZ2V0TmVpZ2hiZXJJbmZvKCk7Ci0JCQkJCXRtcFZlcnRleFZhbHVlID0gR3JhcGhWZXJ0ZXhPcGVyYXRpb24udXBkYXRlUmlnaHROZWlnaGJlcihnZXRWZXJ0ZXhWYWx1ZSgpLmdldFZhbHVlKCksdG1wQnl0ZSk7CisJCQkJCS8vbG9nCisJCQkJCWZvcm1hdHRlci5zZXRNZXJnZUNoYWluKGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXhJZCwgbGVuZ3RoT2ZNZXJnZUNoYWluVmVydGV4LCBtZXJnZUNoYWluVmVydGV4SWQsIEdyYXBoVmVydGV4T3BlcmF0aW9uLmspOworCQkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQkJbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaGFuZGxlcik7CisJCQkJCWhhbmRsZXIuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcik7CisJCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCQlsb2dnZXIuaW5mbygiIyMjIyMgTWVyZ2UgQ2hhaW4gSU5GTyAjIyMjIyIpOworCisJCQkJCXRtcFZlcnRleFZhbHVlID0gR3JhcGhWZXJ0ZXhPcGVyYXRpb24udXBkYXRlUmlnaHROZWlnaGJlcihnZXRWZXJ0ZXhWYWx1ZSgpLmdldFZhbHVlKCksdG1wTXNnLmdldE5laWdoYmVySW5mbygpKTsKIAkJCQkJdG1wVmFsLnNldFZhbHVlKHRtcFZlcnRleFZhbHVlKTsKLQkJCQkJaWYodG1wVmVydGV4U3RhdGUgIT0gU3RhdGUuRklOQUxfVkVSVEVYKXsKKwkJCQkJaWYodG1wTXNnLmdldE1lc3NhZ2UoKSAhPSBNZXNzYWdlLkVORCl7CiAJCQkJCQlzZXRWZXJ0ZXhWYWx1ZSh0bXBWYWwpOwotCQkJCQkJdG1wTXNnID0gbmV3IExvZ0FsZ29yaXRobU1lc3NhZ2VXcml0YWJsZSgpOworCQkJCQkJdG1wTXNnID0gbmV3IExvZ0FsZ29yaXRobU1lc3NhZ2VXcml0YWJsZSgpOyAvL3Jlc2V0CiAJCQkJCQl0bXBNc2cuc2V0TmVpZ2hiZXJJbmZvKHRtcFZlcnRleFZhbHVlKTsKIAkJCQkJCXNlbmRNc2coZ2V0VmVydGV4SWQoKSx0bXBNc2cpOwotCQkJCQkJLy90ZXN0Ci0JCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0TWVzc2FnZUNvbW11bmljYXRpb24yKHdyaXRlciwgZ2V0U3VwZXJzdGVwKCksIGdldFZlcnRleElkKCkuZ2V0Qnl0ZXMoKSwKLQkJCQkJCQkJdG1wVmVydGV4dElkLCB0bXBNc2csIG51bGwpOworCQkJCQkJCisJCQkJCQkvL2xvZworCQkJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCB0bXBWYWwuZ2V0U3RhdGUoKSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQkJCWxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJbG9nZ2VyLmluZm8oIiMjIyMjIGhlYWQgbm9kZSBzZW5kcyBtZXNzYWdlIHRvIHBhdGggbm9kZSEgIyMjIyMiKTsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZih0bXBWZXJ0ZXhTdGF0ZSA9PSBTdGF0ZS5FTkRfVkVSVEVYKXsKKwkJCQlpZih0bXBWYWwuZ2V0U3RhdGUoKSA9PSBTdGF0ZS5FTkRfVkVSVEVYKXsKIAkJCQkJdm90ZVRvSGFsdCgpOwotCQkJCQkvL3Rlc3QKLQkJCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdFZvdGVWZXJ0ZXhJbmZvKHdyaXRlciwgZ2V0U3VwZXJzdGVwKCksIHRtcFZlcnRleHRJZCwKLQkJCQkJCQkiIGl0IGlzIHRoZSByZWFyISIpOworCQkJCQkKKwkJCQkJLy9sb2cKKwkJCQkJZm9ybWF0dGVyLnNldFZvdG9Ub0hhbHQoZ2V0U3VwZXJzdGVwKCksIHRtcFZlcnRleElkLCBHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkJCQkJaWYobG9nZ2VyLmdldEhhbmRsZXJzKCkgIT0gbnVsbCkKKwkJCQkJCWxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOworCQkJCQloYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpOworCQkJCQlsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJbG9nZ2VyLmluZm8oIiMjIyMjIEJlY2F1c2UgaXQncyByZWFyISAjIyMjIyIpOworCQkJCQlmb3JtYXR0ZXIuc2V0T3BlcmF0aW9uKDApOwogCQkJCX0KLQkJCQlpZih0bXBWZXJ0ZXhTdGF0ZSA9PSBTdGF0ZS5GSU5BTF9WRVJURVgpeworCQkJCWlmKHRtcFZhbC5nZXRTdGF0ZSgpID09IFN0YXRlLkZJTkFMX1ZFUlRFWCl7CiAJCQkJCXZvdGVUb0hhbHQoKTsKLQkJCQkJdHJ5IHsKKwkJCQkJLyp0cnkgewogCQkJCQkJR3JhcGhWZXJ0ZXhPcGVyYXRpb24uZmx1c2hDaGFpblRvRmlsZSh0bXBWYWwuZ2V0TWVyZ2VDaGFpbigpLCAKLQkJCQkJCQkJdG1wVmFsLmdldExlbmd0aE9mTWVyZ2VDaGFpbigpLHRtcFZlcnRleHRJZCk7Ci0JCQkgICAgCQl3cml0ZXIud3JpdGUoIlN0ZXA6ICIgKyBnZXRTdXBlcnN0ZXAoKSArICJcclxuIik7Ci0JCQkgICAgCQl3cml0ZXIud3JpdGUoIkZsdXNoISAiICsgIlxyXG4iKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9CisJCQkJCQkJCXRtcFZhbC5nZXRMZW5ndGhPZk1lcmdlQ2hhaW4oKSx0bXBWZXJ0ZXhJZCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfSovCiAJCQkJfQogCQkJfQorCQkJCiAJCX0KLQkJdHJ5IHsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KIAl9Ci0JCi0gICBwcml2YXRlIHZvaWQgc2lnbmFsVGVybWluYXRlKCkgewotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBnZXRDb250ZXh0KCkuZ2V0Q29uZmlndXJhdGlvbigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSXRlcmF0aW9uVXRpbHMud3JpdGVGb3JjZVRlcm1pbmF0aW9uU3RhdGUoY29uZiwgQnNwVXRpbHMuZ2V0Sm9iSWQoY29uZikpOwotICAgICAgICAgICAgd3JpdGVNZXJnZUdyYXBoUmVzdWx0KGNvbmYsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgIAotICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWVyZ2VHcmFwaFJlc3VsdChDb25maWd1cmF0aW9uIGNvbmYsIGJvb2xlYW4gdGVybWluYXRlKSB7Ci0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgRmlsZVN5c3RlbSBkZnMgPSBGaWxlU3lzdGVtLmdldChjb25mKTsKLSAgICAgICAgICAgU3RyaW5nIHBhdGhTdHIgPSBJdGVyYXRpb25VdGlscy5UTVBfRElSICsgQnNwVXRpbHMuZ2V0Sm9iSWQoY29uZikgKyAiTWVyZ2VHcmFwaCI7Ci0gICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHIpOwotICAgICAgICAgICBpZiAoIWRmcy5leGlzdHMocGF0aCkpIHsKLSAgICAgICAgICAgICAgIEZTRGF0YU91dHB1dFN0cmVhbSBvdXRwdXQgPSBkZnMuY3JlYXRlKHBhdGgsIHRydWUpOwotICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlQm9vbGVhbih0ZXJtaW5hdGUpOwotICAgICAgICAgICAgICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKLSAgICAgICAgICAgfQotICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICB9Ci0gICB9CiAKIAkvKioKIAkgKiBAcGFyYW0gYXJncwpAQCAtMzQ0LDcgKzQwMyw3IEBACiAgICAgICAgIGpvYi5zZXRWZXJ0ZXhJbnB1dEZvcm1hdENsYXNzKExvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdC5jbGFzcyk7IAogICAgICAgICBqb2Iuc2V0VmVydGV4T3V0cHV0Rm9ybWF0Q2xhc3MoTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaE91dHB1dEZvcm1hdC5jbGFzcyk7IAogICAgICAgICBqb2Iuc2V0T3V0cHV0S2V5Q2xhc3MoQnl0ZXNXcml0YWJsZS5jbGFzcyk7Ci0gICAgICAgIGpvYi5zZXRPdXRwdXRWYWx1ZUNsYXNzKEJ5dGVXcml0YWJsZS5jbGFzcyk7CisgICAgICAgIGpvYi5zZXRPdXRwdXRWYWx1ZUNsYXNzKFZhbHVlU3RhdGVXcml0YWJsZS5jbGFzcyk7CiAgICAgICAgIENsaWVudC5ydW4oYXJncywgam9iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L01lcmdlR3JhcGhWZXJ0ZXguamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTWVyZ2VHcmFwaFZlcnRleC5qYXZhCmluZGV4IDBhNzdhOTQuLmE1YzQwYWQgMTAwNjQ0Ci0tLSBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTWVyZ2VHcmFwaFZlcnRleC5qYXZhCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTWVyZ2VHcmFwaFZlcnRleC5qYXZhCkBAIC0xLDE2ICsxLDEwIEBACiBwYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXg7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZTRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwogCkBAIC0xOCwxMiArMTIsMTMgQEAKIGltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnR5cGUuS21lclV0aWw7CiBpbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmdyYXBoLlZlcnRleDsKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuam9iLlByZWdlbGl4Sm9iOwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS51dGlsLkJzcFV0aWxzOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguYml0d2lzZS5CaXR3aXNlT3BlcmF0aW9uOwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmRhdGFmbG93LnV0aWwuSXRlcmF0aW9uVXRpbHM7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmNsaWVudC5DbGllbnQ7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvLk1lc3NhZ2VXcml0YWJsZTsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmhkZnMuSERGU09wZXJhdGlvbjsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmNsaWVudC5DbGllbnQ7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5mb3JtYXQuQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQ7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5mb3JtYXQuQmluYXJ5TG9hZEdyYXBoT3V0cHV0Rm9ybWF0OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW8uTWVzc2FnZVdyaXRhYmxlOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW8uVmFsdWVTdGF0ZVdyaXRhYmxlOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXgubG9nLk5haXZlQWxnb3JpdGhtTG9nRm9ybWF0dGVyOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXgudHlwZS5TdGF0ZTsKIAogLyoKICAqIHZlcnRleElkOiBCeXRlc1dyaXRhYmxlCkBAIC01MywxNDAgKzQ4LDE2OSBAQAogICogVGhlIHN1Y2NlZWQgbm9kZSBhbmQgcHJlY3Vyc29yIG5vZGUgd2lsbCBiZSBzdG9yZWQgaW4gdmVydGV4VmFsdWUgYW5kIHdlIGRvbid0IHVzZSBlZGdlVmFsdWUuCiAgKiBUaGUgZGV0YWlscyBhYm91dCBtZXNzYWdlIGFyZSBpbiBlZHUudWNpLmljcy5wcmVnZWxpeC5leGFtcGxlLmlvLk1lc3NhZ2VXcml0YWJsZS4gCiAgKi8KLXB1YmxpYyBjbGFzcyBNZXJnZUdyYXBoVmVydGV4IGV4dGVuZHMgVmVydGV4PEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCBNZXNzYWdlV3JpdGFibGU+eworcHVibGljIGNsYXNzIE1lcmdlR3JhcGhWZXJ0ZXggZXh0ZW5kcyBWZXJ0ZXg8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT57CiAJCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHZlcnRleCBpZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bUJ5dGVzID0gKEdyYXBoVmVydGV4T3BlcmF0aW9uLmstMSkvNCArIDE7Ci0gICAgcHJpdmF0ZSBCeXRlc1dyaXRhYmxlIHRtcFZlcnRleHRJZCA9IG5ldyBCeXRlc1dyaXRhYmxlKCk7Ci0JcHJpdmF0ZSBCeXRlc1dyaXRhYmxlIHRtcERlc3RWZXJ0ZXhJZCA9IG5ldyBCeXRlc1dyaXRhYmxlKCk7CisJcHVibGljIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihNZXJnZUdyYXBoVmVydGV4LmNsYXNzLmdldE5hbWUoKSk7IAorCU5haXZlQWxnb3JpdGhtTG9nRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBOYWl2ZUFsZ29yaXRobUxvZ0Zvcm1hdHRlcigpOworCXB1YmxpYyBzdGF0aWMgRmlsZUhhbmRsZXIgaGFuZGxlcjsKKwkKKyAgICBwcml2YXRlIGJ5dGVbXSB0bXBWZXJ0ZXhJZDsKKyAgICBwcml2YXRlIGJ5dGVbXSB0bXBEZXN0VmVydGV4SWQ7CisJcHJpdmF0ZSBCeXRlc1dyaXRhYmxlIGRlc3RWZXJ0ZXhJZCA9IG5ldyBCeXRlc1dyaXRhYmxlKCk7CiAJcHJpdmF0ZSBCeXRlc1dyaXRhYmxlIHRtcENoYWluVmVydGV4SWQgPSBuZXcgQnl0ZXNXcml0YWJsZSgpOwotCXByaXZhdGUgQnl0ZVdyaXRhYmxlIHRtcFZlcnRleFZhbHVlID0gbmV3IEJ5dGVXcml0YWJsZSgpOworCXByaXZhdGUgVmFsdWVTdGF0ZVdyaXRhYmxlIHRtcFZlcnRleFZhbHVlID0gbmV3IFZhbHVlU3RhdGVXcml0YWJsZSgpOwogCXByaXZhdGUgTWVzc2FnZVdyaXRhYmxlIHRtcE1zZyA9IG5ldyBNZXNzYWdlV3JpdGFibGUoKTsKLQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyOyAKIAkvKioKIAkgKiBOYWl2ZSBBbGdvcml0aG0gZm9yIHBhdGggbWVyZ2UgZ3JhcGgKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKKwkgKiBAdGhyb3dzICAKIAkgKi8KKwlwdWJsaWMgTWVyZ2VHcmFwaFZlcnRleCgpeworCQlpZihoYW5kbGVyID09IG51bGwpeworCQkJdHJ5IHsKKwkJCQloYW5kbGVyID0gbmV3IEZpbGVIYW5kbGVyKCJsb2cvIiArIE1lcmdlR3JhcGhWZXJ0ZXguY2xhc3MuZ2V0TmFtZSgpICsgIi5sb2ciKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7fSAKKwkJfQorCX0KKwkKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjb21wdXRlKEl0ZXJhdG9yPE1lc3NhZ2VXcml0YWJsZT4gbXNnSXRlcmF0b3IpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oInRlc3QvY2hlY2tfTmFpdmUiLHRydWUpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7IGUxLnByaW50U3RhY2tUcmFjZSgpO30KLQkJdG1wVmVydGV4dElkLnNldChHcmFwaFZlcnRleE9wZXJhdGlvbi5nZW5lcmF0ZVZhbGlkRGF0YUZyb21CeXRlc1dyaXRhYmxlKGdldFZlcnRleElkKCkpLDAsbnVtQnl0ZXMpOworCQkKKwkJdG1wVmVydGV4SWQgPSBHcmFwaFZlcnRleE9wZXJhdGlvbi5nZW5lcmF0ZVZhbGlkRGF0YUZyb21CeXRlc1dyaXRhYmxlKGdldFZlcnRleElkKCkpOwogCQlpZiAoZ2V0U3VwZXJzdGVwKCkgPT0gMSkgewotCQkJaWYoR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaXNIZWFkKGdldFZlcnRleFZhbHVlKCkpKXsgCi0JCQkJdG1wRGVzdFZlcnRleElkLnNldCh0bXBWZXJ0ZXh0SWQpOwotCQkJCS8vY2hhbmdlCi0JCQkJS21lci5tb3ZlS21lcihHcmFwaFZlcnRleE9wZXJhdGlvbi5rLCB0bXBEZXN0VmVydGV4SWQuZ2V0Qnl0ZXMoKSwgCi0JCQkJCQkoYnl0ZSlHcmFwaFZlcnRleE9wZXJhdGlvbi5maW5kU3VjY2VlZE5vZGUoZ2V0VmVydGV4VmFsdWUoKS5nZXQoKSkpOwotCQkJCS8vdG1wRGVzdFZlcnRleElkLnNldChHcmFwaFZlcnRleE9wZXJhdGlvbi5nZXREZXN0VmVydGV4SWQodG1wRGVzdFZlcnRleElkLmdldEJ5dGVzKCksCi0JCQkJLy8JCWdldFZlcnRleFZhbHVlKCkuZ2V0KCkpLCAwLCBudW1CeXRlcyk7IAotCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZCh0bXBWZXJ0ZXh0SWQuZ2V0Qnl0ZXMoKSk7CisJCQlpZihHcmFwaFZlcnRleE9wZXJhdGlvbi5pc0hlYWRWZXJ0ZXgoZ2V0VmVydGV4VmFsdWUoKS5nZXRWYWx1ZSgpKSl7IAorCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZCh0bXBWZXJ0ZXhJZCk7CisJCQkJdG1wTXNnLnNldEhlYWQodG1wVmVydGV4SWQpOwogCQkJCXRtcE1zZy5zZXRMZW5ndGhPZkNoYWluKDApOwogCQkJCXRtcE1zZy5zZXRDaGFpblZlcnRleElkKHRtcENoYWluVmVydGV4SWQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJc2VuZE1zZyh0bXBEZXN0VmVydGV4SWQsdG1wTXNnKTsKLQkJCQkvL3Rlc3QKLQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0TWVzc2FnZUNvbW11bmljYXRpb24od3JpdGVyLGdldFN1cGVyc3RlcCgpLHRtcFZlcnRleHRJZC5nZXRCeXRlcygpLAotCQkJCQkJdG1wRGVzdFZlcnRleElkLmdldEJ5dGVzKCksdG1wTXNnKTsKKwkJCQlmb3IoYnl0ZSB4ID0gS21lci5HRU5FX0NPREUuQTsgeDw9IEttZXIuR0VORV9DT0RFLlQgOyB4KyspeworCQkJCQlpZigoZ2V0VmVydGV4VmFsdWUoKS5nZXRWYWx1ZSgpICYgKDEgPDwgeCkpICE9IDApeworCQkJCQkJdG1wRGVzdFZlcnRleElkID0gS21lclV0aWwuc2hpZnRLbWVyV2l0aE5leHRDb2RlKEdyYXBoVmVydGV4T3BlcmF0aW9uLmssIHRtcFZlcnRleElkLCB4KTsKKwkJCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQkJCXNlbmRNc2coZGVzdFZlcnRleElkLHRtcE1zZyk7CisJCQkJCQkKKwkJCQkJCS8vbG9nCisJCQkJCQlmb3JtYXR0ZXIuc2V0KGdldFN1cGVyc3RlcCgpLCB0bXBWZXJ0ZXhJZCwgdG1wRGVzdFZlcnRleElkLCB0bXBNc2csIEdyYXBoVmVydGV4T3BlcmF0aW9uLmspOworCQkJCQkJaWYobG9nZ2VyLmdldEhhbmRsZXJzKCkgIT0gbnVsbCkKKwkJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCWhhbmRsZXIuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcik7CisJCQkJCQlsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBJdCBpcyB0aGUgaGVhZCEgIyMjIyMiKTsKKwkJCQkJfQogCQkJCX0KKwkJCX0KIAkJfQorCQkKIAkJLy9wYXRoIG5vZGUgc2VuZHMgbWVzc2FnZSBiYWNrIHRvIGhlYWQgbm9kZQogCQllbHNlIGlmKGdldFN1cGVyc3RlcCgpJTIgPT0gMCl7CisJCQkKIAkJCSBpZihtc2dJdGVyYXRvci5oYXNOZXh0KCkpewogCQkJCXRtcE1zZyA9IG1zZ0l0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCiAJCQkJaWYoIXRtcE1zZy5pc1JlYXIoKSl7Ci0JCQkJCWlmKEdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUGF0aFZlcnRleChnZXRWZXJ0ZXhWYWx1ZSgpKSl7Ci0JCQkJCQl0bXBEZXN0VmVydGV4SWQuc2V0KHRtcE1zZy5nZXRTb3VyY2VWZXJ0ZXhJZCgpLCAwLCBudW1CeXRlcyk7Ci0JCQkJCQl0bXBNc2cuc2V0TmVpZ2hiZXJJbmZvKGdldFZlcnRleFZhbHVlKCkuZ2V0KCkpOyAvL3NldCBuZWlnaGJlcgorCQkJCQlpZihnZXRTdXBlcnN0ZXAoKSA9PSAyKQorCQkJCQkJdG1wTXNnLnNldEhlYWQodG1wVmVydGV4SWQpOworCQkJCQlpZihHcmFwaFZlcnRleE9wZXJhdGlvbi5pc1BhdGhWZXJ0ZXgoZ2V0VmVydGV4VmFsdWUoKS5nZXRWYWx1ZSgpKSl7CisJCQkJCQl0bXBEZXN0VmVydGV4SWQgPSB0bXBNc2cuZ2V0U291cmNlVmVydGV4SWQoKTsKKwkJCQkJCXRtcE1zZy5zZXROZWlnaGJlckluZm8oZ2V0VmVydGV4VmFsdWUoKS5nZXRWYWx1ZSgpKTsgLy9zZXQgbmVpZ2hiZXIKIAkJCQkJCWlmKHRtcE1zZy5nZXRMZW5ndGhPZkNoYWluKCkgPT0gMCl7CiAJCQkJCQkJdG1wTXNnLnNldExlbmd0aE9mQ2hhaW4oR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7Ci0JCQkJCQkJdG1wTXNnLnNldENoYWluVmVydGV4SWQodG1wVmVydGV4dElkLmdldEJ5dGVzKCkpOworCQkJCQkJCXRtcE1zZy5zZXRDaGFpblZlcnRleElkKHRtcFZlcnRleElkKTsKIAkJCQkJCX0KIAkJCQkJCWVsc2V7Ci0JCQkJCQkJLyoKLQkJCQkJCQl0bXBNc2cuaW5jcmVtZW50TGVuZ3RoKCk7Ci0JCQkJCQkJdG1wTXNnLnNldENoYWluVmVydGV4SWQoR3JhcGhWZXJ0ZXhPcGVyYXRpb24udXBkYXRlQ2hhaW5WZXJ0ZXhJZCgKLQkJCQkJCQkJCXRtcENoYWluVmVydGV4SWQsCi0JCQkJCQkJCQl0bXBNc2cuZ2V0TGVuZ3RoT2ZDaGFpbigpLTEsCi0JCQkJCQkJCQl0bXBWZXJ0ZXh0SWQpKTsKLQkJCQkJCQkgKi8KLQkJCQkJCQkgLy9jaGFuZ2UKKwkJCQkJCQlTdHJpbmcgc291cmNlID0gS21lci5yZWNvdmVyS21lckZyb20oR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaywgdG1wVmVydGV4SWQsIDAsIHRtcFZlcnRleElkLmxlbmd0aCk7CiAJCQkJCQkJdG1wTXNnLnNldENoYWluVmVydGV4SWQoS21lclV0aWwubWVyZ2VLbWVyV2l0aE5leHRDb2RlKAogCQkJCQkJCQkJdG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSwKIAkJCQkJCQkJCXRtcE1zZy5nZXRDaGFpblZlcnRleElkKCksCi0JCQkJCQkJCQkoYnl0ZSlHcmFwaFZlcnRleE9wZXJhdGlvbi5maW5kU3VjY2VlZE5vZGUoZ2V0VmVydGV4VmFsdWUoKS5nZXQoKSkpKTsKKwkJCQkJCQkJCUttZXIuR0VORV9DT0RFLmdldENvZGVGcm9tU3ltYm9sKChieXRlKXNvdXJjZS5jaGFyQXQoc291cmNlLmxlbmd0aCgpIC0gMSkpKSk7CiAJCQkJCQkJdG1wTXNnLmluY3JlbWVudExlbmd0aCgpOwogCQkJCQkJCWRlbGV0ZVZlcnRleChnZXRWZXJ0ZXhJZCgpKTsKIAkJCQkJCX0KLQkJCQkJCXNlbmRNc2codG1wRGVzdFZlcnRleElkLHRtcE1zZyk7Ci0JCQkJCQkvL3Rlc3QKLQkJCQkJCUdyYXBoVmVydGV4T3BlcmF0aW9uLnRlc3RNZXNzYWdlQ29tbXVuaWNhdGlvbih3cml0ZXIsZ2V0U3VwZXJzdGVwKCksdG1wVmVydGV4dElkLmdldEJ5dGVzKCksCi0JCQkJCQkJCXRtcERlc3RWZXJ0ZXhJZC5nZXRCeXRlcygpLHRtcE1zZyk7CisJCQkJCQlkZXN0VmVydGV4SWQuc2V0KHRtcERlc3RWZXJ0ZXhJZCwgMCwgdG1wRGVzdFZlcnRleElkLmxlbmd0aCk7CisJCQkJCQlzZW5kTXNnKGRlc3RWZXJ0ZXhJZCx0bXBNc2cpOworCQkJCQkJCisJCQkJCQkvL2xvZworCQkJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCBHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkJCQkJCWlmKGxvZ2dlci5nZXRIYW5kbGVycygpICE9IG51bGwpCisJCQkJCQkJbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaGFuZGxlcik7CisJCQkJCQloYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpOworCQkJCQkJbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7CisJCQkJCQlsb2dnZXIuaW5mbygiIyMjIyMgSXQgaXMgdGhlIHBhdGghICMjIyMjIik7CiAJCQkJCX0KLQkJCQkJZWxzZSBpZihHcmFwaFZlcnRleE9wZXJhdGlvbi5pc1JlYXIoZ2V0VmVydGV4VmFsdWUoKSkpewotCQkJCQkJdG1wRGVzdFZlcnRleElkLnNldCh0bXBNc2cuZ2V0U291cmNlVmVydGV4SWQoKSwgMCwgbnVtQnl0ZXMpOwotCQkJCQkJdG1wTXNnLnNldFNvdXJjZVZlcnRleElkKHRtcFZlcnRleHRJZC5nZXRCeXRlcygpKTsKLQkJCQkJCXRtcE1zZy5zZXRSZWFyKHRydWUpOwotCQkJCQkJc2VuZE1zZyh0bXBEZXN0VmVydGV4SWQsdG1wTXNnKTsKLQkJCQkJCS8vdGVzdAotCQkJCQkJdHJ5IHsKLQkJCQkJCQl3cml0ZXIud3JpdGUoIkl0IGlzIFJlYXIhXHJcbiIpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0TWVzc2FnZUNvbW11bmljYXRpb24od3JpdGVyLGdldFN1cGVyc3RlcCgpLHRtcFZlcnRleHRJZC5nZXRCeXRlcygpLAotCQkJCQkJCQl0bXBEZXN0VmVydGV4SWQuZ2V0Qnl0ZXMoKSx0bXBNc2cpOworCQkJCQllbHNlIGlmKEdyYXBoVmVydGV4T3BlcmF0aW9uLmlzUmVhclZlcnRleChnZXRWZXJ0ZXhWYWx1ZSgpLmdldFZhbHVlKCkpKXsKKwkJCQkJCWlmKGdldFN1cGVyc3RlcCgpID09IDIpCisJCQkJCQkJdm90ZVRvSGFsdCgpOworCQkJCQkJZWxzZXsKKwkJCQkJCQl0bXBEZXN0VmVydGV4SWQgPSB0bXBNc2cuZ2V0U291cmNlVmVydGV4SWQoKTsKKwkJCQkJCQl0bXBNc2cuc2V0U291cmNlVmVydGV4SWQodG1wVmVydGV4SWQpOworCQkJCQkJCXRtcE1zZy5zZXRSZWFyKHRydWUpOworCQkJCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQkJCQlzZW5kTXNnKGRlc3RWZXJ0ZXhJZCx0bXBNc2cpOworCQorCQkJCQkJCS8vbG9nCisJCQkJCQkJZm9ybWF0dGVyLnNldChnZXRTdXBlcnN0ZXAoKSwgdG1wVmVydGV4SWQsIHRtcERlc3RWZXJ0ZXhJZCwgdG1wTXNnLCBHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkJCQkJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJCQloYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpOworCQkJCQkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBJdCBpcyB0aGUgcmVhciEgIyMjIyMhIik7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZXsKLQkJCQkJdG1wVmVydGV4VmFsdWUuc2V0KEdyYXBoVmVydGV4T3BlcmF0aW9uLnVwZGF0ZVJpZ2h0TmVpZ2hiZXJCeVZlcnRleElkKGdldFZlcnRleFZhbHVlKCkuZ2V0KCksCisJCQkJCXRtcFZlcnRleFZhbHVlLnNldFN0YXRlKFN0YXRlLlNUQVJUX1ZFUlRFWCk7CisJCQkJCXRtcFZlcnRleFZhbHVlLnNldFZhbHVlKEdyYXBoVmVydGV4T3BlcmF0aW9uLnVwZGF0ZVJpZ2h0TmVpZ2hiZXJCeVZlcnRleElkKGdldFZlcnRleFZhbHVlKCkuZ2V0VmFsdWUoKSwKIAkJCQkJCQl0bXBNc2cuZ2V0U291cmNlVmVydGV4SWQoKSkpOworCQkJCQl0bXBWZXJ0ZXhWYWx1ZS5zZXRMZW5ndGhPZk1lcmdlQ2hhaW4odG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSk7CisJCQkJCXRtcFZlcnRleFZhbHVlLnNldE1lcmdlQ2hhaW4odG1wTXNnLmdldENoYWluVmVydGV4SWQoKSk7CisJCQkJCXNldFZlcnRleFZhbHVlKHRtcFZlcnRleFZhbHVlKTsKIAkJCQkJdHJ5IHsKKwkJCQkJCVN0cmluZyBzb3VyY2UgPSBLbWVyLnJlY292ZXJLbWVyRnJvbSh0bXBNc2cuZ2V0TGVuZ3RoT2ZDaGFpbigpLCB0bXBNc2cuZ2V0Q2hhaW5WZXJ0ZXhJZCgpLCAwLCB0bXBNc2cuZ2V0Q2hhaW5WZXJ0ZXhJZCgpLmxlbmd0aCk7CiAJCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi5mbHVzaENoYWluVG9GaWxlKHRtcE1zZy5nZXRDaGFpblZlcnRleElkKCksIAotCQkJCQkJCQl0bXBNc2cuZ2V0TGVuZ3RoT2ZDaGFpbigpLHRtcFZlcnRleHRJZC5nZXRCeXRlcygpKTsKKwkJCQkJCQkJdG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSx0bXBWZXJ0ZXhJZCk7CiAJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotCQkJCQkvL3Rlc3QKLQkJICAgICAgICAJR3JhcGhWZXJ0ZXhPcGVyYXRpb24udGVzdExhc3RNZXNzYWdlQ29tbXVuaWNhdGlvbih3cml0ZXIsZ2V0U3VwZXJzdGVwKCksdG1wVmVydGV4dElkLmdldEJ5dGVzKCksCi0JCSAgICAgICAgCQkJdG1wRGVzdFZlcnRleElkLmdldEJ5dGVzKCksdG1wTXNnKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJLy9oZWFkIG5vZGUgc2VuZHMgbWVzc2FnZSB0byBwYXRoIG5vZGUKIAkJZWxzZSBpZihnZXRTdXBlcnN0ZXAoKSUyID09IDEpewotCQkJaWYgKG1zZ0l0ZXJhdG9yLmhhc05leHQoKSl7CisJCQl3aGlsZSAobXNnSXRlcmF0b3IuaGFzTmV4dCgpKXsKIAkJCQl0bXBNc2cgPSBtc2dJdGVyYXRvci5uZXh0KCk7CiAJCQkJaWYoIXRtcE1zZy5pc1JlYXIoKSl7CiAJCQkJCWJ5dGVbXSBsYXN0S21lciA9IEttZXJVdGlsLmdldExhc3RLbWVyRnJvbUNoYWluKEdyYXBoVmVydGV4T3BlcmF0aW9uLmssCiAJCQkJCQkJdG1wTXNnLmdldExlbmd0aE9mQ2hhaW4oKSwKIAkJCQkJCQl0bXBNc2cuZ2V0Q2hhaW5WZXJ0ZXhJZCgpKTsKLQkJCQkJLy9ieXRlW10gbGFzdEttZXIgPSBHcmFwaFZlcnRleE9wZXJhdGlvbi5nZXRMYXN0S21lcih0bXBNc2cuZ2V0Q2hhaW5WZXJ0ZXhJZCgpLCAKLQkJCQkJLy8JCXRtcE1zZy5nZXRMZW5ndGhPZkNoYWluKCkpOwotCQkJCQl0bXBEZXN0VmVydGV4SWQuc2V0KGxhc3RLbWVyLCAwLCBudW1CeXRlcyk7Ci0JCQkJCS8vY2hhbmdlCi0JCQkJCUttZXIubW92ZUttZXIoR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaywgdG1wRGVzdFZlcnRleElkLmdldEJ5dGVzKCksIAotCQkJCQkJCShieXRlKUdyYXBoVmVydGV4T3BlcmF0aW9uLmZpbmRTdWNjZWVkTm9kZShnZXRWZXJ0ZXhWYWx1ZSgpLmdldCgpKSk7Ci0JCQkJCS8vdG1wRGVzdFZlcnRleElkLnNldChHcmFwaFZlcnRleE9wZXJhdGlvbi5nZXREZXN0VmVydGV4SWQobGFzdEttZXIsCi0JCQkJCS8vCQl0bXBNc2cuZ2V0TmVpZ2hiZXJJbmZvKCkpLCAwLCBudW1CeXRlcyk7Ci0JCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZCh0bXBWZXJ0ZXh0SWQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXNlbmRNc2codG1wRGVzdFZlcnRleElkLHRtcE1zZyk7Ci0JCQkJCS8vdGVzdAotCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0TWVzc2FnZUNvbW11bmljYXRpb24od3JpdGVyLGdldFN1cGVyc3RlcCgpLHRtcFZlcnRleHRJZC5nZXRCeXRlcygpLAotCQkJCQkJCXRtcERlc3RWZXJ0ZXhJZC5nZXRCeXRlcygpLHRtcE1zZyk7CisJCQkJCXRtcERlc3RWZXJ0ZXhJZCA9IEttZXJVdGlsLnNoaWZ0S21lcldpdGhOZXh0Q29kZShHcmFwaFZlcnRleE9wZXJhdGlvbi5rLCBsYXN0S21lciwgCisJCQkJCQkJS21lci5HRU5FX0NPREUuZ2V0R2VuZUNvZGVGcm9tQml0TWFwKChieXRlKSh0bXBNc2cuZ2V0TmVpZ2hiZXJJbmZvKCkgJiAweDBGKSkpOworCisJCQkJCXRtcE1zZy5zZXRTb3VyY2VWZXJ0ZXhJZCh0bXBWZXJ0ZXhJZCk7CisJCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQkJc2VuZE1zZyhkZXN0VmVydGV4SWQsdG1wTXNnKTsKKwkJCQkJCisJCQkJCS8vbG9nCisJCQkJCWZvcm1hdHRlci5zZXQoZ2V0U3VwZXJzdGVwKCksIHRtcFZlcnRleElkLCB0bXBEZXN0VmVydGV4SWQsIHRtcE1zZywgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCWlmKGxvZ2dlci5nZXRIYW5kbGVycygpICE9IG51bGwpCisJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7CisJCQkJCWxvZ2dlci5pbmZvKCIiKTsKIAkJCQl9CiAJCQkJZWxzZXsJCi0JCQkJCXRtcERlc3RWZXJ0ZXhJZC5zZXQodG1wVmVydGV4dElkKTsKLQkJCQkJLy9jaGFuZ2UKLQkJCQkJS21lci5tb3ZlS21lcihHcmFwaFZlcnRleE9wZXJhdGlvbi5rLCB0bXBEZXN0VmVydGV4SWQuZ2V0Qnl0ZXMoKSwgCi0JCQkJCQkJKGJ5dGUpR3JhcGhWZXJ0ZXhPcGVyYXRpb24uZmluZFN1Y2NlZWROb2RlKGdldFZlcnRleFZhbHVlKCkuZ2V0KCkpKTsKLQkJCQkJLy90bXBEZXN0VmVydGV4SWQuc2V0KEdyYXBoVmVydGV4T3BlcmF0aW9uLmdldERlc3RWZXJ0ZXhJZCh0bXBWZXJ0ZXh0SWQuZ2V0Qnl0ZXMoKSwKLQkJCQkJLy8JCWdldFZlcnRleFZhbHVlKCkuZ2V0KCkpLCAwLCBudW1CeXRlcyk7Ci0JCQkJCXNlbmRNc2codG1wRGVzdFZlcnRleElkLHRtcE1zZyk7Ci0JCQkJCS8vdGVzdAotCQkJCQlHcmFwaFZlcnRleE9wZXJhdGlvbi50ZXN0TWVzc2FnZUNvbW11bmljYXRpb24od3JpdGVyLGdldFN1cGVyc3RlcCgpLHRtcFZlcnRleHRJZC5nZXRCeXRlcygpLAotCQkJCQkJCXRtcERlc3RWZXJ0ZXhJZC5nZXRCeXRlcygpLHRtcE1zZyk7CisJCQkJCXRtcERlc3RWZXJ0ZXhJZCA9IHRtcE1zZy5nZXRIZWFkKCk7CisJCQkJCWRlc3RWZXJ0ZXhJZC5zZXQodG1wRGVzdFZlcnRleElkLCAwLCB0bXBEZXN0VmVydGV4SWQubGVuZ3RoKTsKKwkJCQkJc2VuZE1zZyhkZXN0VmVydGV4SWQsdG1wTXNnKTsKKwkJCQkJCisJCQkJCS8vbG9nCisJCQkJCWZvcm1hdHRlci5zZXQoZ2V0U3VwZXJzdGVwKCksIHRtcFZlcnRleElkLCB0bXBEZXN0VmVydGV4SWQsIHRtcE1zZywgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQkJCWlmKGxvZ2dlci5nZXRIYW5kbGVycygpICE9IG51bGwpCisJCQkJCQlsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKwkJCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCQkJbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7CisJCQkJCWxvZ2dlci5pbmZvKCIjIyMjIyBSZWFyIGlzIHNlbnQgYmFjayEgIyMjIyMiKTsKIAkJCQl9CiAJCQl9CiAJCX0KLQkJdHJ5IHsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KKwkJCiAJCXZvdGVUb0hhbHQoKTsKIAl9CiAKQEAgLTIwMiw3ICsyMjYsNyBAQAogICAgICAgICBqb2Iuc2V0VmVydGV4SW5wdXRGb3JtYXRDbGFzcyhCaW5hcnlMb2FkR3JhcGhJbnB1dEZvcm1hdC5jbGFzcyk7IAogICAgICAgICBqb2Iuc2V0VmVydGV4T3V0cHV0Rm9ybWF0Q2xhc3MoQmluYXJ5TG9hZEdyYXBoT3V0cHV0Rm9ybWF0LmNsYXNzKTsgCiAgICAgICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhCeXRlc1dyaXRhYmxlLmNsYXNzKTsKLSAgICAgICAgam9iLnNldE91dHB1dFZhbHVlQ2xhc3MoQnl0ZVdyaXRhYmxlLmNsYXNzKTsKKyAgICAgICAgam9iLnNldE91dHB1dFZhbHVlQ2xhc3MoVmFsdWVTdGF0ZVdyaXRhYmxlLmNsYXNzKTsKICAgICAgICAgQ2xpZW50LnJ1bihhcmdzLCBqb2IpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvVGVzdExvYWRHcmFwaFZlcnRleC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9UZXN0TG9hZEdyYXBoVmVydGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDlkZjYuLjAwMDAwMDAKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9UZXN0TG9hZEdyYXBoVmVydGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi1wYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKLQotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5ncmFwaC5WZXJ0ZXg7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmpvYi5QcmVnZWxpeEpvYjsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmJpdHdpc2UuQml0d2lzZU9wZXJhdGlvbjsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuY2xpZW50LkNsaWVudDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuaW8uTWVzc2FnZVdyaXRhYmxlOwotCi0vKgotICogdmVydGV4SWQ6IEJ5dGVzV3JpdGFibGUKLSAqIHZlcnRleFZhbHVlOiBCeXRlV3JpdGFibGUKLSAqIGVkZ2VWYWx1ZTogTnVsbFdyaXRhYmxlCi0gKiBtZXNzYWdlOiBNZXNzYWdlV3JpdGFibGUKLSAqIAotICogRE5BOgotICogQTogMDAKLSAqIEM6IDAxCi0gKiBHOiAxMAotICogVDogMTEKLSAqIAotICogc3VjY2VlZCBub2RlCi0gKiAgQSAwMDAwMDAwMSAxCi0gKiAgRyAwMDAwMDAxMCAyCi0gKiAgQyAwMDAwMDEwMCA0Ci0gKiAgVCAwMDAwMTAwMCA4Ci0gKiBwcmVjdXJzb3Igbm9kZQotICogIEEgMDAwMTAwMDAgMTYKLSAqICBHIDAwMTAwMDAwIDMyCi0gKiAgQyAwMTAwMDAwMCA2NAotICogIFQgMTAwMDAwMDAgMTI4Ci0gKiAgCi0gKiBGb3IgZXhhbXBsZSwgT05FIExJTkUgaW4gaW5wdXQgZmlsZTogMDAsMDEsMTAJMDAwMSwwMDEwLAotICogVGhhdCBtZWFucyB0aGF0IHZlcnRleElkIGlzIEFDRywgaXRzIHN1Y2NlZWQgbm9kZSBpcyBBIGFuZCBpdHMgcHJlY3Vyc29yIG5vZGUgaXMgQy4KLSAqIFRoZSBzdWNjZWVkIG5vZGUgYW5kIHByZWN1cnNvciBub2RlIHdpbGwgYmUgc3RvcmVkIGluIHZlcnRleFZhbHVlIGFuZCB3ZSBkb24ndCB1c2UgZWRnZVZhbHVlLgotICogVGhlIGRldGFpbHMgYWJvdXQgbWVzc2FnZSBhcmUgaW4gZWR1LnVjaS5pY3MucHJlZ2VsaXguZXhhbXBsZS5pby5NZXNzYWdlV3JpdGFibGUuIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdExvYWRHcmFwaFZlcnRleCBleHRlbmRzIFZlcnRleDxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTWVzc2FnZVdyaXRhYmxlPnsKLQotCS8qKgotCSAqIEZvciB0ZXN0LCBqdXN0IG91dHB1dCBvcmlnaW5hbCBmaWxlCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29tcHV0ZShJdGVyYXRvcjxNZXNzYWdlV3JpdGFibGU+IG1zZ0l0ZXJhdG9yKSB7Ci0JCXZvdGVUb0hhbHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQkvL2ZpbmFsIGludCBrID0gSW50ZWdlci5wYXJzZUludChhcmdzWzBdKTsKLSAgICAgICAgUHJlZ2VsaXhKb2Igam9iID0gbmV3IFByZWdlbGl4Sm9iKFRlc3RMb2FkR3JhcGhWZXJ0ZXguY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgam9iLnNldFZlcnRleENsYXNzKFRlc3RMb2FkR3JhcGhWZXJ0ZXguY2xhc3MpOwotICAgICAgICAvKioKLSAgICAgICAgICogQmluYXJ5SW5wdXQgYW5kIEJpbmFyeU91dHB1dAotICAgICAgICAgKi8KLSAgICAgICAgam9iLnNldFZlcnRleElucHV0Rm9ybWF0Q2xhc3MoQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQuY2xhc3MpOyAKLSAgICAgICAgam9iLnNldFZlcnRleE91dHB1dEZvcm1hdENsYXNzKEJpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5jbGFzcyk7IAotICAgICAgICBqb2Iuc2V0T3V0cHV0S2V5Q2xhc3MoQnl0ZXNXcml0YWJsZS5jbGFzcyk7Ci0gICAgICAgIGpvYi5zZXRPdXRwdXRWYWx1ZUNsYXNzKEJ5dGVXcml0YWJsZS5jbGFzcyk7Ci0gICAgICAgIENsaWVudC5ydW4oYXJncywgam9iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L1RleHRMb2FkR3JhcGhJbnB1dEZvcm1hdC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9UZXh0TG9hZEdyYXBoSW5wdXRGb3JtYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjNjYwZS4uMDAwMDAwMAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L1RleHRMb2FkR3JhcGhJbnB1dEZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkxvbmdXcml0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5OdWxsV3JpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7Ci0KLWltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuZ3JhcGguVmVydGV4OwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5pby5WZXJ0ZXhSZWFkZXI7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmlvLnRleHQuVGV4dFZlcnRleElucHV0Rm9ybWF0OwotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS51dGlsLkJzcFV0aWxzOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5pby5NZXNzYWdlV3JpdGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0TG9hZEdyYXBoSW5wdXRGb3JtYXQgZXh0ZW5kcwotCQlUZXh0VmVydGV4SW5wdXRGb3JtYXQ8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT57Ci0JCi0JLyoqCi0JICogRm9ybWF0IElOUFVUCi0JICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZlcnRleFJlYWRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTWVzc2FnZVdyaXRhYmxlPiBjcmVhdGVWZXJ0ZXhSZWFkZXIoCi0gICAgICAgICAgICBJbnB1dFNwbGl0IHNwbGl0LCBUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXh0TG9hZEdyYXBoUmVhZGVyKHRleHRJbnB1dEZvcm1hdC5jcmVhdGVSZWNvcmRSZWFkZXIoc3BsaXQsIGNvbnRleHQpKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBjbGFzcyBUZXh0TG9hZEdyYXBoUmVhZGVyIGV4dGVuZHMKLSAgICAgICAgICAgIFRleHRWZXJ0ZXhSZWFkZXI8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT4gewotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgc2VwYXJhdG9yID0gIiAiOwotICAgICAgICBwcml2YXRlIFZlcnRleCB2ZXJ0ZXg7Ci0gICAgICAgIHByaXZhdGUgQnl0ZXNXcml0YWJsZSB2ZXJ0ZXhJZCA9IG5ldyBCeXRlc1dyaXRhYmxlKCk7Ci0gICAgICAgIHByaXZhdGUgQnl0ZVdyaXRhYmxlIHZlcnRleFZhbHVlID0gbmV3IEJ5dGVXcml0YWJsZSgpOwotCi0gICAgICAgIHB1YmxpYyBUZXh0TG9hZEdyYXBoUmVhZGVyKFJlY29yZFJlYWRlcjxMb25nV3JpdGFibGUsIFRleHQ+IGxpbmVSZWNvcmRSZWFkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGxpbmVSZWNvcmRSZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG5leHRWZXJ0ZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZWNvcmRSZWFkZXIoKS5uZXh0S2V5VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZlcnRleDxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTWVzc2FnZVdyaXRhYmxlPiBnZXRDdXJyZW50VmVydGV4KCkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICh2ZXJ0ZXggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB2ZXJ0ZXggPSAoVmVydGV4KSBCc3BVdGlscy5jcmVhdGVWZXJ0ZXgoZ2V0Q29udGV4dCgpLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0KLSAgICAgICAgICAgIHZlcnRleC5nZXRNc2dMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgIHZlcnRleC5nZXRFZGdlcygpLmNsZWFyKCk7Ci0gICAgICAgICAgICBUZXh0IGxpbmUgPSBnZXRSZWNvcmRSZWFkZXIoKS5nZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IGxpbmUudG9TdHJpbmcoKS5zcGxpdChzZXBhcmF0b3IpOwotCi0gICAgICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBzZXQgdGhlIHNyYyB2ZXJ0ZXggaWQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAlCeXRlc1dyaXRhYmxlIHNyYyA9IG5ldyBCeXRlc1dyaXRhYmxlKGZpZWxkc1swXS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICB2ZXJ0ZXhJZC5zZXQoc3JjKTsKLSAgICAgICAgICAgICAgICB2ZXJ0ZXguc2V0VmVydGV4SWQodmVydGV4SWQpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogc2V0IHRoZSB2ZXJ0ZXggdmFsdWUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBieXRlW10gdGVtcCA9IGZpZWxkc1sxXS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgIHZlcnRleFZhbHVlLnNldCh0ZW1wWzBdKTsKLSAgICAgICAgICAgICAgICB2ZXJ0ZXguc2V0VmVydGV4VmFsdWUodmVydGV4VmFsdWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZlcnRleDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9hcGkvaW8vYmluYXJ5L0JpbmFyeVZlcnRleElucHV0Rm9ybWF0LmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2FwaS9pby9iaW5hcnkvQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQuamF2YQppbmRleCA1MWVjZWVlLi44MjNhOTg0IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2FwaS9pby9iaW5hcnkvQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2FwaS9pby9iaW5hcnkvQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5pby5WZXJ0ZXhSZWFkZXI7CiBpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXJDb3VudFZhbHVlOwogCi1wdWJsaWMgY2xhc3MgQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQgPEkgZXh0ZW5kcyBXcml0YWJsZUNvbXBhcmFibGUsIFYgZXh0ZW5kcyBXcml0YWJsZSwgRSBleHRlbmRzIFdyaXRhYmxlLCBNIGV4dGVuZHMgV3JpdGFibGU+CitwdWJsaWMgY2xhc3MgQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQgPEkgZXh0ZW5kcyBXcml0YWJsZUNvbXBhcmFibGU8Pz4sIFYgZXh0ZW5kcyBXcml0YWJsZSwgRSBleHRlbmRzIFdyaXRhYmxlLCBNIGV4dGVuZHMgV3JpdGFibGU+CiAJZXh0ZW5kcyBWZXJ0ZXhJbnB1dEZvcm1hdDxJLCBWLCBFLCBNPnsKIAkKICAgICAvKiogVXNlcyB0aGUgU2VxdWVuY2VGaWxlSW5wdXRGb3JtYXQgdG8gZG8gZXZlcnl0aGluZyAqLwpAQCAtMzQsNyArMzQsNyBAQAogICAgICAqIEBwYXJhbSA8RT4KICAgICAgKiAgICAgICAgICAgIEVkZ2UgdmFsdWUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeVZlcnRleFJlYWRlcjxJIGV4dGVuZHMgV3JpdGFibGVDb21wYXJhYmxlLCBWIGV4dGVuZHMgV3JpdGFibGUsIEUgZXh0ZW5kcyBXcml0YWJsZSwgTSBleHRlbmRzIFdyaXRhYmxlPgorICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5VmVydGV4UmVhZGVyPEkgZXh0ZW5kcyBXcml0YWJsZUNvbXBhcmFibGU8Pz4sIFYgZXh0ZW5kcyBXcml0YWJsZSwgRSBleHRlbmRzIFdyaXRhYmxlLCBNIGV4dGVuZHMgV3JpdGFibGU+CiAgICAgICAgICAgICBpbXBsZW1lbnRzIFZlcnRleFJlYWRlcjxJLCBWLCBFLCBNPiB7CiAgICAgICAgIC8qKiBJbnRlcm5hbCBsaW5lIHJlY29yZCByZWFkZXIgKi8KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNvcmRSZWFkZXI8Qnl0ZXNXcml0YWJsZSxLbWVyQ291bnRWYWx1ZT4gbGluZVJlY29yZFJlYWRlcjsKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvYXBpL2lvL2JpbmFyeS9CaW5hcnlWZXJ0ZXhPdXRwdXRGb3JtYXQuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvYXBpL2lvL2JpbmFyeS9CaW5hcnlWZXJ0ZXhPdXRwdXRGb3JtYXQuamF2YQppbmRleCAyYmZhZjkwLi5mNDk3ZjIxIDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2FwaS9pby9iaW5hcnkvQmluYXJ5VmVydGV4T3V0cHV0Rm9ybWF0LmphdmEKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9hcGkvaW8vYmluYXJ5L0JpbmFyeVZlcnRleE91dHB1dEZvcm1hdC5qYXZhCkBAIC0yLDcgKzIsNiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLldyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLldyaXRhYmxlQ29tcGFyYWJsZTsKQEAgLTEyLDYgKzExLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0F0dGVtcHRDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIub3V0cHV0LlNlcXVlbmNlRmlsZU91dHB1dEZvcm1hdDsKIAoraW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW8uVmFsdWVTdGF0ZVdyaXRhYmxlOwogaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5pby5WZXJ0ZXhPdXRwdXRGb3JtYXQ7CiBpbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmlvLlZlcnRleFdyaXRlcjsKIApAQCAtNDksNyArNDksNyBAQAogICAgICAgICAvKiogQ29udGV4dCBwYXNzZWQgdG8gaW5pdGlhbGl6ZSAqLwogICAgICAgICBwcml2YXRlIFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0OwogICAgICAgICAvKiogSW50ZXJuYWwgbGluZSByZWNvcmQgd3JpdGVyICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjb3JkV3JpdGVyPEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZT4gbGluZVJlY29yZFdyaXRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlPiBsaW5lUmVjb3JkV3JpdGVyOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbml0aWFsaXplIHdpdGggdGhlIExpbmVSZWNvcmRXcml0ZXIuCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgICAqIEBwYXJhbSBsaW5lUmVjb3JkV3JpdGVyCiAgICAgICAgICAqICAgICAgICAgICAgTGluZSByZWNvcmQgd3JpdGVyIGZyb20gU2VxdWVuY2VGaWxlT3V0cHV0Rm9ybWF0CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQmluYXJ5VmVydGV4V3JpdGVyKFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGU+IGxpbmVSZWNvcmRXcml0ZXIpIHsKKyAgICAgICAgcHVibGljIEJpbmFyeVZlcnRleFdyaXRlcihSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlPiBsaW5lUmVjb3JkV3JpdGVyKSB7CiAgICAgICAgICAgICB0aGlzLmxpbmVSZWNvcmRXcml0ZXIgPSBsaW5lUmVjb3JkV3JpdGVyOwogICAgICAgICB9CiAKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgICogCiAgICAgICAgICAqIEByZXR1cm4gUmVjb3JkIHdyaXRlciB0byBiZSB1c2VkIGZvciB3cml0aW5nLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGU+IGdldFJlY29yZFdyaXRlcigpIHsKKyAgICAgICAgcHVibGljIFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBWYWx1ZVN0YXRlV3JpdGFibGU+IGdldFJlY29yZFdyaXRlcigpIHsKICAgICAgICAgICAgIHJldHVybiBsaW5lUmVjb3JkV3JpdGVyOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9jbGllbnQvQ2xpZW50LmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvY2xpZW50L0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA3NzEzLi4wMDAwMDAwCi0tLSBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9jbGllbnQvQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0KLXBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIuaW5wdXQuRmlsZUlucHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIub3V0cHV0LkZpbGVPdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkNtZExpbmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkNtZExpbmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKLQotaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5qb2IuUHJlZ2VsaXhKb2I7Ci1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguY29yZS5iYXNlLklEcml2ZXIuUGxhbjsKLWltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5jb3JlLmRyaXZlci5Ecml2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3B0aW9ucyB7Ci0gICAgICAgIEBPcHRpb24obmFtZSA9ICItaW5wdXRwYXRocyIsIHVzYWdlID0gImNvbW1hIHNlcHJhdGVkIGlucHV0IHBhdGhzIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgICAgICBwdWJsaWMgU3RyaW5nIGlucHV0UGF0aHM7Ci0KLSAgICAgICAgQE9wdGlvbihuYW1lID0gIi1vdXRwdXRwYXRoIiwgdXNhZ2UgPSAib3V0cHV0IHBhdGgiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0UGF0aDsKLQotICAgICAgICBAT3B0aW9uKG5hbWUgPSAiLWlwIiwgdXNhZ2UgPSAiaXAgYWRkcmVzcyBvZiBjbHVzdGVyIGNvbnRyb2xsZXIiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgaXBBZGRyZXNzOwotCi0gICAgICAgIEBPcHRpb24obmFtZSA9ICItcG9ydCIsIHVzYWdlID0gInBvcnQgb2YgY2x1c3RlciBjb250cm9sbGVyIiwgcmVxdWlyZWQgPSBmYWxzZSkKLSAgICAgICAgcHVibGljIGludCBwb3J0OwotCi0gICAgICAgIEBPcHRpb24obmFtZSA9ICItcGxhbiIsIHVzYWdlID0gInF1ZXJ5IHBsYW4gY2hvaWNlIiwgcmVxdWlyZWQgPSBmYWxzZSkKLSAgICAgICAgcHVibGljIFBsYW4gcGxhbkNob2ljZSA9IFBsYW4uT1VURVJfSk9JTjsKLQotICAgICAgICBAT3B0aW9uKG5hbWUgPSAiLXJ1bnRpbWUtcHJvZmlsaW5nIiwgdXNhZ2UgPSAid2hldGhlciB0byBkbyBydW50aW1lIHByb2ZpZmxpbmciLCByZXF1aXJlZCA9IGZhbHNlKQotICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2ZpbGluZyA9ICJmYWxzZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bihTdHJpbmdbXSBhcmdzLCBQcmVnZWxpeEpvYiBqb2IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBwcmVwYXJlSm9iKGFyZ3MsIGpvYik7Ci0gICAgICAgIERyaXZlciBkcml2ZXIgPSBuZXcgRHJpdmVyKENsaWVudC5jbGFzcyk7Ci0gICAgICAgIGRyaXZlci5ydW5Kb2Ioam9iLCBvcHRpb25zLnBsYW5DaG9pY2UsIG9wdGlvbnMuaXBBZGRyZXNzLCBvcHRpb25zLnBvcnQsIEJvb2xlYW4ucGFyc2VCb29sZWFuKG9wdGlvbnMucHJvZmlsaW5nKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9ucyBwcmVwYXJlSm9iKFN0cmluZ1tdIGFyZ3MsIFByZWdlbGl4Sm9iIGpvYikgdGhyb3dzIENtZExpbmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgQ21kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgQ21kTGluZVBhcnNlcihvcHRpb25zKTsKLSAgICAgICAgcGFyc2VyLnBhcnNlQXJndW1lbnQoYXJncyk7Ci0KLSAgICAgICAgU3RyaW5nW10gaW5wdXRzID0gb3B0aW9ucy5pbnB1dFBhdGhzLnNwbGl0KCI7Iik7Ci0gICAgICAgIEZpbGVJbnB1dEZvcm1hdC5zZXRJbnB1dFBhdGhzKGpvYiwgaW5wdXRzWzBdKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBGaWxlSW5wdXRGb3JtYXQuYWRkSW5wdXRQYXRocyhqb2IsIGlucHV0c1swXSk7Ci0gICAgICAgIEZpbGVPdXRwdXRGb3JtYXQuc2V0T3V0cHV0UGF0aChqb2IsIG5ldyBQYXRoKG9wdGlvbnMub3V0cHV0UGF0aCkpOwotICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZm9ybWF0L0JpbmFyeUxvYWRHcmFwaElucHV0Rm9ybWF0LmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2Zvcm1hdC9CaW5hcnlMb2FkR3JhcGhJbnB1dEZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDFiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2Zvcm1hdC9CaW5hcnlMb2FkR3JhcGhJbnB1dEZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKK3BhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5mb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7CisKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnR5cGUuS21lckNvdW50VmFsdWU7CitpbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmdyYXBoLlZlcnRleDsKK2ltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuaW8uVmVydGV4UmVhZGVyOworaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS51dGlsLkJzcFV0aWxzOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguR3JhcGhWZXJ0ZXhPcGVyYXRpb247CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5pby5NZXNzYWdlV3JpdGFibGU7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5pby5WYWx1ZVN0YXRlV3JpdGFibGU7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5pby5WYWx1ZVdyaXRhYmxlOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXgubG9nLkRhdGFMb2FkTG9nRm9ybWF0dGVyOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguYXBpLmlvLmJpbmFyeS5CaW5hcnlWZXJ0ZXhJbnB1dEZvcm1hdDsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmFwaS5pby5iaW5hcnkuQmluYXJ5VmVydGV4SW5wdXRGb3JtYXQuQmluYXJ5VmVydGV4UmVhZGVyOworCitwdWJsaWMgY2xhc3MgQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQgZXh0ZW5kcworCUJpbmFyeVZlcnRleElucHV0Rm9ybWF0PEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCBNZXNzYWdlV3JpdGFibGU+eworCS8qKgorCSAqIEZvcm1hdCBJTlBVVAorCSAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWZXJ0ZXhSZWFkZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT4gY3JlYXRlVmVydGV4UmVhZGVyKAorICAgICAgICAgICAgSW5wdXRTcGxpdCBzcGxpdCwgVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5TG9hZEdyYXBoUmVhZGVyKGJpbmFyeUlucHV0Rm9ybWF0LmNyZWF0ZVJlY29yZFJlYWRlcihzcGxpdCwgY29udGV4dCkpOworICAgIH0JCit9CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCitjbGFzcyBCaW5hcnlMb2FkR3JhcGhSZWFkZXIgZXh0ZW5kcworICAgICAgICBCaW5hcnlWZXJ0ZXhSZWFkZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT4geworCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQmluYXJ5TG9hZEdyYXBoUmVhZGVyLmNsYXNzLmdldE5hbWUoKSk7IAorCURhdGFMb2FkTG9nRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBEYXRhTG9hZExvZ0Zvcm1hdHRlcigpOworCUZpbGVIYW5kbGVyIGhhbmRsZXI7CisgICAgcHJpdmF0ZSBWZXJ0ZXggdmVydGV4OworICAgIHByaXZhdGUgQnl0ZXNXcml0YWJsZSB2ZXJ0ZXhJZCA9IG5ldyBCeXRlc1dyaXRhYmxlKCk7CisgICAgcHJpdmF0ZSBWYWx1ZVN0YXRlV3JpdGFibGUgdmVydGV4VmFsdWUgPSBuZXcgVmFsdWVTdGF0ZVdyaXRhYmxlKCk7CisKKyAgICBwdWJsaWMgQmluYXJ5TG9hZEdyYXBoUmVhZGVyKFJlY29yZFJlYWRlcjxCeXRlc1dyaXRhYmxlLEttZXJDb3VudFZhbHVlPiByZWNvcmRSZWFkZXIpIHsKKyAgICAgICAgc3VwZXIocmVjb3JkUmVhZGVyKTsKKwkJdHJ5IHsKKwkJCWhhbmRsZXIgPSBuZXcgRmlsZUhhbmRsZXIoImxvZy8iICsgQmluYXJ5TG9hZEdyYXBoUmVhZGVyLmNsYXNzLmdldE5hbWUoKSArICIubG9nIik7CisJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUxKSB7IGUxLnByaW50U3RhY2tUcmFjZSgpO30gCisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeyBlMS5wcmludFN0YWNrVHJhY2UoKTt9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmV4dFZlcnRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0UmVjb3JkUmVhZGVyKCkubmV4dEtleVZhbHVlKCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZlcnRleDxCeXRlc1dyaXRhYmxlLCBWYWx1ZVN0YXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTWVzc2FnZVdyaXRhYmxlPiBnZXRDdXJyZW50VmVydGV4KCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAodmVydGV4ID09IG51bGwpCisgICAgICAgICAgICB2ZXJ0ZXggPSAoVmVydGV4KSBCc3BVdGlscy5jcmVhdGVWZXJ0ZXgoZ2V0Q29udGV4dCgpLmdldENvbmZpZ3VyYXRpb24oKSk7CisKKyAgICAgICAgdmVydGV4LmdldE1zZ0xpc3QoKS5jbGVhcigpOworICAgICAgICB2ZXJ0ZXguZ2V0RWRnZXMoKS5jbGVhcigpOworICAgICAgICAKKyAgICAgICAgdmVydGV4LnJlc2V0KCk7CisgICAgICAgIGlmKGdldFJlY29yZFJlYWRlcigpICE9IG51bGwpeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBzZXQgdGhlIHNyYyB2ZXJ0ZXggaWQKKyAgICAgICAgICAgICAqLworICAgIAkJdmVydGV4SWQuc2V0KGdldFJlY29yZFJlYWRlcigpLmdldEN1cnJlbnRLZXkoKSk7CisgICAgCQl2ZXJ0ZXguc2V0VmVydGV4SWQodmVydGV4SWQpOworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBzZXQgdGhlIHZlcnRleCB2YWx1ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBLbWVyQ291bnRWYWx1ZSBrbWVyQ291bnRWYWx1ZSA9IGdldFJlY29yZFJlYWRlcigpLmdldEN1cnJlbnRWYWx1ZSgpOworICAgICAgICAgICAgdmVydGV4VmFsdWUuc2V0VmFsdWUoa21lckNvdW50VmFsdWUuZ2V0QWRqQml0TWFwKCkpOyAKKyAgICAgICAgICAgIHZlcnRleC5zZXRWZXJ0ZXhWYWx1ZSh2ZXJ0ZXhWYWx1ZSk7CisgICAgICAgICAgICAKKwkJCS8vbG9nCisJCQlmb3JtYXR0ZXIuc2V0KHZlcnRleElkLCBrbWVyQ291bnRWYWx1ZSwgR3JhcGhWZXJ0ZXhPcGVyYXRpb24uayk7CisJCQlpZihsb2dnZXIuZ2V0SGFuZGxlcnMoKSAhPSBudWxsKQorCQkJCWxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOworCQkJaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKwkJCWxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpOworCQkJbG9nZ2VyLmluZm8oIiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdmVydGV4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaE91dHB1dEZvcm1hdC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9mb3JtYXQvQmluYXJ5TG9hZEdyYXBoT3V0cHV0Rm9ybWF0LmphdmEKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoT3V0cHV0Rm9ybWF0LmphdmEKcmVuYW1lIHRvIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZm9ybWF0L0JpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5qYXZhCmluZGV4IGRiYWE1MjguLmYwMmQ0MjYgMTAwNjQ0Ci0tLSBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaE91dHB1dEZvcm1hdC5qYXZhCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZm9ybWF0L0JpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4OworcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmZvcm1hdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKQEAgLTksMTcgKzksMTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0F0dGVtcHRDb250ZXh0OwogCiBpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5hcGkuaW8uYmluYXJ5LkJpbmFyeVZlcnRleE91dHB1dEZvcm1hdDsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLlZhbHVlU3RhdGVXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLlZhbHVlV3JpdGFibGU7CiBpbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmdyYXBoLlZlcnRleDsKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuaW8uVmVydGV4V3JpdGVyOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5pby5WYWx1ZVN0YXRlV3JpdGFibGU7CiAKLXB1YmxpYyBjbGFzcyBMb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoT3V0cHV0Rm9ybWF0IGV4dGVuZHMgCitwdWJsaWMgY2xhc3MgQmluYXJ5TG9hZEdyYXBoT3V0cHV0Rm9ybWF0IGV4dGVuZHMgCiAJQmluYXJ5VmVydGV4T3V0cHV0Rm9ybWF0PEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlPiB7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBWZXJ0ZXhXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGU+IGNyZWF0ZVZlcnRleFdyaXRlcihUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlV3JpdGFibGU+IHJlY29yZFdyaXRlciA9IGJpbmFyeU91dHB1dEZvcm1hdC5nZXRSZWNvcmRXcml0ZXIoY29udGV4dCk7CisgICAgICAgICAgICBSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlPiByZWNvcmRXcml0ZXIgPSBiaW5hcnlPdXRwdXRGb3JtYXQuZ2V0UmVjb3JkV3JpdGVyKGNvbnRleHQpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIocmVjb3JkV3JpdGVyKTsKICAgICAgICAgfQogICAgICAgICAKQEAgLTI4LDE1ICsyOSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5hcnlMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIgZXh0ZW5kcwogICAgICAgICAgICAgICAgIEJpbmFyeVZlcnRleFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBWYWx1ZVN0YXRlV3JpdGFibGUsIE51bGxXcml0YWJsZT4gewotICAgICAgICAgICAgcHVibGljIEJpbmFyeUxvYWRHcmFwaFZlcnRleFdyaXRlcihSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlPiBsaW5lUmVjb3JkV3JpdGVyKSB7CisgICAgICAgICAgICBwdWJsaWMgQmluYXJ5TG9hZEdyYXBoVmVydGV4V3JpdGVyKFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBWYWx1ZVN0YXRlV3JpdGFibGU+IGxpbmVSZWNvcmRXcml0ZXIpIHsKICAgICAgICAgICAgICAgICBzdXBlcihsaW5lUmVjb3JkV3JpdGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVZlcnRleChWZXJ0ZXg8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsID8+IHZlcnRleCkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZ2V0UmVjb3JkV3JpdGVyKCkud3JpdGUodmVydGV4LmdldFZlcnRleElkKCksCi0gICAgICAgICAgICAgICAgCQluZXcgQnl0ZVdyaXRhYmxlKHZlcnRleC5nZXRWZXJ0ZXhWYWx1ZSgpLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICBnZXRSZWNvcmRXcml0ZXIoKS53cml0ZSh2ZXJ0ZXguZ2V0VmVydGV4SWQoKSx2ZXJ0ZXguZ2V0VmVydGV4VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaElucHV0Rm9ybWF0LmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2Zvcm1hdC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoSW5wdXRGb3JtYXQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdC5qYXZhCnJlbmFtZSB0byBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2Zvcm1hdC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoSW5wdXRGb3JtYXQuamF2YQppbmRleCA2MjVkNTg4Li4zZmQzMzQ1IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdC5qYXZhCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZm9ybWF0L0xvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdC5qYXZhCkBAIC0xLDYgKzEsNyBAQAotcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4OworcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmZvcm1hdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKQEAgLTgsMTUgKzksMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdENvbnRleHQ7CiAKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LkdyYXBoVmVydGV4T3BlcmF0aW9uOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguYXBpLmlvLmJpbmFyeS5CaW5hcnlWZXJ0ZXhJbnB1dEZvcm1hdDsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmJpdHdpc2UuQml0d2lzZU9wZXJhdGlvbjsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLkxvZ0FsZ29yaXRobU1lc3NhZ2VXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLlZhbHVlU3RhdGVXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnR5cGUuU3RhdGU7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXJDb3VudFZhbHVlOwogaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5ncmFwaC5WZXJ0ZXg7CiBpbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmlvLlZlcnRleFJlYWRlcjsKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkudXRpbC5Cc3BVdGlsczsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmJpdHdpc2UuQml0d2lzZU9wZXJhdGlvbjsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuaW8uTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5pby5WYWx1ZVN0YXRlV3JpdGFibGU7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC50eXBlLlN0YXRlOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguYXBpLmlvLmJpbmFyeS5CaW5hcnlWZXJ0ZXhJbnB1dEZvcm1hdDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnR5cGUuS21lckNvdW50VmFsdWU7CiAKIHB1YmxpYyBjbGFzcyBMb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoSW5wdXRGb3JtYXQgZXh0ZW5kcwogCUJpbmFyeVZlcnRleElucHV0Rm9ybWF0PEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlLCBMb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGU+ewpAQCAtMzMsNyArMzUsNiBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCiAgICAgY2xhc3MgQmluYXJ5TG9hZEdyYXBoUmVhZGVyIGV4dGVuZHMKICAgICAgICAgICAgIEJpbmFyeVZlcnRleFJlYWRlcjxCeXRlc1dyaXRhYmxlLCBWYWx1ZVN0YXRlV3JpdGFibGUsIE51bGxXcml0YWJsZSwgTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBzZXBhcmF0b3IgPSAiICI7CiAgICAgICAgIHByaXZhdGUgVmVydGV4IHZlcnRleDsKICAgICAgICAgcHJpdmF0ZSBCeXRlc1dyaXRhYmxlIHZlcnRleElkID0gbmV3IEJ5dGVzV3JpdGFibGUoKTsKICAgICAgICAgcHJpdmF0ZSBWYWx1ZVN0YXRlV3JpdGFibGUgdmVydGV4VmFsdWUgPSBuZXcgVmFsdWVTdGF0ZVdyaXRhYmxlKCk7CkBAIC03MywxMSArNzQsMTEgQEAKIAkgICAgICAgICAgICB2ZXJ0ZXhWYWx1ZS5zZXRTdGF0ZShTdGF0ZS5OT05fVkVSVEVYKTsKIAkgICAgICAgICAgICB2ZXJ0ZXguc2V0VmVydGV4VmFsdWUodmVydGV4VmFsdWUpOwogCSAgICAgICAgICAgIAotCSAgICAgICAgCVN0cmluZyBrbWVyID0gQml0d2lzZU9wZXJhdGlvbi5jb252ZXJ0Qnl0ZXNUb0JpbmFyeVN0cmluZ0ttZXIodmVydGV4SWQuZ2V0Qnl0ZXMoKSxHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKKwkgICAgICAgIAkvKlN0cmluZyBrbWVyID0gQml0d2lzZU9wZXJhdGlvbi5jb252ZXJ0Qnl0ZXNUb0JpbmFyeVN0cmluZ0ttZXIodmVydGV4SWQuZ2V0Qnl0ZXMoKSxHcmFwaFZlcnRleE9wZXJhdGlvbi5rKTsKIAkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImtleTogIiArIGttZXIpOwogCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29kZTogIiArIEdyYXBoVmVydGV4T3BlcmF0aW9uLmNvbnZlcnRCaW5hcnlTdHJpbmdUb0dlbmVjb2RlKGttZXIpKTsKIAkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZhbHVlOiAiICsgQml0d2lzZU9wZXJhdGlvbi5jb252ZXJ0Qnl0ZVRvQmluYXJ5U3RyaW5nKGttZXJDb3VudFZhbHVlLmdldEFkakJpdE1hcCgpKSk7Ci0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisJCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ki8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgcmV0dXJuIHZlcnRleDsKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaE91dHB1dEZvcm1hdC5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9mb3JtYXQvTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaE91dHB1dEZvcm1hdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzMlCmNvcHkgZnJvbSBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhPdXRwdXRGb3JtYXQuamF2YQpjb3B5IHRvIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZm9ybWF0L0xvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhPdXRwdXRGb3JtYXQuamF2YQppbmRleCBkYmFhNTI4Li5hYTgxMDY2IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhPdXRwdXRGb3JtYXQuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2Zvcm1hdC9Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoT3V0cHV0Rm9ybWF0LmphdmEKQEAgLTEsOCArMSw3IEBACi1wYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXg7CitwYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZm9ybWF0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLk51bGxXcml0YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkV3JpdGVyOwpAQCAtMTEsMTUgKzEwLDE3IEBACiBpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5hcGkuaW8uYmluYXJ5LkJpbmFyeVZlcnRleE91dHB1dEZvcm1hdDsKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuZ3JhcGguVmVydGV4OwogaW1wb3J0IGVkdS51Y2kuaWNzLnByZWdlbGl4LmFwaS5pby5WZXJ0ZXhXcml0ZXI7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvLlZhbHVlU3RhdGVXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLlZhbHVlU3RhdGVXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnR5cGUuU3RhdGU7CiAKIHB1YmxpYyBjbGFzcyBMb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoT3V0cHV0Rm9ybWF0IGV4dGVuZHMgCiAJQmluYXJ5VmVydGV4T3V0cHV0Rm9ybWF0PEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlPiB7CiAKKwkJCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgVmVydGV4V3JpdGVyPEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZSwgTnVsbFdyaXRhYmxlPiBjcmVhdGVWZXJ0ZXhXcml0ZXIoVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpCiAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBSZWNvcmRXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlPiByZWNvcmRXcml0ZXIgPSBiaW5hcnlPdXRwdXRGb3JtYXQuZ2V0UmVjb3JkV3JpdGVyKGNvbnRleHQpOworICAgICAgICAgICAgUmVjb3JkV3JpdGVyPEJ5dGVzV3JpdGFibGUsIFZhbHVlU3RhdGVXcml0YWJsZT4gcmVjb3JkV3JpdGVyID0gYmluYXJ5T3V0cHV0Rm9ybWF0LmdldFJlY29yZFdyaXRlcihjb250ZXh0KTsKICAgICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5TG9hZEdyYXBoVmVydGV4V3JpdGVyKHJlY29yZFdyaXRlcik7CiAgICAgICAgIH0KICAgICAgICAgCkBAIC0yOCwxNSArMjksMTYgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmluYXJ5TG9hZEdyYXBoVmVydGV4V3JpdGVyIGV4dGVuZHMKICAgICAgICAgICAgICAgICBCaW5hcnlWZXJ0ZXhXcml0ZXI8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGU+IHsKLSAgICAgICAgICAgIHB1YmxpYyBCaW5hcnlMb2FkR3JhcGhWZXJ0ZXhXcml0ZXIoUmVjb3JkV3JpdGVyPEJ5dGVzV3JpdGFibGUsIEJ5dGVXcml0YWJsZT4gbGluZVJlY29yZFdyaXRlcikgeworICAgICAgICAJCisgICAgICAgICAgICBwdWJsaWMgQmluYXJ5TG9hZEdyYXBoVmVydGV4V3JpdGVyKFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBWYWx1ZVN0YXRlV3JpdGFibGU+IGxpbmVSZWNvcmRXcml0ZXIpIHsKICAgICAgICAgICAgICAgICBzdXBlcihsaW5lUmVjb3JkV3JpdGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVZlcnRleChWZXJ0ZXg8Qnl0ZXNXcml0YWJsZSwgVmFsdWVTdGF0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsID8+IHZlcnRleCkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZ2V0UmVjb3JkV3JpdGVyKCkud3JpdGUodmVydGV4LmdldFZlcnRleElkKCksCi0gICAgICAgICAgICAgICAgCQluZXcgQnl0ZVdyaXRhYmxlKHZlcnRleC5nZXRWZXJ0ZXhWYWx1ZSgpLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgIAlpZih2ZXJ0ZXguZ2V0VmVydGV4VmFsdWUoKS5nZXRTdGF0ZSgpICE9IFN0YXRlLkZJTkFMX0RFTEVURSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVjb3JkV3JpdGVyKCkud3JpdGUodmVydGV4LmdldFZlcnRleElkKCksdmVydGV4LmdldFZlcnRleFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiB9CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvaW8vTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlLmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2lvL0xvZ0FsZ29yaXRobU1lc3NhZ2VXcml0YWJsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9pby9Mb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGUuamF2YQpyZW5hbWUgdG8gZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9pby9Mb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGUuamF2YQppbmRleCBkNzdhMjZmLi40YmU5OGJjIDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvaW8vTG9nQWxnb3JpdGhtTWVzc2FnZVdyaXRhYmxlLmphdmEKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9pby9Mb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvOworcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvOwogCiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CiBpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OwpAQCAtMzcsOCArMzcsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgcmVzZXQoKXsKLQkJc291cmNlVmVydGV4SWQgPSBudWxsOworCQlzb3VyY2VWZXJ0ZXhJZCA9IG5ldyBieXRlWyhHcmFwaFZlcnRleE9wZXJhdGlvbi5rLTEpLzQgKyAxXTsKIAkJbmVpZ2hiZXJJbmZvID0gKEJ5dGUpIG51bGw7CisJCWxlbmd0aE9mQ2hhaW4gPSAwOworCQljaGFpblZlcnRleElkID0gbnVsbDsKIAkJbWVzc2FnZSA9IDA7CiAJCXNvdXJjZVZlcnRleFN0YXRlID0gMDsKIAl9CkBAIC0xMDksMTAgKzExMSwxMiBAQAogCQlvdXQud3JpdGVJbnQobGVuZ3RoT2ZDaGFpbik7CiAJCWlmKGxlbmd0aE9mQ2hhaW4gIT0gMCkKIAkJCW91dC53cml0ZShjaGFpblZlcnRleElkKTsKLQkJb3V0LndyaXRlKHNvdXJjZVZlcnRleElkKTsKLQkJb3V0LndyaXRlKG5laWdoYmVySW5mbyk7CisKIAkJb3V0LndyaXRlSW50KG1lc3NhZ2UpOwogCQlvdXQud3JpdGVJbnQoc291cmNlVmVydGV4U3RhdGUpOworCQkKKwkJb3V0LndyaXRlKHNvdXJjZVZlcnRleElkKTsgCisJCW91dC53cml0ZShuZWlnaGJlckluZm8pOwogCX0KIAogCUBPdmVycmlkZQpAQCAtMTI1LDExICsxMjksMTMgQEAKIAkJfQogCQllbHNlCiAJCQljaGFpblZlcnRleElkID0gbmV3IGJ5dGVbMF07CisKKwkJbWVzc2FnZSA9IGluLnJlYWRJbnQoKTsKKwkJc291cmNlVmVydGV4U3RhdGUgPSBpbi5yZWFkSW50KCk7CisJCQogCQlzb3VyY2VWZXJ0ZXhJZCA9IG5ldyBieXRlWyhHcmFwaFZlcnRleE9wZXJhdGlvbi5rLTEpLzQgKyAxXTsKIAkJaW4ucmVhZEZ1bGx5KHNvdXJjZVZlcnRleElkKTsKIAkJbmVpZ2hiZXJJbmZvID0gaW4ucmVhZEJ5dGUoKTsKLQkJbWVzc2FnZSA9IGluLnJlYWRJbnQoKTsKLQkJc291cmNlVmVydGV4U3RhdGUgPSBpbi5yZWFkSW50KCk7CiAJfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvaW8vTWVzc2FnZVdyaXRhYmxlLmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2lvL01lc3NhZ2VXcml0YWJsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9pby9NZXNzYWdlV3JpdGFibGUuamF2YQpyZW5hbWUgdG8gZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9pby9NZXNzYWdlV3JpdGFibGUuamF2YQppbmRleCBiNDc3ZWI1Li4zMTQ2MDg4IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvaW8vTWVzc2FnZVdyaXRhYmxlLmphdmEKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9pby9NZXNzYWdlV3JpdGFibGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvOworcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvOwogCiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CiBpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OwpAQCAtMjIsMTcgKzIyLDE5IEBACiAJcHJpdmF0ZSBGaWxlIGZpbGU7CiAJcHJpdmF0ZSBib29sZWFuIGlzUmVhcjsKIAlwcml2YXRlIGludCBsZW5ndGhPZkNoYWluOworCXByaXZhdGUgYnl0ZVtdIGhlYWQ7CiAJCiAJcHVibGljIE1lc3NhZ2VXcml0YWJsZSgpewkJCiAJfQogCQotCXB1YmxpYyB2b2lkIHNldChieXRlW10gc291cmNlVmVydGV4SWQsIGJ5dGUgbmVpZ2hiZXJJbmZvLCBieXRlW10gY2hhaW5WZXJ0ZXhJZCwgRmlsZSBmaWxlKXsKKwlwdWJsaWMgdm9pZCBzZXQoYnl0ZVtdIHNvdXJjZVZlcnRleElkLCBieXRlIG5laWdoYmVySW5mbywgYnl0ZVtdIGNoYWluVmVydGV4SWQsIEZpbGUgZmlsZSwgYnl0ZVtdIGhlYWQpewogCQl0aGlzLnNvdXJjZVZlcnRleElkID0gc291cmNlVmVydGV4SWQ7CiAJCXRoaXMubmVpZ2hiZXJJbmZvID0gbmVpZ2hiZXJJbmZvOwogCQl0aGlzLmNoYWluVmVydGV4SWQgPSBjaGFpblZlcnRleElkOwogCQl0aGlzLmZpbGUgPSBmaWxlOwogCQl0aGlzLmlzUmVhciA9IGZhbHNlOwogCQl0aGlzLmxlbmd0aE9mQ2hhaW4gPSAwOworCQl0aGlzLmhlYWQgPSBoZWFkOwogCX0KIAogCXB1YmxpYyBieXRlW10gZ2V0U291cmNlVmVydGV4SWQoKSB7CkBAIC04Miw2ICs4NCwxNSBAQAogCXB1YmxpYyB2b2lkIHNldExlbmd0aE9mQ2hhaW4oaW50IGxlbmd0aE9mQ2hhaW4pIHsKIAkJdGhpcy5sZW5ndGhPZkNoYWluID0gbGVuZ3RoT2ZDaGFpbjsKIAl9CisJCisKKwlwdWJsaWMgYnl0ZVtdIGdldEhlYWQoKSB7CisJCXJldHVybiBoZWFkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhlYWQoYnl0ZVtdIGhlYWQpIHsKKwkJdGhpcy5oZWFkID0gaGVhZDsKKwl9CiAKIAlwdWJsaWMgdm9pZCBpbmNyZW1lbnRMZW5ndGgoKXsKIAkJdGhpcy5sZW5ndGhPZkNoYWluKys7CkBAIC05NCw2ICsxMDUsNyBAQAogCQlpZihsZW5ndGhPZkNoYWluICE9IDApCiAJCQlvdXQud3JpdGUoY2hhaW5WZXJ0ZXhJZCk7CiAJCW91dC53cml0ZShzb3VyY2VWZXJ0ZXhJZCk7CisJCW91dC53cml0ZShoZWFkKTsKIAkJb3V0LndyaXRlKG5laWdoYmVySW5mbyk7CiAJCW91dC53cml0ZUJvb2xlYW4oaXNSZWFyKTsKIAl9CkBAIC0xMTAsOCArMTIyLDExIEBACiAJCQljaGFpblZlcnRleElkID0gbmV3IGJ5dGVbMF07CiAJCXNvdXJjZVZlcnRleElkID0gbmV3IGJ5dGVbKEdyYXBoVmVydGV4T3BlcmF0aW9uLmstMSkvNCArIDFdOwogCQlpbi5yZWFkRnVsbHkoc291cmNlVmVydGV4SWQpOworCQloZWFkID0gbmV3IGJ5dGVbKEdyYXBoVmVydGV4T3BlcmF0aW9uLmstMSkvNCArIDFdOworCQlpbi5yZWFkRnVsbHkoaGVhZCk7CiAJCW5laWdoYmVySW5mbyA9IGluLnJlYWRCeXRlKCk7CiAJCWlzUmVhciA9IGluLnJlYWRCb29sZWFuKCk7CisKIAl9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9pby9WYWx1ZVN0YXRlV3JpdGFibGUuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvaW8vVmFsdWVTdGF0ZVdyaXRhYmxlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9leGFtcGxlL2lvL1ZhbHVlU3RhdGVXcml0YWJsZS5qYXZhCnJlbmFtZSB0byBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2lvL1ZhbHVlU3RhdGVXcml0YWJsZS5qYXZhCmluZGV4IDk3Mjc1YmUuLjlhY2RhNGUgMTAwNjQ0Ci0tLSBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9pby9WYWx1ZVN0YXRlV3JpdGFibGUuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2lvL1ZhbHVlU3RhdGVXcml0YWJsZS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuaW87CitwYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW87CiAKIGltcG9ydCBqYXZhLmlvLio7CiAKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvZXhhbXBsZS9pby9WYWx1ZVN0YXRlV3JpdGFibGUuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvaW8vVmFsdWVXcml0YWJsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjglCmNvcHkgZnJvbSBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvaW8vVmFsdWVTdGF0ZVdyaXRhYmxlLmphdmEKY29weSB0byBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2lvL1ZhbHVlV3JpdGFibGUuamF2YQppbmRleCA5NzI3NWJlLi5hM2YwYjlmIDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2V4YW1wbGUvaW8vVmFsdWVTdGF0ZVdyaXRhYmxlLmphdmEKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9pby9WYWx1ZVdyaXRhYmxlLmphdmEKQEAgLTEsMjcgKzEsMjEgQEAKLXBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5leGFtcGxlLmlvOworcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvOwogCiBpbXBvcnQgamF2YS5pby4qOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGVDb21wYXJhYmxlOwogCi1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC50eXBlLlN0YXRlOwotCi0KLXB1YmxpYyBjbGFzcyBWYWx1ZVN0YXRlV3JpdGFibGUgaW1wbGVtZW50cyBXcml0YWJsZUNvbXBhcmFibGU8VmFsdWVTdGF0ZVdyaXRhYmxlPiB7CitwdWJsaWMgY2xhc3MgVmFsdWVXcml0YWJsZSBpbXBsZW1lbnRzIFdyaXRhYmxlQ29tcGFyYWJsZTxWYWx1ZVdyaXRhYmxlPiB7CiAKIAlwcml2YXRlIGJ5dGUgdmFsdWU7Ci0JcHJpdmF0ZSBpbnQgc3RhdGU7CiAJcHJpdmF0ZSBpbnQgbGVuZ3RoT2ZNZXJnZUNoYWluOwogCXByaXZhdGUgYnl0ZVtdIG1lcmdlQ2hhaW47CiAKLQlwdWJsaWMgVmFsdWVTdGF0ZVdyaXRhYmxlKCkgewotCQlzdGF0ZSA9IFN0YXRlLk5PTl9WRVJURVg7CisJcHVibGljIFZhbHVlV3JpdGFibGUoKSB7CiAJCWxlbmd0aE9mTWVyZ2VDaGFpbiA9IDA7CiAJfQogCi0JcHVibGljIFZhbHVlU3RhdGVXcml0YWJsZShieXRlIHZhbHVlLCBpbnQgc3RhdGUsIGludCBsZW5ndGhPZk1lcmdlQ2hhaW4sIGJ5dGVbXSBtZXJnZUNoYWluKSB7CisJcHVibGljIFZhbHVlV3JpdGFibGUoYnl0ZSB2YWx1ZSwgaW50IGxlbmd0aE9mTWVyZ2VDaGFpbiwgYnl0ZVtdIG1lcmdlQ2hhaW4pIHsKIAkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLnN0YXRlID0gc3RhdGU7CiAJCXRoaXMubGVuZ3RoT2ZNZXJnZUNoYWluID0gbGVuZ3RoT2ZNZXJnZUNoYWluOwogCQl0aGlzLm1lcmdlQ2hhaW4gPSBtZXJnZUNoYWluOwogCX0KQEAgLTM0LDE0ICsyOCw2IEBACiAJCXRoaXMudmFsdWUgPSB2YWx1ZTsKIAl9CiAKLQlwdWJsaWMgaW50IGdldFN0YXRlKCkgewotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQl9Ci0KIAlwdWJsaWMgaW50IGdldExlbmd0aE9mTWVyZ2VDaGFpbigpIHsKIAkJcmV0dXJuIGxlbmd0aE9mTWVyZ2VDaGFpbjsKIAl9CkBAIC02MSw3ICs0Nyw2IEBACiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVhZEZpZWxkcyhEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXZhbHVlID0gaW4ucmVhZEJ5dGUoKTsKLQkJc3RhdGUgPSBpbi5yZWFkSW50KCk7CiAJCWxlbmd0aE9mTWVyZ2VDaGFpbiA9IGluLnJlYWRJbnQoKTsKIAkJaWYobGVuZ3RoT2ZNZXJnZUNoYWluICE9IDApewogCQkJbWVyZ2VDaGFpbiA9IG5ldyBieXRlWyhsZW5ndGhPZk1lcmdlQ2hhaW4tMSkvNCArIDFdOwpAQCAtNzQsMTQgKzU5LDEzIEBACiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgd3JpdGUoRGF0YU91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dC53cml0ZUJ5dGUodmFsdWUpOwotCQlvdXQud3JpdGVJbnQoc3RhdGUpOwogCQlvdXQud3JpdGVJbnQobGVuZ3RoT2ZNZXJnZUNoYWluKTsKIAkJaWYobGVuZ3RoT2ZNZXJnZUNoYWluICE9IDApCiAJCQlvdXQud3JpdGUobWVyZ2VDaGFpbik7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBjb21wYXJlVG8oVmFsdWVTdGF0ZVdyaXRhYmxlIG8pIHsKKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhWYWx1ZVdyaXRhYmxlIG8pIHsKIAkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2xvZy9EYXRhTG9hZExvZ0Zvcm1hdHRlci5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9sb2cvRGF0YUxvYWRMb2dGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWRkZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9sb2cvRGF0YUxvYWRMb2dGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXgubG9nOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZTsKKworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgudHlwZS5LbWVyOworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgudHlwZS5LbWVyQ291bnRWYWx1ZTsKKworcHVibGljIGNsYXNzIERhdGFMb2FkTG9nRm9ybWF0dGVyIGV4dGVuZHMgRm9ybWF0dGVyeworICAgIHByaXZhdGUgQnl0ZXNXcml0YWJsZSBrZXk7CisgICAgcHJpdmF0ZSBLbWVyQ291bnRWYWx1ZSB2YWx1ZTsKKyAgICBwcml2YXRlIGludCBrOworCisgICAgcHVibGljIHZvaWQgc2V0KEJ5dGVzV3JpdGFibGUga2V5LCAKKyAgICAJCUttZXJDb3VudFZhbHVlIHZhbHVlLCBpbnQgayl7CisgICAgCXRoaXMua2V5ID0ga2V5OworICAgIAl0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgCXRoaXMuayA9IGs7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KExvZ1JlY29yZCByZWNvcmQpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwMCk7CisgICAgICAgIAorICAgICAgICBidWlsZGVyLmFwcGVuZChLbWVyLnJlY292ZXJLbWVyRnJvbShrLCBrZXkuZ2V0Qnl0ZXMoKSwgMCwKKwkJCQkJCQlrZXkuZ2V0TGVuZ3RoKCkpCisJCQkJCQkJKyAiXHQiICsgdmFsdWUudG9TdHJpbmcoKSArICJcclxuIik7CisKKyAgICAgICAgaWYoIWZvcm1hdE1lc3NhZ2UocmVjb3JkKS5lcXVhbHMoIiIpKQorICAgICAgICAJYnVpbGRlci5hcHBlbmQoZm9ybWF0TWVzc2FnZShyZWNvcmQpICsgIlxyXG4iKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWQoSGFuZGxlciBoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRIZWFkKGgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFpbChIYW5kbGVyIGgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhaWwoaCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9sb2cvTG9nQWxnb3JpdGhtTG9nRm9ybWF0dGVyLmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2xvZy9Mb2dBbGdvcml0aG1Mb2dGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTRmZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9sb2cvTG9nQWxnb3JpdGhtTG9nRm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5sb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7CisKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLkxvZ0FsZ29yaXRobU1lc3NhZ2VXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnR5cGUuTWVzc2FnZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnR5cGUuU3RhdGU7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXI7CisKK3B1YmxpYyBjbGFzcyBMb2dBbGdvcml0aG1Mb2dGb3JtYXR0ZXIgZXh0ZW5kcyBGb3JtYXR0ZXIgeworCS8vCisgICAgLy8gQ3JlYXRlIGEgRGF0ZUZvcm1hdCB0byBmb3JtYXQgdGhlIGxvZ2dlciB0aW1lc3RhbXAuCisgICAgLy8KKyAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXl5eSBoaDptbTpzcy5TU1MiKTsKKyAgICBwcml2YXRlIGxvbmcgc3RlcDsKKyAgICBwcml2YXRlIGJ5dGVbXSBzb3VyY2VWZXJ0ZXhJZDsKKyAgICBwcml2YXRlIGJ5dGVbXSBkZXN0VmVydGV4SWQ7CisgICAgcHJpdmF0ZSBMb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGUgbXNnOworICAgIHByaXZhdGUgaW50IHN0YXRlOworICAgIHByaXZhdGUgaW50IGs7CisgICAgcHJpdmF0ZSBieXRlW10gbWVyZ2VDaGFpbjsKKyAgICBwcml2YXRlIGludCBsZW5ndGhPZk1lcmdlQ2hhaW47CisgICAgLy9wcml2YXRlIGJvb2xlYW4gdGVzdERlbGV0ZSA9IGZhbHNlOworICAgIC8qKiAwOiBnZW5lcmFsIG9wZXJhdGlvbiAKKyAgICAgKiAgMTogdGVzdERlbGV0ZSAKKyAgICAgKiAgMjogdGVzdE1lcmdlQ2hhaW4KKyAgICAgKiAgMzogdGVzdFZvdGVUb0hhbHQKKyAgICAgKi8gCisgICAgcHJpdmF0ZSBpbnQgb3BlcmF0aW9uOyAKKworICAgIHB1YmxpYyB2b2lkIHNldChsb25nIHN0ZXAsIGJ5dGVbXSBzb3VyY2VWZXJ0ZXhJZCwgCisgICAgCQlieXRlW10gZGVzdFZlcnRleElkLCBMb2dBbGdvcml0aG1NZXNzYWdlV3JpdGFibGUgbXNnLCBpbnQgc3RhdGUsIGludCBrKXsKKyAgICAJdGhpcy5zdGVwID0gc3RlcDsKKyAgICAJdGhpcy5zb3VyY2VWZXJ0ZXhJZCA9IHNvdXJjZVZlcnRleElkOworICAgIAl0aGlzLmRlc3RWZXJ0ZXhJZCA9IGRlc3RWZXJ0ZXhJZDsKKyAgICAJdGhpcy5tc2cgPSBtc2c7CisgICAgCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAJdGhpcy5rID0gazsKKyAgICAJdGhpcy5vcGVyYXRpb24gPSAwOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXJnZUNoYWluKGxvbmcgc3RlcCwgYnl0ZVtdIHNvdXJjZVZlcnRleElkLCAKKyAgICAJCWludCBsZW5ndGhPZk1lcmdlQ2hhaW4sIGJ5dGVbXSBtZXJnZUNoYWluLCBpbnQgayl7CisgICAgCXRoaXMucmVzZXQoKTsKKyAgICAJdGhpcy5zdGVwID0gc3RlcDsKKyAgICAJdGhpcy5zb3VyY2VWZXJ0ZXhJZCA9IHNvdXJjZVZlcnRleElkOworICAgIAl0aGlzLmxlbmd0aE9mTWVyZ2VDaGFpbiA9IGxlbmd0aE9mTWVyZ2VDaGFpbjsKKyAgICAJdGhpcy5tZXJnZUNoYWluID0gbWVyZ2VDaGFpbjsKKyAgICAJdGhpcy5rID0gazsKKyAgICAJdGhpcy5vcGVyYXRpb24gPSAyOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRWb3RvVG9IYWx0KGxvbmcgc3RlcCwgYnl0ZVtdIHNvdXJjZVZlcnRleElkLCBpbnQgayl7CisgICAgCXRoaXMucmVzZXQoKTsKKyAgICAJdGhpcy5zdGVwID0gc3RlcDsKKyAgICAJdGhpcy5zb3VyY2VWZXJ0ZXhJZCA9IHNvdXJjZVZlcnRleElkOworICAgIAl0aGlzLmsgPSBrOworICAgIAl0aGlzLm9wZXJhdGlvbiA9IDM7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCl7CisgICAgCXRoaXMuc291cmNlVmVydGV4SWQgPSBudWxsOworICAgIAl0aGlzLmRlc3RWZXJ0ZXhJZCA9IG51bGw7CisgICAgCXRoaXMubXNnID0gbnVsbDsKKyAgICAJdGhpcy5zdGF0ZSA9IDA7CisgICAgCXRoaXMuayA9IDA7CisgICAgCXRoaXMubWVyZ2VDaGFpbiA9IG51bGw7CisgICAgCXRoaXMubGVuZ3RoT2ZNZXJnZUNoYWluID0gMDsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBmb3JtYXQoTG9nUmVjb3JkIHJlY29yZCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDAwKTsKKyAgICAgICAgU3RyaW5nIHNvdXJjZSA9IEttZXIucmVjb3ZlckttZXJGcm9tKGssIHNvdXJjZVZlcnRleElkLCAwLCBzb3VyY2VWZXJ0ZXhJZC5sZW5ndGgpOworICAgICAgICBTdHJpbmcgY2hhaW4gPSAiIjsKKyAgICAgICAgCisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJTdGVwOiAiICsgc3RlcCArICJcclxuIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJTb3VyY2UgQ29kZTogIiArIHNvdXJjZSArICJcclxuIik7CisgICAgICAgIGlmKG9wZXJhdGlvbiA9PSAwKXsKKwkgICAgICAgIGlmKGRlc3RWZXJ0ZXhJZCAhPSBudWxsKXsKKwkgICAgICAgIAlTdHJpbmcgZGVzdCA9IEttZXIucmVjb3ZlckttZXJGcm9tKGssIGRlc3RWZXJ0ZXhJZCwgMCwgZGVzdFZlcnRleElkLmxlbmd0aCk7CisJCSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlNlbmQgbWVzc2FnZSB0byAiICsgIlxyXG4iKTsKKwkJICAgICAgICBidWlsZGVyLmFwcGVuZCgiRGVzdGluYXRpb24gQ29kZTogIiArIGRlc3QgKyAiXHJcbiIpOworCSAgICAgICAgfQorCSAgICAgICAgYnVpbGRlci5hcHBlbmQoIk1lc3NhZ2UgaXM6ICIgKyBNZXNzYWdlLk1FU1NBR0VfQ09OVEVOVC5nZXRDb250ZW50RnJvbUNvZGUobXNnLmdldE1lc3NhZ2UoKSkgKyAiXHJcbiIpOworCSAgICAgICAgCQorCSAgICAgICAgaWYobXNnLmdldExlbmd0aE9mQ2hhaW4oKSAhPSAwKXsKKwkgICAgICAgIAljaGFpbiA9IEttZXIucmVjb3ZlckttZXJGcm9tKG1zZy5nZXRMZW5ndGhPZkNoYWluKCksIG1zZy5nZXRDaGFpblZlcnRleElkKCksIDAsIG1zZy5nZXRDaGFpblZlcnRleElkKCkubGVuZ3RoKTsKKwkgICAgICAgIAlidWlsZGVyLmFwcGVuZCgiQ2hhaW4gTWVzc2FnZTogIiArIGNoYWluICsgIlxyXG4iKTsKKwkgICAgICAgIAlidWlsZGVyLmFwcGVuZCgiQ2hhaW4gTGVuZ3RoOiAiICsgbXNnLmdldExlbmd0aE9mQ2hhaW4oKSArICJcclxuIik7CisJICAgICAgICB9CisJICAgICAgICAKKwkgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJTdGF0ZSBpczogIiArIFN0YXRlLlNUQVRFX0NPTlRFTlQuZ2V0Q29udGVudEZyb21Db2RlKHN0YXRlKSArICJcclxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYob3BlcmF0aW9uID09IDIpeworICAgICAgICAJY2hhaW4gPSBLbWVyLnJlY292ZXJLbWVyRnJvbShsZW5ndGhPZk1lcmdlQ2hhaW4sIG1lcmdlQ2hhaW4sIDAsIG1lcmdlQ2hhaW4ubGVuZ3RoKTsKKyAgICAgICAgCWJ1aWxkZXIuYXBwZW5kKCJNZXJnZSBDaGFpbjogIiArIGNoYWluICsgIlxyXG4iKTsKKyAgICAgICAgCWJ1aWxkZXIuYXBwZW5kKCJNZXJnZSBDaGFpbiBMZW5ndGg6ICIgKyBsZW5ndGhPZk1lcmdlQ2hhaW4gKyAiXHJcbiIpOworICAgICAgICB9CisgICAgICAgIGlmKG9wZXJhdGlvbiA9PSAzKQorICAgICAgICAJYnVpbGRlci5hcHBlbmQoIlZvdGUgdG8gaGFsdCEiKTsKKyAgICAgICAgaWYoIWZvcm1hdE1lc3NhZ2UocmVjb3JkKS5lcXVhbHMoIiIpKQorICAgICAgICAJYnVpbGRlci5hcHBlbmQoZm9ybWF0TWVzc2FnZShyZWNvcmQpICsgIlxyXG4iKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkKEhhbmRsZXIgaCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SGVhZChoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhaWwoSGFuZGxlciBoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRUYWlsKGgpOworICAgIH0KKwlwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG9wZXJhdGlvbjsKKwl9CisJcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uKGludCBvcGVyYXRpb24pIHsKKwkJdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvbG9nL05haXZlQWxnb3JpdGhtTG9nRm9ybWF0dGVyLmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2xvZy9OYWl2ZUFsZ29yaXRobUxvZ0Zvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YWJkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L2xvZy9OYWl2ZUFsZ29yaXRobUxvZ0Zvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5sb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7CisKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmlvLk1lc3NhZ2VXcml0YWJsZTsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnR5cGUuS21lcjsKKworcHVibGljIGNsYXNzIE5haXZlQWxnb3JpdGhtTG9nRm9ybWF0dGVyIGV4dGVuZHMgRm9ybWF0dGVyIHsKKwkvLworICAgIC8vIENyZWF0ZSBhIERhdGVGb3JtYXQgdG8gZm9ybWF0IHRoZSBsb2dnZXIgdGltZXN0YW1wLgorICAgIC8vCisgICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5eXkgaGg6bW06c3MuU1NTIik7CisgICAgcHJpdmF0ZSBsb25nIHN0ZXA7CisgICAgcHJpdmF0ZSBieXRlW10gc291cmNlVmVydGV4SWQ7CisgICAgcHJpdmF0ZSBieXRlW10gZGVzdFZlcnRleElkOworICAgIHByaXZhdGUgTWVzc2FnZVdyaXRhYmxlIG1zZzsKKyAgICBwcml2YXRlIGludCBrOworCisgICAgcHVibGljIHZvaWQgc2V0KGxvbmcgc3RlcCwgYnl0ZVtdIHNvdXJjZVZlcnRleElkLCAKKyAgICAJCWJ5dGVbXSBkZXN0VmVydGV4SWQsIE1lc3NhZ2VXcml0YWJsZSBtc2csIGludCBrKXsKKyAgICAJdGhpcy5zdGVwID0gc3RlcDsKKyAgICAJdGhpcy5zb3VyY2VWZXJ0ZXhJZCA9IHNvdXJjZVZlcnRleElkOworICAgIAl0aGlzLmRlc3RWZXJ0ZXhJZCA9IGRlc3RWZXJ0ZXhJZDsKKyAgICAJdGhpcy5tc2cgPSBtc2c7CisgICAgCXRoaXMuayA9IGs7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KExvZ1JlY29yZCByZWNvcmQpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwMCk7CisgICAgICAgIFN0cmluZyBzb3VyY2UgPSBLbWVyLnJlY292ZXJLbWVyRnJvbShrLCBzb3VyY2VWZXJ0ZXhJZCwgMCwgc291cmNlVmVydGV4SWQubGVuZ3RoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBjaGFpbiA9ICIiOworICAgICAgICAKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlN0ZXA6ICIgKyBzdGVwICsgIlxyXG4iKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlNvdXJjZSBDb2RlOiAiICsgc291cmNlICsgIlxyXG4iKTsKKyAgICAgICAgCisgICAgICAgIGlmKGRlc3RWZXJ0ZXhJZCAhPSBudWxsKXsKKyAgICAgICAgCWJ1aWxkZXIuYXBwZW5kKCJTZW5kIG1lc3NhZ2UgdG8gIiArICJcclxuIik7CisgICAgICAgIAlTdHJpbmcgZGVzdCA9IEttZXIucmVjb3ZlckttZXJGcm9tKGssIGRlc3RWZXJ0ZXhJZCwgMCwgZGVzdFZlcnRleElkLmxlbmd0aCk7CisgICAgICAgIAlidWlsZGVyLmFwcGVuZCgiRGVzdGluYXRpb24gQ29kZTogIiArIGRlc3QgKyAiXHJcbiIpOworICAgICAgICB9CisgICAgICAgIGlmKG1zZy5nZXRMZW5ndGhPZkNoYWluKCkgIT0gMCl7CisgICAgICAgIAljaGFpbiA9IEttZXIucmVjb3ZlckttZXJGcm9tKG1zZy5nZXRMZW5ndGhPZkNoYWluKCksIG1zZy5nZXRDaGFpblZlcnRleElkKCksIDAsIG1zZy5nZXRDaGFpblZlcnRleElkKCkubGVuZ3RoKTsKKyAgICAgICAgCWJ1aWxkZXIuYXBwZW5kKCJDaGFpbiBNZXNzYWdlOiAiICsgY2hhaW4gKyAiXHJcbiIpOworICAgICAgICAJYnVpbGRlci5hcHBlbmQoIkNoYWluIExlbmd0aDogIiArIG1zZy5nZXRMZW5ndGhPZkNoYWluKCkgKyAiXHJcbiIpOworICAgICAgICB9CisgICAgICAgIGlmKCFmb3JtYXRNZXNzYWdlKHJlY29yZCkuZXF1YWxzKCIiKSkKKyAgICAgICAgCWJ1aWxkZXIuYXBwZW5kKGZvcm1hdE1lc3NhZ2UocmVjb3JkKSArICJcclxuIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZChIYW5kbGVyIGgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEhlYWQoaCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYWlsKEhhbmRsZXIgaCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFpbChoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9zZXF1ZW5jZWZpbGUvQ29tYmluZVNlcXVlbmNlRmlsZS5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9zZXF1ZW5jZWZpbGUvQ29tYmluZVNlcXVlbmNlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmI4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3NlcXVlbmNlZmlsZS9Db21iaW5lU2VxdWVuY2VGaWxlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnNlcXVlbmNlZmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5TZXF1ZW5jZUZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uU2VxdWVuY2VGaWxlLkNvbXByZXNzaW9uVHlwZTsKKworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguR3JhcGhWZXJ0ZXhPcGVyYXRpb247CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXI7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC50eXBlLkttZXJDb3VudFZhbHVlOworCisKK3B1YmxpYyBjbGFzcyBDb21iaW5lU2VxdWVuY2VGaWxlIHsKKworCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKwkJRmlsZVN5c3RlbSBmaWxlU3lzID0gRmlsZVN5c3RlbS5nZXQoY29uZik7CisJCQorCQlQYXRoIHAgPSBuZXcgUGF0aCgiZGF0YS9UaHJlZUttZXIiKTsKKwkJUGF0aCBwMiA9IG5ldyBQYXRoKCJkYXRhL3Jlc3VsdCIpOworCQlQYXRoIG91dEZpbGUgPSBuZXcgUGF0aChwMiwgIm91dHB1dCIpOyAKKwkJU2VxdWVuY2VGaWxlLlJlYWRlciByZWFkZXI7CisJICAgIFNlcXVlbmNlRmlsZS5Xcml0ZXIgd3JpdGVyID0gU2VxdWVuY2VGaWxlLmNyZWF0ZVdyaXRlcihmaWxlU3lzLCBjb25mLAorCSAgICAgICAgIG91dEZpbGUsIEJ5dGVzV3JpdGFibGUuY2xhc3MsIEttZXJDb3VudFZhbHVlLmNsYXNzLCAKKwkgICAgICAgICBDb21wcmVzc2lvblR5cGUuTk9ORSk7CisJICAgIEJ5dGVzV3JpdGFibGUga2V5ID0gbmV3IEJ5dGVzV3JpdGFibGUoKTsKKwkgICAgS21lckNvdW50VmFsdWUgdmFsdWUgPSBuZXcgS21lckNvdW50VmFsdWUoKTsKKwkgICAgCisJICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoImRhdGEvVGhyZWVLbWVyIik7CisJCWZvcihGaWxlIGNoaWxkIDogZGlyLmxpc3RGaWxlcygpKXsKKwkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQlQYXRoIGluRmlsZSA9IG5ldyBQYXRoKHAsIG5hbWUpOworCQkJcmVhZGVyID0gbmV3IFNlcXVlbmNlRmlsZS5SZWFkZXIoZmlsZVN5cywgaW5GaWxlLCBjb25mKTsKKwkJCXdoaWxlIChyZWFkZXIubmV4dChrZXksIHZhbHVlKSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihLbWVyLnJlY292ZXJLbWVyRnJvbShHcmFwaFZlcnRleE9wZXJhdGlvbi5rLCBrZXkuZ2V0Qnl0ZXMoKSwgMCwKKwkJCQkJCWtleS5nZXRMZW5ndGgoKSkKKwkJCQkJCSsgIlx0IiArIHZhbHVlLnRvU3RyaW5nKCkpOworCQkJCXdyaXRlci5hcHBlbmQoa2V5LCB2YWx1ZSk7CisJCQl9CisJCQlyZWFkZXIuY2xvc2UoKTsKKwkJfQorCQl3cml0ZXIuY2xvc2UoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCQorCQlyZWFkZXIgPSBuZXcgU2VxdWVuY2VGaWxlLlJlYWRlcihmaWxlU3lzLCBvdXRGaWxlLCBjb25mKTsKKwkJd2hpbGUgKHJlYWRlci5uZXh0KGtleSwgdmFsdWUpKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oS21lci5yZWNvdmVyS21lckZyb20oR3JhcGhWZXJ0ZXhPcGVyYXRpb24uaywga2V5LmdldEJ5dGVzKCksIDAsCisJCQkJCWtleS5nZXRMZW5ndGgoKSkKKwkJCQkJKyAiXHQiICsgdmFsdWUudG9TdHJpbmcoKSk7CisJCX0KKwkJcmVhZGVyLmNsb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L1NlcXVlbmNlRmlsZS9Db252ZXJ0VG9TZXF1ZW5jZUZpbGUuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvc2VxdWVuY2VmaWxlL0NvbnZlcnRUb1NlcXVlbmNlRmlsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvU2VxdWVuY2VGaWxlL0NvbnZlcnRUb1NlcXVlbmNlRmlsZS5qYXZhCnJlbmFtZSB0byBnZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3NlcXVlbmNlZmlsZS9Db252ZXJ0VG9TZXF1ZW5jZUZpbGUuamF2YQppbmRleCAxYWZmOTVkLi5kNjRiMjc5IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L1NlcXVlbmNlRmlsZS9Db252ZXJ0VG9TZXF1ZW5jZUZpbGUuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3NlcXVlbmNlZmlsZS9Db252ZXJ0VG9TZXF1ZW5jZUZpbGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5TZXF1ZW5jZUZpbGU7CitwYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguc2VxdWVuY2VmaWxlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9TZXF1ZW5jZUZpbGUvR2VuZXJhdGVTZXF1ZW5jZUZpbGUuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvc2VxdWVuY2VmaWxlL0dlbmVyYXRlU2VxdWVuY2VGaWxlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9TZXF1ZW5jZUZpbGUvR2VuZXJhdGVTZXF1ZW5jZUZpbGUuamF2YQpyZW5hbWUgdG8gZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9zZXF1ZW5jZWZpbGUvR2VuZXJhdGVTZXF1ZW5jZUZpbGUuamF2YQppbmRleCBiN2ZlZDQ4Li41Yzc0MGU0IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L1NlcXVlbmNlRmlsZS9HZW5lcmF0ZVNlcXVlbmNlRmlsZS5qYXZhCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvc2VxdWVuY2VmaWxlL0dlbmVyYXRlU2VxdWVuY2VGaWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi1wYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguU2VxdWVuY2VGaWxlOworcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LnNlcXVlbmNlZmlsZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvU2VxdWVuY2VGaWxlL2dlbmVyYXRlU21hbGxGaWxlLmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3NlcXVlbmNlZmlsZS9nZW5lcmF0ZVNtYWxsRmlsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvU2VxdWVuY2VGaWxlL2dlbmVyYXRlU21hbGxGaWxlLmphdmEKcmVuYW1lIHRvIGdlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvc2VxdWVuY2VmaWxlL2dlbmVyYXRlU21hbGxGaWxlLmphdmEKaW5kZXggZWVjMjU1OS4uZjQ0NzgxZiAxMDA2NDQKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9TZXF1ZW5jZUZpbGUvZ2VuZXJhdGVTbWFsbEZpbGUuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3NlcXVlbmNlZmlsZS9nZW5lcmF0ZVNtYWxsRmlsZS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LlNlcXVlbmNlRmlsZTsKK3BhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5zZXF1ZW5jZWZpbGU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCkBAIC0xNiw5ICsxNiw3IEBACiAJcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlTnVtT2ZMaW5lc0Zyb21CaWdGaWxlKFBhdGggaW5GaWxlLCBQYXRoIG91dEZpbGUsIGludCBudW1PZkxpbmVzKSB0aHJvd3MgSU9FeGNlcHRpb257CiAJCUNvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CiAJCUZpbGVTeXN0ZW0gZmlsZVN5cyA9IEZpbGVTeXN0ZW0uZ2V0KGNvbmYpOwotCSAgICAKLQkJLy9DbGFzc0xvYWRlciBjdHhMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkvL1RocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKEdlbmVyYXRlU2VxdWVuY2VGaWxlLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCiAJCVNlcXVlbmNlRmlsZS5SZWFkZXIgcmVhZGVyID0gbmV3IFNlcXVlbmNlRmlsZS5SZWFkZXIoZmlsZVN5cywgaW5GaWxlLCBjb25mKTsKIAkgICAgU2VxdWVuY2VGaWxlLldyaXRlciB3cml0ZXIgPSBTZXF1ZW5jZUZpbGUuY3JlYXRlV3JpdGVyKGZpbGVTeXMsIGNvbmYsCiAJICAgICAgICAgb3V0RmlsZSwgQnl0ZXNXcml0YWJsZS5jbGFzcywgS21lckNvdW50VmFsdWUuY2xhc3MsIApAQCAtMzQsNyArMzIsNiBAQAogCSAgICB9CiAJICAgIHdyaXRlci5jbG9zZSgpOwogCSAgICByZWFkZXIuY2xvc2UoKTsKLQkgICAgLy9UaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdHhMb2FkZXIpOwogCX0KIAkvKioKIAkgKiBAcGFyYW0gYXJncwpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC90ZXN0RGVsZXRlVmVydGV4SWQuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvdGVzdERlbGV0ZVZlcnRleElkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmYwYzUuLjAwMDAwMDAKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC90ZXN0RGVsZXRlVmVydGV4SWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLXBhY2thZ2UgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTnVsbFdyaXRhYmxlOwotCi1pbXBvcnQgZWR1LnVjaS5pY3MucHJlZ2VsaXguYXBpLmdyYXBoLlZlcnRleDsKLWltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuam9iLlByZWdlbGl4Sm9iOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguYml0d2lzZS5CaXR3aXNlT3BlcmF0aW9uOwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5jbGllbnQuQ2xpZW50OwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZXhhbXBsZS5pby5NZXNzYWdlV3JpdGFibGU7Ci0KLS8qCi0gKiB2ZXJ0ZXhJZDogQnl0ZXNXcml0YWJsZQotICogdmVydGV4VmFsdWU6IEJ5dGVXcml0YWJsZQotICogZWRnZVZhbHVlOiBOdWxsV3JpdGFibGUKLSAqIG1lc3NhZ2U6IE1lc3NhZ2VXcml0YWJsZQotICogCi0gKiBETkE6Ci0gKiBBOiAwMAotICogQzogMDEKLSAqIEc6IDEwCi0gKiBUOiAxMQotICogCi0gKiBzdWNjZWVkIG5vZGUKLSAqICBBIDAwMDAwMDAxIDEKLSAqICBHIDAwMDAwMDEwIDIKLSAqICBDIDAwMDAwMTAwIDQKLSAqICBUIDAwMDAxMDAwIDgKLSAqIHByZWN1cnNvciBub2RlCi0gKiAgQSAwMDAxMDAwMCAxNgotICogIEcgMDAxMDAwMDAgMzIKLSAqICBDIDAxMDAwMDAwIDY0Ci0gKiAgVCAxMDAwMDAwMCAxMjgKLSAqICAKLSAqIEZvciBleGFtcGxlLCBPTkUgTElORSBpbiBpbnB1dCBmaWxlOiAwMCwwMSwxMAkwMDAxLDAwMTAsCi0gKiBUaGF0IG1lYW5zIHRoYXQgdmVydGV4SWQgaXMgQUNHLCBpdHMgc3VjY2VlZCBub2RlIGlzIEEgYW5kIGl0cyBwcmVjdXJzb3Igbm9kZSBpcyBDLgotICogVGhlIHN1Y2NlZWQgbm9kZSBhbmQgcHJlY3Vyc29yIG5vZGUgd2lsbCBiZSBzdG9yZWQgaW4gdmVydGV4VmFsdWUgYW5kIHdlIGRvbid0IHVzZSBlZGdlVmFsdWUuCi0gKiBUaGUgZGV0YWlscyBhYm91dCBtZXNzYWdlIGFyZSBpbiBlZHUudWNpLmljcy5wcmVnZWxpeC5leGFtcGxlLmlvLk1lc3NhZ2VXcml0YWJsZS4gCi0gKi8KLXB1YmxpYyBjbGFzcyB0ZXN0RGVsZXRlVmVydGV4SWQgZXh0ZW5kcyBWZXJ0ZXg8Qnl0ZXNXcml0YWJsZSwgQnl0ZVdyaXRhYmxlLCBOdWxsV3JpdGFibGUsIE1lc3NhZ2VXcml0YWJsZT57Ci0KLQkvKioKLQkgKiBGb3IgdGVzdAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbXB1dGUoSXRlcmF0b3I8TWVzc2FnZVdyaXRhYmxlPiBtc2dJdGVyYXRvcikgewotCQlTdHJpbmcgcyA9ICIxMDAxMDAiOwotCQlieXRlW10gYiA9IEJpdHdpc2VPcGVyYXRpb24uY29udmVydEJpbmFyeVN0cmluZ1RvQnl0ZXMocyk7Ci0JCWlmKGdldFN1cGVyc3RlcCgpID09IDEgJiYgQXJyYXlzLmVxdWFscyhiLGdldFZlcnRleElkKCkuZ2V0Qnl0ZXMoKSkpewotCQkJLy9kZWxldGVWZXJ0ZXgoZ2V0VmVydGV4SWQoKSk7Ci0JCX0KLQkJdm90ZVRvSGFsdCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByZWdlbGl4Sm9iIGpvYiA9IG5ldyBQcmVnZWxpeEpvYihNZXJnZUdyYXBoVmVydGV4LmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIGpvYi5zZXRWZXJ0ZXhDbGFzcyhUZXN0TG9hZEdyYXBoVmVydGV4LmNsYXNzKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJpbmFyeUlucHV0IGFuZCBCaW5hcnlPdXRwdXQKLSAgICAgICAgICovCi0gICAgICAgIGpvYi5zZXRWZXJ0ZXhJbnB1dEZvcm1hdENsYXNzKEJpbmFyeUxvYWRHcmFwaElucHV0Rm9ybWF0LmNsYXNzKTsgCi0gICAgICAgIGpvYi5zZXRWZXJ0ZXhPdXRwdXRGb3JtYXRDbGFzcyhCaW5hcnlMb2FkR3JhcGhPdXRwdXRGb3JtYXQuY2xhc3MpOyAKLSAgICAgICAgam9iLnNldE91dHB1dEtleUNsYXNzKEJ5dGVzV3JpdGFibGUuY2xhc3MpOwotICAgICAgICBqb2Iuc2V0T3V0cHV0VmFsdWVDbGFzcyhCeXRlV3JpdGFibGUuY2xhc3MpOwotICAgICAgICBDbGllbnQucnVuKGFyZ3MsIGpvYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC90eXBlL01lc3NhZ2UuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvbWFpbi9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvdHlwZS9NZXNzYWdlLmphdmEKaW5kZXggZjk2NWQ2NC4uZjU1NmE3MyAxMDA2NDQKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC90eXBlL01lc3NhZ2UuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3R5cGUvTWVzc2FnZS5qYXZhCkBAIC02LDQgKzYsMjIgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDE7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EID0gMjsKIAkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIE1FU1NBR0VfQ09OVEVOVHsKKwkJCisJCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRGcm9tQ29kZShpbnQgY29kZSl7CisJCQlTdHJpbmcgciA9ICIiOworCQkJc3dpdGNoKGNvZGUpeworCQkJY2FzZSBOT046CisJCQkJciA9ICJOT04iOworCQkJCWJyZWFrOworCQkJY2FzZSBTVEFSVDoKKwkJCQlyID0gIlNUQVJUIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5EOgorCQkJCXIgPSAiRU5EIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldHVybiByOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy9tYWluL2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC90eXBlL1N0YXRlLmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3R5cGUvU3RhdGUuamF2YQppbmRleCAyYTJhM2YzLi41NDQ3ZDI2IDEwMDY0NAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3R5cGUvU3RhdGUuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL21haW4vamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L3R5cGUvU3RhdGUuamF2YQpAQCAtNyw0ICs3LDM2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlEX1ZFUlRFWCA9IDM7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9ERUxFVEUgPSA0OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMX1ZFUlRFWCA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfREVMRVRFID0gNjsKKwkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFNUQVRFX0NPTlRFTlR7CisKKwkJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudEZyb21Db2RlKGludCBjb2RlKXsKKwkJCVN0cmluZyByID0gIiI7CisJCQlzd2l0Y2goY29kZSl7CisJCQljYXNlIE5PTl9WRVJURVg6CisJCQkJciA9ICJOT05fVkVSVEVYIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1RBUlRfVkVSVEVYOgorCQkJCXIgPSAiU1RBUlRfVkVSVEVYIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5EX1ZFUlRFWDoKKwkJCQlyID0gIkVORF9WRVJURVgiOworCQkJCWJyZWFrOworCQkJY2FzZSBNSURfVkVSVEVYOgorCQkJCXIgPSAiTUlEX1ZFUlRFWCI7CisJCQkJYnJlYWs7CisJCQljYXNlIFRPREVMRVRFOgorCQkJCXIgPSAiVE9ERUxFVEUiOworCQkJCWJyZWFrOworCQkJY2FzZSBGSU5BTF9WRVJURVg6CisJCQkJciA9ICJGSU5BTF9WRVJURVgiOworCQkJCWJyZWFrOworCQkJY2FzZSBGSU5BTF9ERUxFVEU6CisJCQkJciA9ICJGSU5BTF9ERUxFVEUiOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuIHI7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL3Rlc3QvamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0pvYkdlbi9Kb2JHZW5lcmF0b3IuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvdGVzdC9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvSm9iR2VuL0pvYkdlbmVyYXRvci5qYXZhCmluZGV4IDdlNzQwY2QuLjNjZmU0YzggMTAwNjQ0Ci0tLSBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvdGVzdC9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvSm9iR2VuL0pvYkdlbmVyYXRvci5qYXZhCisrKyBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvdGVzdC9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvSm9iR2VuL0pvYkdlbmVyYXRvci5qYXZhCkBAIC0xMCwxNiArMTAsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LkZpbGVJbnB1dEZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLm91dHB1dC5GaWxlT3V0cHV0Rm9ybWF0OwogCi1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5CaW5hcnlMb2FkR3JhcGhJbnB1dEZvcm1hdDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LkJpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdDsKIGltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LkxvYWRHcmFwaFZlcnRleDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LkxvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LkxvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhPdXRwdXRGb3JtYXQ7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5mb3JtYXQuQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQ7CitpbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5mb3JtYXQuQmluYXJ5TG9hZEdyYXBoT3V0cHV0Rm9ybWF0OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguZm9ybWF0LkxvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhJbnB1dEZvcm1hdDsKK2ltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmZvcm1hdC5Mb2dBbGdvcml0aG1Gb3JNZXJnZUdyYXBoT3V0cHV0Rm9ybWF0OworaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguaW8uVmFsdWVTdGF0ZVdyaXRhYmxlOwogaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguTG9nQWxnb3JpdGhtRm9yTWVyZ2VHcmFwaFZlcnRleDsKIGltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4Lk1lcmdlR3JhcGhWZXJ0ZXg7Ci1pbXBvcnQgZWR1LnVjaS5pY3MuZ2Vub21peC5wcmVnZWxpeC5UZXN0TG9hZEdyYXBoVmVydGV4OwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguVGV4dExvYWRHcmFwaElucHV0Rm9ybWF0OwotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguTG9hZEdyYXBoVmVydGV4LlNpbXBsZUxvYWRHcmFwaFZlcnRleE91dHB1dEZvcm1hdDsKIGltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuam9iLlByZWdlbGl4Sm9iOwogCiAKQEAgLTMyLDIxICszMCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZUxvYWRHcmFwaEpvYihTdHJpbmcgam9iTmFtZSwgU3RyaW5nIG91dHB1dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgCVByZWdlbGl4Sm9iIGpvYiA9IG5ldyBQcmVnZWxpeEpvYihqb2JOYW1lKTsKICAgICAJam9iLnNldFZlcnRleENsYXNzKExvYWRHcmFwaFZlcnRleC5jbGFzcyk7Ci0gICAgCWpvYi5zZXRWZXJ0ZXhJbnB1dEZvcm1hdENsYXNzKFRleHRMb2FkR3JhcGhJbnB1dEZvcm1hdC5jbGFzcyk7Ci0gICAgICAgIGpvYi5zZXRWZXJ0ZXhPdXRwdXRGb3JtYXRDbGFzcyhTaW1wbGVMb2FkR3JhcGhWZXJ0ZXhPdXRwdXRGb3JtYXQuY2xhc3MpOwotICAgICAgICBGaWxlSW5wdXRGb3JtYXQuc2V0SW5wdXRQYXRocyhqb2IsIEhERlNfSU5QVVRQQVRIKTsKLSAgICAgICAgRmlsZU91dHB1dEZvcm1hdC5zZXRPdXRwdXRQYXRoKGpvYiwgbmV3IFBhdGgoSERGU19PVVRQVVRQQUgpKTsKLSAgICAgICAgam9iLmdldENvbmZpZ3VyYXRpb24oKS5zZXRMb25nKFByZWdlbGl4Sm9iLk5VTV9WRVJUSUNFLCAyMCk7Ci0gICAgICAgIGpvYi5nZXRDb25maWd1cmF0aW9uKCkud3JpdGVYbWwobmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUob3V0cHV0UGF0aCkpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5Mb2FkR3JhcGgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIAlnZW5lcmF0ZUxvYWRHcmFwaEpvYigiTG9hZEdyYXBoIiwgb3V0cHV0QmFzZSArICJMb2FkR3JhcGgueG1sIik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVCaW5hcnlMb2FkR3JhcGhKb2IoU3RyaW5nIGpvYk5hbWUsIFN0cmluZyBvdXRwdXRQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIAlQcmVnZWxpeEpvYiBqb2IgPSBuZXcgUHJlZ2VsaXhKb2Ioam9iTmFtZSk7Ci0gICAgCWpvYi5zZXRWZXJ0ZXhDbGFzcyhUZXN0TG9hZEdyYXBoVmVydGV4LmNsYXNzKTsKICAgICAJam9iLnNldFZlcnRleElucHV0Rm9ybWF0Q2xhc3MoQmluYXJ5TG9hZEdyYXBoSW5wdXRGb3JtYXQuY2xhc3MpOwogICAgICAgICBqb2Iuc2V0VmVydGV4T3V0cHV0Rm9ybWF0Q2xhc3MoQmluYXJ5TG9hZEdyYXBoT3V0cHV0Rm9ybWF0LmNsYXNzKTsKICAgICAgICAgam9iLnNldE91dHB1dEtleUNsYXNzKEJ5dGVzV3JpdGFibGUuY2xhc3MpOwpAQCAtNTYsOCArMzksOCBAQAogICAgICAgICBqb2IuZ2V0Q29uZmlndXJhdGlvbigpLndyaXRlWG1sKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKG91dHB1dFBhdGgpKSk7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuQmluYXJ5TG9hZEdyYXBoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAJZ2VuZXJhdGVCaW5hcnlMb2FkR3JhcGhKb2IoIkJpbmFyeUxvYWRHcmFwaCIsIG91dHB1dEJhc2UgKyAiQmluYXJ5TG9hZEdyYXBoLnhtbCIpOworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuTG9hZEdyYXBoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAJZ2VuZXJhdGVMb2FkR3JhcGhKb2IoIkxvYWRHcmFwaCIsIG91dHB1dEJhc2UgKyAiTG9hZEdyYXBoLnhtbCIpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdlbmVyYXRlTWVyZ2VHcmFwaEpvYihTdHJpbmcgam9iTmFtZSwgU3RyaW5nIG91dHB1dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC02Niw3ICs0OSw3IEBACiAgICAgCWpvYi5zZXRWZXJ0ZXhJbnB1dEZvcm1hdENsYXNzKEJpbmFyeUxvYWRHcmFwaElucHV0Rm9ybWF0LmNsYXNzKTsKICAgICAgICAgam9iLnNldFZlcnRleE91dHB1dEZvcm1hdENsYXNzKEJpbmFyeUxvYWRHcmFwaE91dHB1dEZvcm1hdC5jbGFzcyk7CiAgICAgICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhCeXRlc1dyaXRhYmxlLmNsYXNzKTsKLSAgICAgICAgam9iLnNldE91dHB1dFZhbHVlQ2xhc3MoQnl0ZVdyaXRhYmxlLmNsYXNzKTsKKyAgICAgICAgam9iLnNldE91dHB1dFZhbHVlQ2xhc3MoVmFsdWVTdGF0ZVdyaXRhYmxlLmNsYXNzKTsKICAgICAgICAgRmlsZUlucHV0Rm9ybWF0LnNldElucHV0UGF0aHMoam9iLCBIREZTX0lOUFVUUEFUSCk7CiAgICAgICAgIEZpbGVPdXRwdXRGb3JtYXQuc2V0T3V0cHV0UGF0aChqb2IsIG5ldyBQYXRoKEhERlNfT1VUUFVUUEFIKSk7CiAgICAgICAgIGpvYi5nZXRDb25maWd1cmF0aW9uKCkud3JpdGVYbWwobmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUob3V0cHV0UGF0aCkpKTsKQEAgLTgzLDcgKzY2LDcgQEAKICAgICAgICAgam9iLnNldFZlcnRleE91dHB1dEZvcm1hdENsYXNzKExvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGhPdXRwdXRGb3JtYXQuY2xhc3MpOwogICAgICAgICBqb2Iuc2V0RHluYW1pY1ZlcnRleFZhbHVlU2l6ZSh0cnVlKTsKICAgICAgICAgam9iLnNldE91dHB1dEtleUNsYXNzKEJ5dGVzV3JpdGFibGUuY2xhc3MpOwotICAgICAgICBqb2Iuc2V0T3V0cHV0VmFsdWVDbGFzcyhCeXRlV3JpdGFibGUuY2xhc3MpOworICAgICAgICBqb2Iuc2V0T3V0cHV0VmFsdWVDbGFzcyhWYWx1ZVN0YXRlV3JpdGFibGUuY2xhc3MpOwogICAgICAgICBGaWxlSW5wdXRGb3JtYXQuc2V0SW5wdXRQYXRocyhqb2IsIEhERlNfSU5QVVRQQVRIKTsKICAgICAgICAgRmlsZU91dHB1dEZvcm1hdC5zZXRPdXRwdXRQYXRoKGpvYiwgbmV3IFBhdGgoSERGU19PVVRQVVRQQUgpKTsKICAgICAgICAgam9iLmdldENvbmZpZ3VyYXRpb24oKS53cml0ZVhtbChuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShvdXRwdXRQYXRoKSkpOwpAQCAtOTksNyArODIsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJLy9nZW5CaW5hcnlMb2FkR3JhcGgoKTsKKwkJLy9nZW5Mb2FkR3JhcGgoKTsKIAkJZ2VuTWVyZ2VHcmFwaCgpOwogCQkvL2dlbkxvZ0FsZ29yaXRobUZvck1lcmdlR3JhcGgoKTsKIAkJLy9nZW5TZXF1ZW5jZUxvYWRHcmFwaCgpOwpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy90ZXN0L2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Kb2JSdW4vUnVuSm9iVGVzdENhc2UuamF2YSBiL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvdGVzdC9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvSm9iUnVuL1J1bkpvYlRlc3RDYXNlLmphdmEKaW5kZXggOThhN2VlYS4uODRiMzQyZSAxMDA2NDQKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy90ZXN0L2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Kb2JSdW4vUnVuSm9iVGVzdENhc2UuamF2YQorKysgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL3Rlc3QvamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0pvYlJ1bi9SdW5Kb2JUZXN0Q2FzZS5qYXZhCkBAIC0xLDkgKzEsNiBAQAogcGFja2FnZSBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LkpvYlJ1bjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKZGlmZiAtLWdpdCBhL2dlbm9taXgvZ2Vub21peC1wcmVnZWxpeC9zcmMvdGVzdC9qYXZhL2VkdS91Y2kvaWNzL2dlbm9taXgvcHJlZ2VsaXgvSm9iUnVuL1J1bkpvYlRlc3RTdWl0ZS5qYXZhIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy90ZXN0L2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Kb2JSdW4vUnVuSm9iVGVzdFN1aXRlLmphdmEKaW5kZXggZTY1N2I5NC4uZmI2OThlNSAxMDA2NDQKLS0tIGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy90ZXN0L2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Kb2JSdW4vUnVuSm9iVGVzdFN1aXRlLmphdmEKKysrIGIvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy90ZXN0L2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Kb2JSdW4vUnVuSm9iVGVzdFN1aXRlLmphdmEKQEAgLTQxLDcgKzQxLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9UT19PTkxZID0gInNyYy90ZXN0L3Jlc291cmNlcy9vbmx5LnR4dCI7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRVhURU5TSU9OX09GX1JFU1VMVFMgPSAicmVzdWx0IjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1BBVEggPSAiZGF0YS9pbnB1dC9TaW5nbGVQYXRoLnNlcSI7Ly9zZXF1ZW5jZUZpbGVNZXJnZVRlc3QKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QQVRIID0gImRhdGEvcmVzdWx0L1RyZWVQYXRoIjsvL3NlcXVlbmNlU2hvcnRGaWxlTWVyZ2VUZXN0CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhERlNfUEFUSCA9ICIvd2VibWFwLyI7CiAJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUkFDS1NfQVBQX05BTUUgPSAicHJlZ2VsaXgiOwpAQCAtMTQ0LDMxICsxNDQsMTcgQEAKIAkgKiBSdW5zIHRoZSB0ZXN0cyBhbmQgY29sbGVjdHMgdGhlaXIgcmVzdWx0IGluIGEgVGVzdFJlc3VsdC4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJ0ZXN0L3RpbWUiLHRydWUpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7IGUxLnByaW50U3RhY2tUcmFjZSgpO30KLQkJCi0JCQorCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewkJCiAJCXRyeSB7CiAJCQlpbnQgdGVzdENvdW50ID0gY291bnRUZXN0Q2FzZXMoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKLQkJCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCQkJCS8vIGNsZWFudXBTdG9yZXMoKTsKIAkJCQlUZXN0IGVhY2ggPSB0aGlzLnRlc3RBdChpKTsKIAkJCQlpZiAocmVzdWx0LnNob3VsZFN0b3AoKSkKIAkJCQkJYnJlYWs7CiAJCQkJcnVuVGVzdChlYWNoLCByZXN1bHQpOwotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWxvbmcgdG90YWxUaW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odG90YWxUaW1lKTsKLQkJCQl0cnkgewotCQkJCQl3cml0ZXIud3JpdGUoIlRpbWU6ICIgKyB0b3RhbFRpbWUgKyAiXHJcbiIpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jayAKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTt9IAogCQkJfQotCQkJd3JpdGVyLmNsb3NlKCk7CisKIAkJCXRlYXJEb3duKCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwpkaWZmIC0tZ2l0IGEvZ2Vub21peC9nZW5vbWl4LXByZWdlbGl4L3NyYy90ZXN0L2phdmEvZWR1L3VjaS9pY3MvZ2Vub21peC9wcmVnZWxpeC9Mb2FkR3JhcGhWZXJ0ZXhUZXN0LmphdmEgYi9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL3Rlc3QvamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvYWRHcmFwaFZlcnRleFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NzM3Ny4uMDAwMDAwMAotLS0gYS9nZW5vbWl4L2dlbm9taXgtcHJlZ2VsaXgvc3JjL3Rlc3QvamF2YS9lZHUvdWNpL2ljcy9nZW5vbWl4L3ByZWdlbGl4L0xvYWRHcmFwaFZlcnRleFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1wYWNrYWdlIGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGVkdS51Y2kuaWNzLmdlbm9taXgucHJlZ2VsaXguTG9hZEdyYXBoVmVydGV4LlNpbXBsZUxvYWRHcmFwaFZlcnRleE91dHB1dEZvcm1hdDsKLWltcG9ydCBlZHUudWNpLmljcy5nZW5vbWl4LnByZWdlbGl4LmV4YW1wbGUuY2xpZW50LkNsaWVudDsKLWltcG9ydCBlZHUudWNpLmljcy5wcmVnZWxpeC5hcGkuam9iLlByZWdlbGl4Sm9iOwotCi1wdWJsaWMgY2xhc3MgTG9hZEdyYXBoVmVydGV4VGVzdCB7Ci0KLQkvKioKLQkgKiBJIGNhbid0IGRlYnVnIGluIEpVbml0cyB0ZXN0IHNvIHRoYXQgSSBjYW4ndCBmaW5kIG15IGVycm9yIGhlcmUuIFNvIEkgbGVhdmUgY29tbWVudHMgaGVyZS4KLQkgKiBJIHdpbGwgZmlndXJlIG91dCBhcyBzb29uIGFzIHBvc3NpYmxlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RfUkVTVUxUX0ZJTEUgPSAiZXhwZWN0ZWRfcmVzdWx0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfUEFUSFMgPSAiZm9sZGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX1BBVEggPSAicmVzdWx0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVAgPSAiMTY5LjIzNC4xMzQuMjEyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVCA9ICIzMDk5IjsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvL2luaXRpYXRlIGFyZ3MKLQkvKglTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1s4XTsKLQkJYXJnc1swXSA9ICItaW5wdXRwYXRocyI7IAotCQlhcmdzWzFdID0gSU5QVVRfUEFUSFM7Ci0JCWFyZ3NbMl0gPSAiLW91dHB1dHBhdGgiOwotCQlhcmdzWzNdID0gT1VUUFVUX1BBVEg7Ci0JCWFyZ3NbNF0gPSAiLWlwIjsKLQkJYXJnc1s1XSA9IElQOwotCQlhcmdzWzZdID0gIi1wb3J0IjsKLQkJYXJnc1s3XSA9IFBPUlQ7Ci0gICAgICAgIFByZWdlbGl4Sm9iIGpvYiA9IG5ldyBQcmVnZWxpeEpvYihMb2FkR3JhcGhWZXJ0ZXguY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgam9iLnNldFZlcnRleENsYXNzKExvYWRHcmFwaFZlcnRleC5jbGFzcyk7Ci0gICAgICAgIGpvYi5zZXRWZXJ0ZXhJbnB1dEZvcm1hdENsYXNzKFRleHRMb2FkR3JhcGhJbnB1dEZvcm1hdC5jbGFzcyk7Ci0gICAgICAgIGpvYi5zZXRWZXJ0ZXhPdXRwdXRGb3JtYXRDbGFzcyhTaW1wbGVMb2FkR3JhcGhWZXJ0ZXhPdXRwdXRGb3JtYXQuY2xhc3MpOwotICAgICAgICBDbGllbnQucnVuKGFyZ3MsIGpvYik7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZUV4cGVjdEJpbmFyeUZpbGUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vdGVzdCBpZiB0aGUgYWN0dWFsIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkIGZpbGUKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIGFjdHVhbF9kaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oT1VUUFVUX1BBVEggKyAiLyoiKSk7Ci0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBleHBlY3RlZF9kaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oRVhQRUNUX1JFU1VMVF9GSUxFKSk7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxMaW5lLCBleHBlY3RlZExpbmUgPSBudWxsOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgYWN0dWFsU3QsIGV4cGVjdGVkU3Q7Ci0JCWJ5dGVbXSBhY3R1YWxWZXJ0ZXhJZCwgZXhwZWN0ZWRWZXJ0ZXhJZCA9IG51bGw7Ci0JCWJ5dGUgYWN0dWFsVmVydGV4VmFsdWUsIGV4cGVjdGVkVmVydGV4VmFsdWU7Ci0gICAgICAgIGJ5dGVbXSB0bXAgPSBudWxsOwotICAgICAgICB3aGlsZSgoKGFjdHVhbExpbmUgPSBhY3R1YWxfZGlzLnJlYWRMaW5lKCkpICE9IG51bGwpICYmIAotICAgICAgICAJCSgoZXhwZWN0ZWRMaW5lID0gZXhwZWN0ZWRfZGlzLnJlYWRMaW5lKCkpICE9IG51bGwpKXsKLSAgICAgICAgCWFjdHVhbFN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY3R1YWxMaW5lLCAiICIpOwotCQkJYWN0dWFsVmVydGV4SWQgPSBhY3R1YWxTdC5uZXh0VG9rZW4oKS5nZXRCeXRlcygpOwotCQkJdG1wID0gYWN0dWFsU3QubmV4dFRva2VuKCkuZ2V0Qnl0ZXMoKTsKLQkJCWFjdHVhbFZlcnRleFZhbHVlID0gdG1wWzBdOwotCQkJCi0JCQlleHBlY3RlZFN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHBlY3RlZExpbmUsIiAiKTsKLQkJCWV4cGVjdGVkVmVydGV4SWQgPSBleHBlY3RlZFN0Lm5leHRUb2tlbigpLmdldEJ5dGVzKCk7Ci0JCQl0bXAgPSBleHBlY3RlZFN0Lm5leHRUb2tlbigpLmdldEJ5dGVzKCk7Ci0JCQlleHBlY3RlZFZlcnRleFZhbHVlID0gdG1wWzBdOwotCQkJCi0JCQlhc3NlcnRFcXVhbHMoImFjdHVhbFZleHRleElkID09IGV4cGVjdGVkVmVydGV4SWQiLCBhY3R1YWxWZXJ0ZXhJZCwgZXhwZWN0ZWRWZXJ0ZXhJZCk7Ci0JCQlhc3NlcnRFcXVhbHMoImFjdHVhbFZlcnRleFZhbHVlID09IGV4cGVjdGVkVmVydGV4VmFsdWUiLCBhY3R1YWxWZXJ0ZXhWYWx1ZSwgZXhwZWN0ZWRWZXJ0ZXhWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiYWN0dWFsTGluZSBzaG91bGQgYmUgdGhlIGVuZCBhbmQgYmUgZXF1YWwgdG8gbnVsbCIsIGFjdHVhbExpbmUsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImV4cGVjdGVkTGluZSBzaG91bGQgYmUgdGhlIGVuZCBhbmQgYmUgZXF1YWwgdG8gbnVsbCIsIGV4cGVjdGVkTGluZSwgbnVsbCk7Ki8KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUV4cGVjdEJpbmFyeUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKElOUFVUX1BBVEhTICsgIi8qIikpOwotCQlEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKEVYUEVDVF9SRVNVTFRfRklMRSkpOwotCQlTdHJpbmcgbGluZTsKLQkJYnl0ZVtdIHZlcnRleElkID0gbnVsbDsKLQkJYnl0ZSB2ZXJ0ZXhWYWx1ZTsKLQkJYnl0ZVtdIHRtcCA9IG51bGw7Ci0JCXdoaWxlKChsaW5lID0gZGlzLnJlYWRMaW5lKCkpICE9IG51bGwpewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiICIpOwotCQkJdmVydGV4SWQgPSBzdC5uZXh0VG9rZW4oKS5nZXRCeXRlcygpOwotCQkJdG1wID0gc3QubmV4dFRva2VuKCkuZ2V0Qnl0ZXMoKTsKLQkJCXZlcnRleFZhbHVlID0gdG1wWzBdOwkJCi0JCQkKLQkJCXZlcnRleFZhbHVlID0gKGJ5dGUpICh2ZXJ0ZXhWYWx1ZSA8PCAxKTsgCi0JCQlmb3IoaW50IGkgPSAwOyBpIDwgdmVydGV4SWQubGVuZ3RoOyBpKyspCi0JCQkJZG9zLndyaXRlQnl0ZSh2ZXJ0ZXhJZFtpXSk7Ci0JCQlkb3Mud3JpdGVCeXRlKChieXRlKTMyKTsgLy9zcGFjZQotCQkJZG9zLndyaXRlQnl0ZSh2ZXJ0ZXhWYWx1ZSk7Ci0JCQlkb3Mud3JpdGVCeXRlKChieXRlKTEwKTsgLy9saW5lIGZlZWQKLQkJfQotCQkKLQkJZGlzLmNsb3NlKCk7Ci0JCWRvcy5jbG9zZSgpOwotCX0KLQotfQo=