ZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2NvbW1vbi9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi51aS9hYm91dC5odG1sIGIvYW5hbHlzaXMvY29tbW9uL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnVpL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvY29tbW9uL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnVpL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvY29tbW9uL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnVpL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2NvbW1vbi9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvYW5hbHlzaXMvY29tbW9uL3VpL0VTRkFuYWx5c2lzQ29tbW9uVUlBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2NvbW1vbi9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvYW5hbHlzaXMvY29tbW9uL3VpL0VTRkFuYWx5c2lzQ29tbW9uVUlBY3RpdmF0b3IuamF2YQppbmRleCA2ZjNlNGVlLi4zZmRjNDFlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9jb21tb24vb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2FuYWx5c2lzL2NvbW1vbi91aS9FU0ZBbmFseXNpc0NvbW1vblVJQWN0aXZhdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvY29tbW9uL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9hbmFseXNpcy9jb21tb24vdWkvRVNGQW5hbHlzaXNDb21tb25VSUFjdGl2YXRvci5qYXZhCkBAIC0yMiw1MyArMjIsNTMgQEAKICAqLwogcHVibGljIGNsYXNzIEVTRkFuYWx5c2lzQ29tbW9uVUlBY3RpdmF0b3IgIGV4dGVuZHMgRU1GUGx1Z2luIHsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkFuYWx5c2lzQ29tbW9uVUlBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGQW5hbHlzaXNDb21tb25VSUFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkFuYWx5c2lzQ29tbW9uVUlBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGQW5hbHlzaXNDb21tb25VSUFjdGl2YXRvcigpOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGQW5hbHlzaXNDb21tb25VSUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGQW5hbHlzaXNDb21tb25VSUFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7CisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJc1BsdWdpbiA9IHRoaXM7CiAKLSAgICAgICAgfQotICAgIH0KKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2NvbW1vbi9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVsZW5nL2J1aWxkLnByb3BlcnRpZXMgYi9hbmFseXNpcy9jb21tb24vcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlbGVuZy9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDk0YmI4ODMuLjNkNDViNGYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2NvbW1vbi9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVsZW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvYW5hbHlzaXMvY29tbW9uL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi5yZWxlbmcvYnVpbGQucHJvcGVydGllcwpAQCAtMSw0ICsxLDQgQEAKIGJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCiAgICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCisgICAgICAgICAgICAgICBlcGwtdjIwLmh0bWwKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2NvbW1vbi9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcyBiL2FuYWx5c2lzL2NvbW1vbi9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCA0NGY2NjVlLi4yZDMzMmFlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9jb21tb24vcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlbGVuZy9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvYW5hbHlzaXMvY29tbW9uL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi5yZWxlbmcvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xLDE2ICsxLDE3IEBACi1mZWF0dXJlTmFtZSA9IEVTRiBDb21tb24gQW5hbHlzaXMgVG9vbHMgKE1hbmRhdG9yeSkgKEluY3ViYXRpb24pCitmZWF0dXJlTmFtZSA9IEVTRiBDb3JlIChNYW5kYXRvcnkpIChJbmN1YmF0aW9uKQogcHJvdmlkZXJOYW1lID0gUG9sYXJTeXMKLWRlc2NyaXB0aW9uID0gQ29tbW9uIEFuYWx5c2lzIGZlYXR1cmUgb2YgRVNGIChNYW5kYXRvcnkpLiAoSW5jdWJhdGlvbikKK2Rlc2NyaXB0aW9uID0gVGVjaG5pY2FsIENvcmUgZmVhdHVyZSBvZiBFU0YgKE1hbmRhdG9yeSkuIChJbmN1YmF0aW9uKQogY29weXJpZ2h0PVwKIENvcHlyaWdodCAoYykgMjAxNiBBTEw0VEVDICYgQ0VBIExJU1QuXG5cCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMFxuXAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAogXG5cCiBDb250cmlidXRvcnM6XG5cCiAgICAgSm9uYXRoYW4gRHVtb250IChBTEw0VEVDKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuXAotICAgIFl1cGFucXVpIE11bm96IEp1bGhvIChDRUEgTElTVCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgorICAgIFl1cGFucXVpIE11bm96IEp1bGhvIChDRUEgTElTVCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cblwKKwlBbnNnYXIgUmFkZXJtYWNoZXIgKENFQSBMSVNUKSAtIHVwZ3JhZGUgdG8gMjAxOC0xMiBhbmQgaW1wcm92ZW1lbnRzXG4KIGxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCiBsaWNlbnNlPVwKIEVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCkBAIC0yOSw4ICszMCw4IEBACiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMFxuXAotKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjBcblwKKygiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cblwKIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCiBDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTXG5cCmRpZmYgLS1naXQgYS9hbmFseXNpcy9jb21tb24vcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlbGVuZy9saWNlbnNlLmh0bWwgYi9hbmFseXNpcy9jb21tb24vcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlbGVuZy9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uNjM3YTE4MSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvY29tbW9uL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi5yZWxlbmcvbGljZW5zZS5odG1sCisrKyBiL2FuYWx5c2lzL2NvbW1vbi9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVsZW5nL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMzAwIEBACiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCi08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDIuMDwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBtYXJnaW46IDEuNWVtIDNlbTsKKyAgICAgIH0KKyAgICAgIGgxeworICAgICAgICBmb250LXNpemU6MS41ZW07CisgICAgICB9CisgICAgICBoMnsKKyAgICAgICAgZm9udC1zaXplOjFlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTowLjVlbTsKKyAgICAgICAgbWFyZ2luLXRvcDoxZW07CisgICAgICB9CisgICAgICBwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICAgIH0KKyAgICAgIHVsLCBvbHsKKyAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wPC9oMT4KKyAgICA8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgICAgUFVCTElDIExJQ0VOU0UgKCZsZHF1bztBR1JFRU1FTlQmcmRxdW87KS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgICAgT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJiMwMzk7UyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRlZmluaXRpb25zIj4xLiBERUZJTklUSU9OUzwvaDI+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dGlvbiZyZHF1bzsgbWVhbnM6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICAgICAgICBhbmQgYXJlIERpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24KKyAgICAgICAgJmxkcXVvO29yaWdpbmF0ZXMmcmRxdW87IGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAorICAgICAgICBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJiMwMzk7cyBiZWhhbGYuCisgICAgICAgIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gdGhhdAorICAgICAgICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPiZsZHF1bztDb250cmlidXRvciZyZHF1bzsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3A+CisgICAgPHA+JmxkcXVvO0xpY2Vuc2VkIFBhdGVudHMmcmRxdW87IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKKyAgICAgIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKKyAgICAgIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1Byb2dyYW0mcmRxdW87IG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCisgICAgICBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztSZWNpcGllbnQmcmRxdW87IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIG9yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEZXJpdmF0aXZlIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO01vZGlmaWVkIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorICAgICAgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgICBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKKyAgICAgIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCisgICAgICBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsIGludGVyZmFjZXMsCisgICAgICB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5IGluIGVhY2ggY2FzZQorICAgICAgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbSBvciBNb2RpZmllZAorICAgICAgV29ya3MgdGhlcmVvZi4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rpc3RyaWJ1dGUmcmRxdW87IG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCisgICAgICBpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U291cmNlIENvZGUmcmRxdW87IG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworICAgICAgbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKKyAgICAgIGRvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NlY29uZGFyeSBMaWNlbnNlJnJkcXVvOyBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgICAgVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKKyAgICAgIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCisgICAgICBDb250cmlidXRvci4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJncmFudC1vZi1yaWdodHMiPjIuIEdSQU5UIE9GIFJJR0hUUzwvaDI+CisgICAgPHVsPgorICAgICAgPGxpPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgICAgICAgIHB1YmxpY2x5IHBlcmZvcm0sIERpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MuCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgICAgICAgIGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsCisgICAgICAgIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwKKyAgICAgICAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgICAgICAgIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwKKyAgICAgICAgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKKyAgICAgICAgYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCisgICAgICAgIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQorICAgICAgICBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIKKyAgICAgICAgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgICAgICAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgICAgICAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgICAgICAgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgICAgICAgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgICAgICAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgICAgICAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzCisgICAgICAgIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQorICAgICAgICByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLAorICAgICAgICBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvCisgICAgICAgIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQmIzAzOTtzCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisgICAgICA8L2xpPgorICAgICAgPGxpPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKKyAgICAgICAgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisgICAgICA8L2xpPgorICAgICAgPGxpPmUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubyBDb250cmlidXRvcgorICAgICAgICBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyB0byBhbnkgUmVjaXBpZW50IChvdGhlciB0aGFuIHRob3NlIHNldCBmb3J0aAorICAgICAgICBpbiB0aGlzIEFncmVlbWVudCkgYXMgYSByZXN1bHQgb2Ygc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJlY2VpcHQgb2YgdGhlCisgICAgICAgIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UgKGlmIHBlcm1pdHRlZCB1bmRlcgorICAgICAgICB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+My4gUkVRVUlSRU1FTlRTPC9oMj4KKyAgICA8cD4zLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgICAgICAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgICAgICAgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgICAgICAgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgICAgICAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICAgICAgICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgICAgICAgIGRpZmZlcmVudCB0aGFuIHRoaXMgQWdyZWVtZW50LCBwcm92aWRlZCB0aGF0IHN1Y2ggbGljZW5zZToKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwKKyAgICAgICAgICAgIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyYjMDM5OyByaWdodHMgaW4gdGhlCisgICAgICAgICAgICBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkgcGFydHkKKyAgICAgICAgICAgIHRvIGJlIHVuZGVyIGEgbGljZW5zZSB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgc2VjdGlvbiAzLgorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBvciBpZiB0aGUgUHJvZ3JhbSAoaSkKKyAgICAgICAgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IgZmlsZXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdW5kZXIgYSBTZWNvbmRhcnkgTGljZW5zZSwgYW5kIChpaSkgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgYXR0YWNoZWQgdG8KKyAgICAgICAgdGhlIFNvdXJjZSBDb2RlIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgICAgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2gKKyAgICAgICAgU2Vjb25kYXJ5IExpY2Vuc2VzLCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssCisgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwgb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5CisgICAgICAoJmxzcXVvO25vdGljZXMmcnNxdW87KSBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtIGZyb20gYW55IGNvcHkgb2YgdGhlIFByb2dyYW0gd2hpY2gKKyAgICAgIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZCB0aGVpciBvd24gYXBwcm9wcmlhdGUKKyAgICAgIG5vdGljZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iY29tbWVyY2lhbC1kaXN0cmlidXRpb24iPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9oMj4KKyAgICA8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcworICAgICAgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCisgICAgICBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUKKyAgICAgIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQKKyAgICAgIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlcgorICAgICAgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQorICAgICAgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmbGRxdW87Q29tbWVyY2lhbCBDb250cmlidXRvciZyZHF1bzspCisgICAgICBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisgICAgICAoJmxkcXVvO0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnJkcXVvOykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworICAgICAgKGNvbGxlY3RpdmVseSAmbGRxdW87TG9zc2VzJnJkcXVvOykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKKyAgICAgIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50CisgICAgICBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uCisgICAgICB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuCisgICAgICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZworICAgICAgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvCisgICAgICBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCisgICAgICBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sCisgICAgICB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZAorICAgICAgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKyAgICA8L3A+CisgICAgPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbQorICAgICAgaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCisgICAgICBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMKKyAgICAgIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3ImIzAzOTtzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorICAgICAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMKKyAgICAgIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKKyAgICAgIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMKKyAgICAgIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9IndhcnJhbnR5Ij41LiBOTyBXQVJSQU5UWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZsZHF1bztBUyBJUyZyZHF1bzsgQkFTSVMsIFdJVEhPVVQKKyAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCisgICAgICBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUKKyAgICAgIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlCisgICAgICB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCisgICAgICBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkaXNjbGFpbWVyIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZCisgICAgICBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisgICAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKKyAgICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgICAgICBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKKyAgICAgIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJnZW5lcmFsIj43LiBHRU5FUkFMPC9oMj4KKyAgICA8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorICAgICAgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZQorICAgICAgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlCisgICAgICBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50CisgICAgICBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisgICAgPC9wPgorICAgIDxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmCisgICAgICAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQorICAgICAgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyBncmFudGVkCisgICAgICB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAgICA8L3A+CisgICAgPHA+QWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bworICAgICAgY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZAorICAgICAgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nCisgICAgICBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtCisgICAgICBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCYjMDM5O3Mgb2JsaWdhdGlvbnMgdW5kZXIKKyAgICAgIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlCisgICAgICBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorICAgIDwvcD4KKyAgICA8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkKKyAgICAgIG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcworICAgICAgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudAorICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0CisgICAgICB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50CisgICAgICBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzCisgICAgICB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YKKyAgICAgIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorICAgICAgKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIERpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24KKyAgICAgIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKKyAgICAgIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBEaXN0cmlidXRlCisgICAgICB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uCisgICAgPC9wPgorICAgIDxwPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorICAgICAgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55CisgICAgICBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAorICAgICAgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAorICAgICAgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IGlzIGludGVuZGVkCisgICAgICB0byBiZSBlbmZvcmNlYWJsZSBieSBhbnkgZW50aXR5IHRoYXQgaXMgbm90IGEgQ29udHJpYnV0b3Igb3IgUmVjaXBpZW50LgorICAgICAgTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImV4aGliaXQtYSI+RXhoaWJpdCBBICZuZGFzaDsgRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlPC9oMj4KKyAgICA8cD4mbGRxdW87VGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIAorICAgIAlTZWNvbmRhcnkgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIAorICAgIAlpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IHtuYW1lIGxpY2Vuc2UocyksCisgICAgCXZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uJnJkcXVvOworICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPlNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgICAgICAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorICAgICAgPC9wPgorICAgICAgPHA+SWYgaXQgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSB0byBwdXQgdGhlIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgZmlsZSwKKyAgICAgICAgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRSBmaWxlIGluIGEKKyAgICAgICAgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3IKKyAgICAgICAgc3VjaCBhIG5vdGljZS4KKyAgICAgIDwvcD4KKyAgICAgIDxwPllvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbmFseXNpcy9jb21tb24vcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlc291cmNlcy5ncmFwaGljYWwvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2NvbW1vbi9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVzb3VyY2VzLmdyYXBoaWNhbC9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2NvbW1vbi9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVzb3VyY2VzLmdyYXBoaWNhbC9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL2NvbW1vbi9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVzb3VyY2VzLmdyYXBoaWNhbC9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9jb21tb24vcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlc291cmNlcy5ncmFwaGljYWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2FuYWx5c2lzL2NvbW1vbi9yZXNvdXJjZXMvZ3JhcGhpY2FsL0VTRkFuYWx5c2lzQ29tbW9uUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9jb21tb24vcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlc291cmNlcy5ncmFwaGljYWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2FuYWx5c2lzL2NvbW1vbi9yZXNvdXJjZXMvZ3JhcGhpY2FsL0VTRkFuYWx5c2lzQ29tbW9uUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yLmphdmEKaW5kZXggYzY4ZDI4MC4uYTlkMzg0ZSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvY29tbW9uL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLmFuYWx5c2lzLmNvbW1vbi5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9hbmFseXNpcy9jb21tb24vcmVzb3VyY2VzL2dyYXBoaWNhbC9FU0ZBbmFseXNpc0NvbW1vblJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2NvbW1vbi9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVzb3VyY2VzLmdyYXBoaWNhbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvYW5hbHlzaXMvY29tbW9uL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGQW5hbHlzaXNDb21tb25SZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IuamF2YQpAQCAtMjMsMTAxICsyMywxMDEgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIEVTRkFuYWx5c2lzQ29tbW9uUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yCi0gICAgZXh0ZW5kcyBFTUZQbHVnaW4geworCWV4dGVuZHMgRU1GUGx1Z2luIHsKIAotICAgIC8qKiBUaGUgcGx1Zy1pbiBJRC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLnBvbGFyc3lzLmVzZi5hbmFseXNpcy5jb21tb24ucmVzb3VyY2VzLmdyYXBoaWNhbCI7IC8vJE5PTi1OTFMtMSQKKwkvKiogVGhlIHBsdWctaW4gSUQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5wb2xhcnN5cy5lc2YuYW5hbHlzaXMuY29tbW9uLnJlc291cmNlcy5ncmFwaGljYWwiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGlzIHNpbmdsZXRvbiBhY3RpdmF0b3IuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVNGQW5hbHlzaXNDb21tb25SZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IgSU5TVEFOQ0UgPQotICAgICAgICBuZXcgRVNGQW5hbHlzaXNDb21tb25SZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGlzIHNpbmdsZXRvbiBhY3RpdmF0b3IuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVNGQW5hbHlzaXNDb21tb25SZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IgSU5TVEFOQ0UgPQorCQluZXcgRVNGQW5hbHlzaXNDb21tb25SZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBUaGUgc2hhcmVkIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBUaGUgc2hhcmVkIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEVTRkFuYWx5c2lzQ29tbW9uUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgRVNGQW5hbHlzaXNDb21tb25SZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBXYXJuaW5nIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIFdhcm5pbmcgc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvZG9jL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5kb2MvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2ZtZWEvZG9jL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5kb2MvYWJvdXQuaHRtbAppbmRleCBkMzVkNWFlLi43NzhlMWJhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL2RvYy9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZG9jL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvZm1lYS9kb2Mvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmRvYy9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi51aS9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9leGVjdXRpb24vdWkvRVNGRk1FQUV4ZWN1dGlvblVJQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi91aS9FU0ZGTUVBRXhlY3V0aW9uVUlBY3RpdmF0b3IuamF2YQppbmRleCA4NjhhMTk2Li5jMmE3ZjM4IDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi91aS9FU0ZGTUVBRXhlY3V0aW9uVUlBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi91aS9FU0ZGTUVBRXhlY3V0aW9uVUlBY3RpdmF0b3IuamF2YQpAQCAtMjQsMTA1ICsyNCwxMDUgQEAKICAqLwogcHVibGljIGNsYXNzIEVTRkZNRUFFeGVjdXRpb25VSUFjdGl2YXRvciBleHRlbmRzIEVNRlBsdWdpbiB7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZGTUVBRXhlY3V0aW9uVUlBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGRk1FQUV4ZWN1dGlvblVJQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQUV4ZWN1dGlvblVJQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFFeGVjdXRpb25VSUFjdGl2YXRvcigpOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGRk1FQUV4ZWN1dGlvblVJQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZGTUVBRXhlY3V0aW9uVUlBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHNQbHVnaW4uZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLklORk8sIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7CisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJc1BsdWdpbiA9IHRoaXM7CiAKLSAgICAgICAgfQorCQl9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0KHBDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCXN1cGVyLnN0YXJ0KHBDb250ZXh0KTsKKwkJfQorCX0KIAogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZUZNRUFUYWJsZUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlRk1FQVRhYmxlSGFuZGxlci5qYXZhCmluZGV4IGJkMWI2NDguLjljMzkwNDcgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlRk1FQVRhYmxlSGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlRk1FQVRhYmxlSGFuZGxlci5qYXZhCkBAIC0zMCwzNSArMzAsMzUgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZUZNRUFUYWJsZUhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlRk1FQVRhYmxlSGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ3JlYXRlRk1FQVRhYmxlSGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgJ0Jsb2NrRk1FQScgYW5kIGNhbGwgdGhlIGFjdGlvbiBmb3IgY3JlYXRpbmcgYSBGTUVBIFRhYmxlLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAnQmxvY2tGTUVBJyBhbmQgY2FsbCB0aGUgYWN0aW9uIGZvciBjcmVhdGluZyBhIEZNRUEgVGFibGUuCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IHBFdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgQ2xhc3MgdlNlbGVjdGVkQ2xhc3MgPQotICAgICAgICAgICAgKENsYXNzKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzXygpKTsKKwkJZmluYWwgQ2xhc3MgdlNlbGVjdGVkQ2xhc3MgPQorCQkJKENsYXNzKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzXygpKTsKIAotICAgICAgICBpZiAoKHZTZWxlY3RlZENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAmJiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkQ2xhc3MsIElTQmxvY2tGTUVBLmNsYXNzKSAhPSBudWxsKSkgewotICAgICAgICAgICAgRVNGVGFibGVzVXRpbC5jcmVhdGVUYWJsZSgKLSAgICAgICAgICAgICAgICBFU0ZGTUVBVGFibGVzU2V0LkZNRUFfVEFCTEVfSUQsCi0gICAgICAgICAgICAgICAgRVNGRk1FQVRhYmxlc1NldC5GTUVBX1RBQkxFX05BTUUsCi0gICAgICAgICAgICAgICAgdlNlbGVjdGVkQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJaWYgKCh2U2VsZWN0ZWRDbGFzcyAhPSBudWxsKQorCQkJJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBJU0Jsb2NrRk1FQS5jbGFzcykgIT0gbnVsbCkpIHsKKwkJCUVTRlRhYmxlc1V0aWwuY3JlYXRlVGFibGUoCisJCQkJRVNGRk1FQVRhYmxlc1NldC5GTUVBX1RBQkxFX0lELAorCQkJCUVTRkZNRUFUYWJsZXNTZXQuRk1FQV9UQUJMRV9OQU1FLAorCQkJCXZTZWxlY3RlZENsYXNzKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZhaWx1cmVNb2RlRnJvbVRhYmxlSGFuZGxlci5qYXZhIGIvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTRmFpbHVyZU1vZGVGcm9tVGFibGVIYW5kbGVyLmphdmEKaW5kZXggYWQyOWYzZC4uNWNmMWZjZiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTRmFpbHVyZU1vZGVGcm9tVGFibGVIYW5kbGVyLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTRmFpbHVyZU1vZGVGcm9tVGFibGVIYW5kbGVyLmphdmEKQEAgLTI2LDQxICsyNiw0MSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgQ3JlYXRlU0ZhaWx1cmVNb2RlRnJvbVRhYmxlSGFuZGxlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RVbWxOYXR0YWJsZUNyZWF0ZUNvbW1hbmRIYW5kbGVyCi0gICAgaW1wbGVtZW50cyBJSGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdFVtbE5hdHRhYmxlQ3JlYXRlQ29tbWFuZEhhbmRsZXIKKwlpbXBsZW1lbnRzIElIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZVNGYWlsdXJlTW9kZUZyb21UYWJsZUhhbmRsZXIoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIENyZWF0ZVNGYWlsdXJlTW9kZUZyb21UYWJsZUhhbmRsZXIoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC5zZXJ2aWNlLmNyZWF0aW9uLmhhbmRsZXIuQ3JlYXRlSGFuZGxlciNnZXRFbGVtZW50VHlwZVRvQ3JlYXRlKCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBJRWxlbWVudFR5cGUgdGhpcyBoYW5kbGVyIGlzIHN1cHBvc2VkIHRvIGNyZWF0ZQotICAgICAqCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZVRvQ3JlYXRlKCkgewotICAgICAgICByZXR1cm4gKElIaW50ZWRUeXBlKSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgIC5nZXRUeXBlKEVTRkZNRUFUeXBlc1NldC5TRkFJTFVSRU1PREVGTUVBX1RZUEVfSUQpOwotICAgIH0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMudW1sLnNlcnZpY2UuY3JlYXRpb24uaGFuZGxlci5DcmVhdGVIYW5kbGVyI2dldEVsZW1lbnRUeXBlVG9DcmVhdGUoKS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIElFbGVtZW50VHlwZSB0aGlzIGhhbmRsZXIgaXMgc3VwcG9zZWQgdG8gY3JlYXRlCisJICoKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlVG9DcmVhdGUoKSB7CisJCXJldHVybiAoSUhpbnRlZFR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQorCQkJLmdldFR5cGUoRVNGRk1FQVR5cGVzU2V0LlNGQUlMVVJFTU9ERUZNRUFfVFlQRV9JRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IGlmIHRoaXMgaGFuZGxlciBpcyBjdXJyZW50bHkgYWN0aXZlIGFuZCB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS4gQWRkaXRpb25hbGx5LCB2ZXJpZnkgaWYgdGhpcyB0YWJsZSBjYW4KLSAgICAgKiBhZGQgdGhpcyB0eXBlIG9mIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMudW1sLnNlcnZpY2UudHlwZXMuaGFuZGxlcnMuQWJzdHJhY3RDcmVhdGVDb21tYW5kSGFuZGxlciNzZXRFbmFibGVkKGphdmEubGFuZy5PYmplY3QpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEV2YWx1YXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChmaW5hbCBPYmplY3QgcEV2YWx1YXRpb25Db250ZXh0KSB7Ci0gICAgICAgIElOYXR0YWJsZU1vZGVsTWFuYWdlciB2VGFibGVNYW5hZ2VyID0KLSAgICAgICAgICAgIElOYXR0YWJsZU1vZGVsTWFuYWdlclV0aWxzLmdldFRhYmxlTWFuYWdlckZyb21Xb3JrYmVuY2hQYXJ0KGdldEFjdGl2ZVdvcmtiZW5jaFBhcnQoKSk7Ci0gICAgICAgIGJvb2xlYW4gdklzRW5hYmxlZCA9IHZUYWJsZU1hbmFnZXIuY2FuQ3JlYXRlUm93RWxlbWVudChnZXRFbGVtZW50VHlwZVRvQ3JlYXRlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIHNldEJhc2VFbmFibGVkKHZJc0VuYWJsZWQpOwotICAgIH0KKwkvKioKKwkgKiBWZXJpZnkgaWYgdGhpcyBoYW5kbGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgYW5kIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLiBBZGRpdGlvbmFsbHksIHZlcmlmeSBpZiB0aGlzIHRhYmxlIGNhbgorCSAqIGFkZCB0aGlzIHR5cGUgb2YgZWxlbWVudC4KKwkgKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy51bWwuc2VydmljZS50eXBlcy5oYW5kbGVycy5BYnN0cmFjdENyZWF0ZUNvbW1hbmRIYW5kbGVyI3NldEVuYWJsZWQoamF2YS5sYW5nLk9iamVjdCkKKwkgKgorCSAqIEBwYXJhbSBwRXZhbHVhdGlvbkNvbnRleHQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGZpbmFsIE9iamVjdCBwRXZhbHVhdGlvbkNvbnRleHQpIHsKKwkJSU5hdHRhYmxlTW9kZWxNYW5hZ2VyIHZUYWJsZU1hbmFnZXIgPQorCQkJSU5hdHRhYmxlTW9kZWxNYW5hZ2VyVXRpbHMuZ2V0VGFibGVNYW5hZ2VyRnJvbVdvcmtiZW5jaFBhcnQoZ2V0QWN0aXZlV29ya2JlbmNoUGFydCgpKTsKKwkJYm9vbGVhbiB2SXNFbmFibGVkID0gdlRhYmxlTWFuYWdlci5jYW5DcmVhdGVSb3dFbGVtZW50KGdldEVsZW1lbnRUeXBlVG9DcmVhdGUoKS5nZXRJZCgpKTsKKwkJc2V0QmFzZUVuYWJsZWQodklzRW5hYmxlZCk7CisJfQogfQogCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNGYWlsdXJlTW9kZUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZhaWx1cmVNb2RlSGFuZGxlci5qYXZhCmluZGV4IDczYjU4ZmYuLjJmYzMyOGUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZhaWx1cmVNb2RlSGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZhaWx1cmVNb2RlSGFuZGxlci5qYXZhCkBAIC0yOSwzMyArMjksMzMgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZVNGYWlsdXJlTW9kZUhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlU0ZhaWx1cmVNb2RlSGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ3JlYXRlU0ZhaWx1cmVNb2RlSGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNCbG9ja0ZNRUEpIGFuZCBjYWxsIHRoZSBjb21tYW5kIGZvciBjcmVhdGluZyBhIFNGYWlsdXJlTW9kZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU0Jsb2NrRk1FQSkgYW5kIGNhbGwgdGhlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGEgU0ZhaWx1cmVNb2RlLgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgQ2xhc3MgdlNlbGVjdGVkQ2xhc3MgPQotICAgICAgICAgICAgKENsYXNzKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzXygpKTsKKwkJZmluYWwgQ2xhc3MgdlNlbGVjdGVkQ2xhc3MgPQorCQkJKENsYXNzKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzXygpKTsKIAotICAgICAgICBpZiAoKHZTZWxlY3RlZENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAmJiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkQ2xhc3MsIElTQmxvY2tGTUVBLmNsYXNzKSAhPSBudWxsKSkgeworCQlpZiAoKHZTZWxlY3RlZENsYXNzICE9IG51bGwpCisJCQkmJiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkQ2xhc3MsIElTQmxvY2tGTUVBLmNsYXNzKSAhPSBudWxsKSkgewogCi0gICAgICAgICAgICAvLyBjcmVhdGUgYW4gU0ZhaWx1cmVNb2RlRk1FQSBpbnNpZGUgdGhlIHNlbGVjdGVkIFNCbG9ja0ZNRUEKLSAgICAgICAgICAgIEVTRkZNRUFVdGlsLmNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEodlNlbGVjdGVkQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJCS8vIGNyZWF0ZSBhbiBTRmFpbHVyZU1vZGVGTUVBIGluc2lkZSB0aGUgc2VsZWN0ZWQgU0Jsb2NrRk1FQQorCQkJRVNGRk1FQVV0aWwuY3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSh2U2VsZWN0ZWRDbGFzcyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQogfQogCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1N0YXJ0TmV3Rk1FQUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvU3RhcnROZXdGTUVBSGFuZGxlci5qYXZhCmluZGV4IDQ5MTVhZmUuLjc3MjZmYzkgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvU3RhcnROZXdGTUVBSGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvU3RhcnROZXdGTUVBSGFuZGxlci5qYXZhCkBAIC0yOSwyOSArMjksMjkgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFN0YXJ0TmV3Rk1FQUhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RhcnROZXdGTUVBSGFuZGxlcigpIHsgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFN0YXJ0TmV3Rk1FQUhhbmRsZXIoKSB7IH0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBhbmQgc2V0dXAgYSBuZXcgTG9jYWwgQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IHBFdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTZWxlY3Rpb24gdlNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb24ocEV2ZW50KTsKKwkvKioKKwkgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgYW5kIHNldHVwIGEgbmV3IExvY2FsIEFuYWx5c2lzLgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgQ2xhc3MgdlNlbGVjdGVkQ2xhc3MgPQotICAgICAgICAgICAgKENsYXNzKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzXygpKTsKKwkJZmluYWwgQ2xhc3MgdlNlbGVjdGVkQ2xhc3MgPQorCQkJKENsYXNzKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzXygpKTsKIAotICAgICAgICBpZiAoKHZTZWxlY3RlZENsYXNzICE9IG51bGwpICYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRDbGFzcywgU0Jsb2NrLmNsYXNzKSAhPSBudWxsKSkgewotICAgICAgICAgICAgTmV3Rk1FQVNldHVwLnNldHVwKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBTQmxvY2suY2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJCWlmICgodlNlbGVjdGVkQ2xhc3MgIT0gbnVsbCkgJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBTQmxvY2suY2xhc3MpICE9IG51bGwpKSB7CisJCQlOZXdGTUVBU2V0dXAuc2V0dXAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkQ2xhc3MsIFNCbG9jay5jbGFzcykpOworCQl9CisJCXJldHVybiBudWxsOworCX0KIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi9hYm91dC5odG1sIGIvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24vYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL0VTRkZNRUFFeGVjdXRpb25BY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL0VTRkZNRUFFeGVjdXRpb25BY3RpdmF0b3IuamF2YQppbmRleCBkNmFhYzNhLi5lNDdiNTlmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi9FU0ZGTUVBRXhlY3V0aW9uQWN0aXZhdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5mbWVhLmV4ZWN1dGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9leGVjdXRpb24vRVNGRk1FQUV4ZWN1dGlvbkFjdGl2YXRvci5qYXZhCkBAIC0yMSw5NyArMjEsOTcgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIEVTRkZNRUFFeGVjdXRpb25BY3RpdmF0b3IKLSAgICBleHRlbmRzIEVNRlBsdWdpbiB7CisJZXh0ZW5kcyBFTUZQbHVnaW4gewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQUV4ZWN1dGlvbkFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZGTUVBRXhlY3V0aW9uQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQUV4ZWN1dGlvbkFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZGTUVBRXhlY3V0aW9uQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZGTUVBRXhlY3V0aW9uQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZGTUVBRXhlY3V0aW9uQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIHNQbHVnaW4uZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIHNQbHVnaW4uZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLklORk8sIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYW4gSW5mbyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBJbmZvIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmZtZWEuZXhlY3V0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2V4ZWN1dGlvbi9zZXR1cC9OZXdGTUVBU2V0dXAuamF2YSBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3NldHVwL05ld0ZNRUFTZXR1cC5qYXZhCmluZGV4IDUxZTM1MTkuLjgwZWRiZGUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3NldHVwL05ld0ZNRUFTZXR1cC5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvZXhlY3V0aW9uL3NldHVwL05ld0ZNRUFTZXR1cC5qYXZhCkBAIC0yOSw0MyArMjksNDMgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5ld0ZNRUFTZXR1cCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgTmV3Rk1FQVNldHVwKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgTmV3Rk1FQVNldHVwKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIFNldHVwIG9mIGEgbmV3IEZNRUEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHRvIGJlIGFuYWx5c2VkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKGZpbmFsIElTQmxvY2sgcFNCbG9jaykgeworCS8qKgorCSAqIFNldHVwIG9mIGEgbmV3IEZNRUEuCisJICoKKwkgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHRvIGJlIGFuYWx5c2VkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKGZpbmFsIElTQmxvY2sgcFNCbG9jaykgewogCi0gICAgICAgIE1vZGVsIHZFU0ZNb2RlbCA9IE1vZGVsVXRpbC5nZXRXb3JraW5nTW9kZWwoKTsKLSAgICAgICAgaWYgKHZFU0ZNb2RlbCAhPSBudWxsKSB7CisJCU1vZGVsIHZFU0ZNb2RlbCA9IE1vZGVsVXRpbC5nZXRXb3JraW5nTW9kZWwoKTsKKwkJaWYgKHZFU0ZNb2RlbCAhPSBudWxsKSB7CiAKLSAgICAgICAgICAgIC8vIFJldHJpZXZlICdTYWZldHlBcnRpZmFjdHMnIHBhY2thZ2UKLSAgICAgICAgICAgIElTU2FmZXR5QXJ0aWZhY3RzIHZTYWZldHlBcnRpZmFjdHMgPSBFU0ZTYWZldHlDb25jZXB0c1V0aWwuZ2V0U1NhZmV0eUFydGlmYWN0cyh2RVNGTW9kZWwpOworCQkJLy8gUmV0cmlldmUgJ1NhZmV0eUFydGlmYWN0cycgcGFja2FnZQorCQkJSVNTYWZldHlBcnRpZmFjdHMgdlNhZmV0eUFydGlmYWN0cyA9IEVTRlNhZmV0eUNvbmNlcHRzVXRpbC5nZXRTU2FmZXR5QXJ0aWZhY3RzKHZFU0ZNb2RlbCk7CiAKLSAgICAgICAgICAgIElTRk1FQSB2U0ZNRUEgPSBudWxsOwotICAgICAgICAgICAgaWYgKHZTYWZldHlBcnRpZmFjdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlICdGTUVBJyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgdlNGTUVBID0gRVNGRk1FQVV0aWwuZ2V0U0ZNRUEodlNhZmV0eUFydGlmYWN0cy5nZXRCYXNlX1BhY2thZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodlNGTUVBICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoRVNGRk1FQVV0aWwuZ2V0U0Jsb2NrRk1FQUJ5U0Jsb2NrKHZTRk1FQSwgcFNCbG9jaykgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgU0Jsb2NrRk1FQSBpbiAnU0ZNRUEnCi0gICAgICAgICAgICAgICAgICAgIEVTRkZNRUFVdGlsLmNyZWF0ZVNCbG9ja0ZNRUEodlNGTUVBLmdldEJhc2VfUGFja2FnZSgpLCBwU0Jsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgSVNCbG9ja0ZNRUEgdlNCbG9ja0ZNRUEgPSBFU0ZGTUVBVXRpbC5nZXRTQmxvY2tGTUVBQnlTQmxvY2sodlNGTUVBLCBwU0Jsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZTQmxvY2tGTUVBICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVTRlRhYmxlc1V0aWwuY3JlYXRlVGFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNGRk1FQVRhYmxlc1NldC5GTUVBX1RBQkxFX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRkZNRUFUYWJsZXNTZXQuRk1FQV9UQUJMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZTQmxvY2tGTUVBLmdldEJhc2VfQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCQlJU0ZNRUEgdlNGTUVBID0gbnVsbDsKKwkJCWlmICh2U2FmZXR5QXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCQkvLyBSZXRyaWV2ZSAnRk1FQScgcGFja2FnZQorCQkJCXZTRk1FQSA9IEVTRkZNRUFVdGlsLmdldFNGTUVBKHZTYWZldHlBcnRpZmFjdHMuZ2V0QmFzZV9QYWNrYWdlKCkpOworCQkJfQorCQkJaWYgKHZTRk1FQSAhPSBudWxsKSB7CisJCQkJaWYgKEVTRkZNRUFVdGlsLmdldFNCbG9ja0ZNRUFCeVNCbG9jayh2U0ZNRUEsIHBTQmxvY2spID09IG51bGwpIHsKKwkJCQkJLy8gQ3JlYXRlIFNCbG9ja0ZNRUEgaW4gJ1NGTUVBJworCQkJCQlFU0ZGTUVBVXRpbC5jcmVhdGVTQmxvY2tGTUVBKHZTRk1FQS5nZXRCYXNlX1BhY2thZ2UoKSwgcFNCbG9jayk7CisJCQkJCUlTQmxvY2tGTUVBIHZTQmxvY2tGTUVBID0gRVNGRk1FQVV0aWwuZ2V0U0Jsb2NrRk1FQUJ5U0Jsb2NrKHZTRk1FQSwgcFNCbG9jayk7CisJCQkJCWlmICh2U0Jsb2NrRk1FQSAhPSBudWxsKSB7CisJCQkJCQlFU0ZUYWJsZXNVdGlsLmNyZWF0ZVRhYmxlKAorCQkJCQkJCUVTRkZNRUFUYWJsZXNTZXQuRk1FQV9UQUJMRV9JRCwKKwkJCQkJCQlFU0ZGTUVBVGFibGVzU2V0LkZNRUFfVEFCTEVfTkFNRSwKKwkJCQkJCQl2U0Jsb2NrRk1FQS5nZXRCYXNlX0NsYXNzKCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLm1ldGFtb2RlbC9hYm91dC5odG1sIGIvYW5hbHlzaXMvZm1lYS9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLm1ldGFtb2RlbC9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5tZXRhbW9kZWwvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9mbWVhL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLmZtZWEubWV0YW1vZGVsL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5tZXRhbW9kZWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvbWV0YW1vZGVsL0VTRkZNRUFNZXRhbW9kZWxBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2ZtZWEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5tZXRhbW9kZWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvbWV0YW1vZGVsL0VTRkZNRUFNZXRhbW9kZWxBY3RpdmF0b3IuamF2YQppbmRleCBhZjUwZjIxLi5hODA2NWFkIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLmZtZWEubWV0YW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL21ldGFtb2RlbC9FU0ZGTUVBTWV0YW1vZGVsQWN0aXZhdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLm1ldGFtb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9tZXRhbW9kZWwvRVNGRk1FQU1ldGFtb2RlbEFjdGl2YXRvci5qYXZhCkBAIC0yMSw1MiArMjEsNTIgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY5ICQKICAqLwogcHVibGljIGNsYXNzIEVTRkZNRUFNZXRhbW9kZWxBY3RpdmF0b3IKLSAgICBleHRlbmRzIEVNRlBsdWdpbiB7CisJZXh0ZW5kcyBFTUZQbHVnaW4gewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQU1ldGFtb2RlbEFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZGTUVBTWV0YW1vZGVsQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQU1ldGFtb2RlbEFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZGTUVBTWV0YW1vZGVsQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZGTUVBTWV0YW1vZGVsQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZGTUVBTWV0YW1vZGVsQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnNlcnZpY2UudHlwZXMvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnNlcnZpY2UudHlwZXMvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUuc2VydmljZS50eXBlcy9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3NlcnZpY2UvdHlwZXMvRVNGRk1FQVNlcnZpY2VUeXBlc0FjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL0VTRkZNRUFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IuamF2YQppbmRleCBkYWY4MjJhLi45ZTM4N2I2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3NlcnZpY2UvdHlwZXMvRVNGRk1FQVNlcnZpY2VUeXBlc0FjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvc2VydmljZS90eXBlcy9FU0ZGTUVBU2VydmljZVR5cGVzQWN0aXZhdG9yLmphdmEKQEAgLTIzLDg0ICsyMyw4NCBAQAogICovCiBwdWJsaWMgY2xhc3MgRVNGRk1FQVNlcnZpY2VUeXBlc0FjdGl2YXRvciBleHRlbmRzIEVNRlBsdWdpbiBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZGTUVBU2VydmljZVR5cGVzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZGTUVBU2VydmljZVR5cGVzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZGTUVBU2VydmljZVR5cGVzQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZGTUVBU2VydmljZVR5cGVzQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBCdW5kbGV4Q29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OwogCi0gICAgfQorCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3NlcnZpY2UvdHlwZXMvc2V0L0VTRkZNRUFUeXBlc1NldC5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL3NldC9FU0ZGTUVBVHlwZXNTZXQuamF2YQppbmRleCA4ZGEwMWNmLi5mZWI4MTRmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3NlcnZpY2UvdHlwZXMvc2V0L0VTRkZNRUFUeXBlc1NldC5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvc2VydmljZS90eXBlcy9zZXQvRVNGRk1FQVR5cGVzU2V0LmphdmEKQEAgLTE4LDE4ICsxOCwxOCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGRk1FQVR5cGVzU2V0IHsKIAotICAgIC8qKiBTcGVjaWFsaXplZCBUeXBlcyBJRCBvZiBTQmxvY2tGTUVBLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCTE9DS0ZNRUFfVFlQRV9JRCA9Ci0gICAgICAgICJvcmcucG9sYXJzeXMuZXNmLkVTRkZNRUEuU0Jsb2NrRk1FQSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogU3BlY2lhbGl6ZWQgVHlwZXMgSUQgb2YgU0Jsb2NrRk1FQS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQkxPQ0tGTUVBX1RZUEVfSUQgPQorCQkib3JnLnBvbGFyc3lzLmVzZi5FU0ZGTUVBLlNCbG9ja0ZNRUEiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogU3BlY2lhbGl6ZWQgVHlwZXMgSUQgb2YgU0ZhaWx1cmVNb2RlRk1FQS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRkFJTFVSRU1PREVGTUVBX1RZUEVfSUQgPQotICAgICAgICAib3JnLnBvbGFyc3lzLmVzZi5FU0ZGTUVBLlNGYWlsdXJlTW9kZUZNRUEiOyAvLyROT04tTkxTLTEkCisJLyoqIFNwZWNpYWxpemVkIFR5cGVzIElEIG9mIFNGYWlsdXJlTW9kZUZNRUEuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0ZBSUxVUkVNT0RFRk1FQV9UWVBFX0lEID0KKwkJIm9yZy5wb2xhcnN5cy5lc2YuRVNGRk1FQS5TRmFpbHVyZU1vZGVGTUVBIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVTRkZNRUFUeXBlc1NldCgpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgRVNGRk1FQVR5cGVzU2V0KCkgeworCQkvLyBOb3RoaW5nIHRvIGRvCisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnRvb2xzL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUudG9vbHMvYWJvdXQuaHRtbAppbmRleCBkMzVkNWFlLi43NzhlMWJhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUudG9vbHMvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUudG9vbHMvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvdG9vbHMvRVNGRk1FQVByb2ZpbGVUb29sc0FjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvdG9vbHMvRVNGRk1FQVByb2ZpbGVUb29sc0FjdGl2YXRvci5qYXZhCmluZGV4IDI4ZDg2YmMuLjE3NmU3OTMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS50b29scy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3Rvb2xzL0VTRkZNRUFQcm9maWxlVG9vbHNBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS90b29scy9FU0ZGTUVBUHJvZmlsZVRvb2xzQWN0aXZhdG9yLmphdmEKQEAgLTIzLDg0ICsyMyw4NCBAQAogICovCiBwdWJsaWMgY2xhc3MgRVNGRk1FQVByb2ZpbGVUb29sc0FjdGl2YXRvciBleHRlbmRzIEVNRlBsdWdpbiBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZGTUVBUHJvZmlsZVRvb2xzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFQcm9maWxlVG9vbHNBY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZGTUVBUHJvZmlsZVRvb2xzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFQcm9maWxlVG9vbHNBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZGTUVBUHJvZmlsZVRvb2xzQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZGTUVBUHJvZmlsZVRvb2xzQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBCdW5kbGV4Q29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OwogCi0gICAgfQorCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS90b29scy91dGlsL0VTRkZNRUFVdGlsLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS90b29scy91dGlsL0VTRkZNRUFVdGlsLmphdmEKaW5kZXggOTEyZjgzMy4uNTk1MmM0OSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvdG9vbHMvdXRpbC9FU0ZGTUVBVXRpbC5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS50b29scy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3Rvb2xzL3V0aWwvRVNGRk1FQVV0aWwuamF2YQpAQCAtMzksMjExICszOSwyMTEgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEVTRkZNRUFVdGlsIHsKIAotICAgIC8qKiBGTUVBIHBhY2thZ2UgbmFtZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1FQV9QQUNLQUdFX05BTUUgPSAiRk1FQSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogRk1FQSBwYWNrYWdlIG5hbWUuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZNRUFfUEFDS0FHRV9OQU1FID0gIkZNRUEiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQXBwbHkgRVNGRk1FQSBwcm9maWxlIGxhYmVsLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMWV9FU0ZGTUVBX1BST0ZJTEVfTEFCRUwgPSAiQXBwbHkgRVNGRk1FQSBwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBBcHBseSBFU0ZGTUVBIHByb2ZpbGUgbGFiZWwuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX0VTRkZNRUFfUFJPRklMRV9MQUJFTCA9ICJBcHBseSBFU0ZGTUVBIHByb2ZpbGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQ3JlYXRlIEZNRUEgcGFja2FnZSBsYWJlbC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZNRUFfUEFDS0FHRV9MQUJFTCA9ICJDcmVhdGUgRk1FQSBwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgRk1FQSBwYWNrYWdlIGxhYmVsLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRk1FQV9QQUNLQUdFX0xBQkVMID0gIkNyZWF0ZSBGTUVBIHBhY2thZ2UiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQ3JlYXRlIFNCbG9ja19GTUVBIGxhYmVsLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU0JMT0NLX0ZNRUFfTEFCRUwgPSAiQ3JlYXRlIFNCbG9ja19GTUVBIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgU0Jsb2NrX0ZNRUEgbGFiZWwuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TQkxPQ0tfRk1FQV9MQUJFTCA9ICJDcmVhdGUgU0Jsb2NrX0ZNRUEiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQ3JlYXRlIFNGYWlsdXJlTW9kZV9GTUVBIGxhYmVsLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU0ZBSUxVUkVNT0RFX0ZNRUFfTEFCRUwgPSAiQ3JlYXRlIFNGYWlsdXJlTW9kZV9GTUVBIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgU0ZhaWx1cmVNb2RlX0ZNRUEgbGFiZWwuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TRkFJTFVSRU1PREVfRk1FQV9MQUJFTCA9ICJDcmVhdGUgU0ZhaWx1cmVNb2RlX0ZNRUEiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGRk1FQVV0aWwoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHJpdmF0ZSBFU0ZGTUVBVXRpbCgpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgU0ZNRUEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNhZmV0eUFydGlmYWN0cyBUaGUgU2FmZXR5QXJ0aWZhY3RzIHBhY2thZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU0ZNRUEoZmluYWwgUGFja2FnZSBwU2FmZXR5QXJ0aWZhY3RzKSB7Ci0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFNhZmV0eUFydGlmYWN0cyk7CisJLyoqCisJICogQ3JlYXRlIFNGTUVBLgorCSAqCisJICogQHBhcmFtIHBTYWZldHlBcnRpZmFjdHMgVGhlIFNhZmV0eUFydGlmYWN0cyBwYWNrYWdlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNGTUVBKGZpbmFsIFBhY2thZ2UgcFNhZmV0eUFydGlmYWN0cykgeworCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBTYWZldHlBcnRpZmFjdHMpOwogCi0gICAgICAgIFJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZUZNRUFQYWNrYWdlID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX0ZNRUFfUEFDS0FHRV9MQUJFTCkgeworCQlSZWNvcmRpbmdDb21tYW5kIHZDcmVhdGVGTUVBUGFja2FnZSA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9GTUVBX1BBQ0tBR0VfTEFCRUwpIHsKIAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBvYmplY3QgJ0ZNRUEnIHBhY2thZ2UKLSAgICAgICAgICAgICAgICBQYWNrYWdlIHZGTUVBID0gcFNhZmV0eUFydGlmYWN0cy5jcmVhdGVOZXN0ZWRQYWNrYWdlKEZNRUFfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIEVTRkZNRUEgcHJvZmlsZQotICAgICAgICAgICAgICAgIGlmICh2Rk1FQS5nZXRBcHBsaWVkUHJvZmlsZShFU0ZGTUVBUGFja2FnZS5lTlNfUFJFRklYKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRkZNRUFVdGlsLmFwcGx5RVNGRk1FQVByb2ZpbGUodkZNRUEpOwotICAgICAgICAgICAgICAgIH0KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCS8vIENyZWF0ZSB0aGUgb2JqZWN0ICdGTUVBJyBwYWNrYWdlCisJCQkJUGFja2FnZSB2Rk1FQSA9IHBTYWZldHlBcnRpZmFjdHMuY3JlYXRlTmVzdGVkUGFja2FnZShGTUVBX1BBQ0tBR0VfTkFNRSk7CisJCQkJCisJCQkJLy8gVmVyaWZ5IGFuZCBhcHBseSAoaWYgbmVjZXNzYXJ5KSBFU0ZGTUVBIHByb2ZpbGUKKwkJCQlpZiAodkZNRUEuZ2V0QXBwbGllZFByb2ZpbGUoRVNGRk1FQVBhY2thZ2UuZU5TX1BSRUZJWCkgPT0gbnVsbCkgeworCQkJCQlFU0ZGTUVBVXRpbC5hcHBseUVTRkZNRUFQcm9maWxlKHZGTUVBKTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICAvLyBBcHBseSAnU0ZNRUEnIHN0ZXJlb3R5cGUgb24gJ0ZNRUEnIHBhY2thZ2UKLSAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2Rk1FQSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGx5U3RlcmVvdHlwZSh2Rk1FQSwgRVNGRk1FQVBhY2thZ2UuZUlOU1RBTkNFLmdldFNGTUVBKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OworCQkJCS8vIEFwcGx5ICdTRk1FQScgc3RlcmVvdHlwZSBvbiAnRk1FQScgcGFja2FnZQorCQkJCVVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKHZGTUVBKQorCQkJCQkuYXBwbHlTdGVyZW90eXBlKHZGTUVBLCBFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZNRUEoKSk7CisJCQl9CisJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2Q3JlYXRlRk1FQVBhY2thZ2UuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlRk1FQVBhY2thZ2UpOwotICAgICAgICB9Ci0gICAgfQorCQkvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKKwkJaWYgKHZDcmVhdGVGTUVBUGFja2FnZS5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVGTUVBUGFja2FnZSk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgU0ZNRUEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNhZmV0eUFydGlmYWN0cyBUaGUgU2FmZXR5QXJ0aWZhY3RzIHBhY2thZ2UKLSAgICAgKiBAcmV0dXJuIFRoZSBTRk1FQQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVNGTUVBIGdldFNGTUVBKGZpbmFsIFBhY2thZ2UgcFNhZmV0eUFydGlmYWN0cykgewotICAgICAgICBJU0ZNRUEgdlNGTUVBID0gcmV0cmlldmVTRk1FQShwU2FmZXR5QXJ0aWZhY3RzKTsKLSAgICAgICAgaWYgKHZTRk1FQSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVhdGVTRk1FQShwU2FmZXR5QXJ0aWZhY3RzKTsKLSAgICAgICAgICAgIHZTRk1FQSA9IHJldHJpZXZlU0ZNRUEocFNhZmV0eUFydGlmYWN0cyk7Ci0gICAgICAgIH0KKwkvKioKKwkgKiBHZXQgU0ZNRUEuCisJICoKKwkgKiBAcGFyYW0gcFNhZmV0eUFydGlmYWN0cyBUaGUgU2FmZXR5QXJ0aWZhY3RzIHBhY2thZ2UKKwkgKiBAcmV0dXJuIFRoZSBTRk1FQQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVNGTUVBIGdldFNGTUVBKGZpbmFsIFBhY2thZ2UgcFNhZmV0eUFydGlmYWN0cykgeworCQlJU0ZNRUEgdlNGTUVBID0gcmV0cmlldmVTRk1FQShwU2FmZXR5QXJ0aWZhY3RzKTsKKwkJaWYgKHZTRk1FQSA9PSBudWxsKSB7CisJCQljcmVhdGVTRk1FQShwU2FmZXR5QXJ0aWZhY3RzKTsKKwkJCXZTRk1FQSA9IHJldHJpZXZlU0ZNRUEocFNhZmV0eUFydGlmYWN0cyk7CisJCX0KIAotICAgICAgICByZXR1cm4gdlNGTUVBOwotICAgIH0KKwkJcmV0dXJuIHZTRk1FQTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBTRk1FQS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwU2FmZXR5QXJ0aWZhY3RzIFRoZSBTYWZldHlBcnRpZmFjdHMgcGFja2FnZQotICAgICAqIEByZXR1cm4gVGhlIFNGTUVBCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVNGTUVBIHJldHJpZXZlU0ZNRUEoZmluYWwgUGFja2FnZSBwU2FmZXR5QXJ0aWZhY3RzKSB7Ci0gICAgICAgIElTRk1FQSB2U0ZNRUEgPSBudWxsOwotICAgICAgICBCb29sZWFuIHZGb3VuZCA9IGZhbHNlOwotICAgICAgICBMaXN0PFBhY2thZ2U+IHZQYWNrYWdlc0xpc3QgPSBwU2FmZXR5QXJ0aWZhY3RzLmdldE5lc3RlZFBhY2thZ2VzKCk7Ci0gICAgICAgIEl0ZXJhdG9yPFBhY2thZ2U+IHZJdGVyYXRvciA9IHZQYWNrYWdlc0xpc3QuaXRlcmF0b3IoKTsKKwkvKioKKwkgKiBSZXRyaWV2ZSBTRk1FQS4KKwkgKgorCSAqIEBwYXJhbSBwU2FmZXR5QXJ0aWZhY3RzIFRoZSBTYWZldHlBcnRpZmFjdHMgcGFja2FnZQorCSAqIEByZXR1cm4gVGhlIFNGTUVBCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSVNGTUVBIHJldHJpZXZlU0ZNRUEoZmluYWwgUGFja2FnZSBwU2FmZXR5QXJ0aWZhY3RzKSB7CisJCUlTRk1FQSB2U0ZNRUEgPSBudWxsOworCQlCb29sZWFuIHZGb3VuZCA9IGZhbHNlOworCQlMaXN0PFBhY2thZ2U+IHZQYWNrYWdlc0xpc3QgPSBwU2FmZXR5QXJ0aWZhY3RzLmdldE5lc3RlZFBhY2thZ2VzKCk7CisJCUl0ZXJhdG9yPFBhY2thZ2U+IHZJdGVyYXRvciA9IHZQYWNrYWdlc0xpc3QuaXRlcmF0b3IoKTsKIAotICAgICAgICB3aGlsZSAodkl0ZXJhdG9yLmhhc05leHQoKSAmJiAhdkZvdW5kKSB7Ci0gICAgICAgICAgICBQYWNrYWdlIHZQYWNrYWdlID0gdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZQYWNrYWdlLCBJU0ZNRUEuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdlNGTUVBID0gKElTRk1FQSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQl3aGlsZSAodkl0ZXJhdG9yLmhhc05leHQoKSAmJiAhdkZvdW5kKSB7CisJCQlQYWNrYWdlIHZQYWNrYWdlID0gdkl0ZXJhdG9yLm5leHQoKTsKKwkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZQYWNrYWdlLCBJU0ZNRUEuY2xhc3MpOworCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCXZGb3VuZCA9IHRydWU7CisJCQkJdlNGTUVBID0gKElTRk1FQSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiB2U0ZNRUE7Ci0gICAgfQorCQlyZXR1cm4gdlNGTUVBOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBTQmxvY2tGTUVBLgotICAgICAqCi0gICAgICogQHBhcmFtIHBTRk1FQVBhY2thZ2UgVGhlIEZNRUEgcGFja2FnZQotICAgICAqIEBwYXJhbSBwU0Jsb2NrIFRoZSBTQmxvY2sgdG8gYmUgYW5hbHl6ZWQgdXNpbmcgZm1lYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTQmxvY2tGTUVBKGZpbmFsIFBhY2thZ2UgcFNGTUVBUGFja2FnZSwgZmluYWwgSVNCbG9jayBwU0Jsb2NrKSB7Ci0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFNGTUVBUGFja2FnZSk7CisJLyoqCisJICogQ3JlYXRlIFNCbG9ja0ZNRUEuCisJICoKKwkgKiBAcGFyYW0gcFNGTUVBUGFja2FnZSBUaGUgRk1FQSBwYWNrYWdlCisJICogQHBhcmFtIHBTQmxvY2sgVGhlIFNCbG9jayB0byBiZSBhbmFseXplZCB1c2luZyBmbWVhCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNCbG9ja0ZNRUEoZmluYWwgUGFja2FnZSBwU0ZNRUFQYWNrYWdlLCBmaW5hbCBJU0Jsb2NrIHBTQmxvY2spIHsKKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwU0ZNRUFQYWNrYWdlKTsKIAotICAgICAgICBSZWNvcmRpbmdDb21tYW5kIHZDcmVhdGVTQmxvY2tGTUVBID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NCTE9DS19GTUVBX0xBQkVMKSB7CisJCVJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZVNCbG9ja0ZNRUEgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBDUkVBVEVfU0JMT0NLX0ZNRUFfTEFCRUwpIHsKIAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBvYmplY3QgJ0NsYXNzJyBvZiBTQmxvY2sgZm9yIEZNRUEKLSAgICAgICAgICAgICAgICBDbGFzcyB2U0Jsb2NrRk1FQUNsYXNzID0gcFNGTUVBUGFja2FnZS5jcmVhdGVPd25lZENsYXNzKHBTQmxvY2suZ2V0TmFtZSgpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyBBcHBseSAnU0Jsb2NrRk1FQScgc3RlcmVvdHlwZSBvbiAnU0Jsb2NrRk1FQScKLSAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U0Jsb2NrRk1FQUNsYXNzKQotICAgICAgICAgICAgICAgICAgICAuYXBwbHlTdGVyZW90eXBlKHZTQmxvY2tGTUVBQ2xhc3MsIEVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTQmxvY2tGTUVBKCkpOworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBvYmplY3QgJ0NsYXNzJyBvZiBTQmxvY2sgZm9yIEZNRUEKKwkJCQlDbGFzcyB2U0Jsb2NrRk1FQUNsYXNzID0gcFNGTUVBUGFja2FnZS5jcmVhdGVPd25lZENsYXNzKHBTQmxvY2suZ2V0TmFtZSgpLCB0cnVlKTsKKwkJCQkvLyBBcHBseSAnU0Jsb2NrRk1FQScgc3RlcmVvdHlwZSBvbiAnU0Jsb2NrRk1FQScKKwkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U0Jsb2NrRk1FQUNsYXNzKQorCQkJCQkuYXBwbHlTdGVyZW90eXBlKHZTQmxvY2tGTUVBQ2xhc3MsIEVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTQmxvY2tGTUVBKCkpOwogCi0gICAgICAgICAgICAgICAgLy8gTGluayAnU0Jsb2NrRk1FQScgc3RlcmVvdHlwZSB0byAnU0Jsb2NrJyBzdGVyZW90eXBlCi0gICAgICAgICAgICAgICAgSVNCbG9ja0ZNRUEgdlNCbG9ja0ZNRUEgPQotICAgICAgICAgICAgICAgICAgICAoSVNCbG9ja0ZNRUEpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTQmxvY2tGTUVBQ2xhc3MsIFNCbG9ja0ZNRUEuY2xhc3MpOwotICAgICAgICAgICAgICAgIHZTQmxvY2tGTUVBLnNldFNCbG9jayhwU0Jsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKwkJCQkvLyBMaW5rICdTQmxvY2tGTUVBJyBzdGVyZW90eXBlIHRvICdTQmxvY2snIHN0ZXJlb3R5cGUKKwkJCQlJU0Jsb2NrRk1FQSB2U0Jsb2NrRk1FQSA9CisJCQkJCShJU0Jsb2NrRk1FQSkgVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNCbG9ja0ZNRUFDbGFzcywgU0Jsb2NrRk1FQS5jbGFzcyk7CisJCQkJdlNCbG9ja0ZNRUEuc2V0U0Jsb2NrKHBTQmxvY2spOworCQkJfQorCQl9OwogCi0gICAgICAgIC8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAotICAgICAgICBpZiAodkNyZWF0ZVNCbG9ja0ZNRUEuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0Jsb2NrRk1FQSk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkNyZWF0ZVNCbG9ja0ZNRUEuY2FuRXhlY3V0ZSgpKSB7CisJCQkvLyBFeGVjdXRlIGNvbW1hbmQKKwkJCXZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0Jsb2NrRk1FQSk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgU0ZhaWx1cmVNb2RlRk1FQS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwU0Jsb2NrRk1FQSBUaGUgU0Jsb2NrRk1FQSB0byBiZSBhbmFseXplZCB1c2luZyBmbWVhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEoZmluYWwgQ2xhc3MgcFNCbG9ja0ZNRUEpIHsKLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwU0Jsb2NrRk1FQS5nZXRQYWNrYWdlKCkpOwotICAgICAgICBSZWNvcmRpbmdDb21tYW5kIHZDcmVhdGVTRmFpbHVyZU1vZGVGTUVBID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NGQUlMVVJFTU9ERV9GTUVBX0xBQkVMKSB7CisJLyoqCisJICogQ3JlYXRlIFNGYWlsdXJlTW9kZUZNRUEuCisJICoKKwkgKiBAcGFyYW0gcFNCbG9ja0ZNRUEgVGhlIFNCbG9ja0ZNRUEgdG8gYmUgYW5hbHl6ZWQgdXNpbmcgZm1lYQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTRmFpbHVyZU1vZGVGTUVBKGZpbmFsIENsYXNzIHBTQmxvY2tGTUVBKSB7CisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFNCbG9ja0ZNRUEuZ2V0UGFja2FnZSgpKTsKKwkJUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9TRkFJTFVSRU1PREVfRk1FQV9MQUJFTCkgewogCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBuYW1lIGZvciB0aGUgbmV3IHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZOYW1lID0gU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyBwU0Jsb2NrRk1FQS5nZXRPd25lZEVsZW1lbnRzKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgb2JqZWN0ICdQcm9wZXJ0eScgb2YgU0Jsb2NrIGZvciBGTUVBCi0gICAgICAgICAgICAgICAgUHJvcGVydHkgdlNGYWlsdXJlTW9kZUZNRUFQcm9wZXJ0eSA9IHBTQmxvY2tGTUVBLmNyZWF0ZU93bmVkQXR0cmlidXRlKHZOYW1lLCBudWxsKTsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCS8vIGNvbXB1dGUgdGhlIG5hbWUgZm9yIHRoZSBuZXcgcHJvcGVydHkKKwkJCQlTdHJpbmcgdk5hbWUgPSBTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArIHBTQmxvY2tGTUVBLmdldE93bmVkRWxlbWVudHMoKS5zaXplKCk7CisJCQkJLy8gQ3JlYXRlIHRoZSBvYmplY3QgJ1Byb3BlcnR5JyBvZiBTQmxvY2sgZm9yIEZNRUEKKwkJCQlQcm9wZXJ0eSB2U0ZhaWx1cmVNb2RlRk1FQVByb3BlcnR5ID0gcFNCbG9ja0ZNRUEuY3JlYXRlT3duZWRBdHRyaWJ1dGUodk5hbWUsIG51bGwpOwogCi0gICAgICAgICAgICAgICAgLy8gQXBwbHkgJ1NGYWlsdXJlTW9kZUZNRUEnIHN0ZXJlb3R5cGUgb24gJ3ZTRmFpbHVyZU1vZGVGTUVBUHJvcGVydHknCi0gICAgICAgICAgICAgICAgVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodlNGYWlsdXJlTW9kZUZNRUFQcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGx5U3RlcmVvdHlwZSh2U0ZhaWx1cmVNb2RlRk1FQVByb3BlcnR5LCBFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKwkJCQkvLyBBcHBseSAnU0ZhaWx1cmVNb2RlRk1FQScgc3RlcmVvdHlwZSBvbiAndlNGYWlsdXJlTW9kZUZNRUFQcm9wZXJ0eScKKwkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U0ZhaWx1cmVNb2RlRk1FQVByb3BlcnR5KQorCQkJCQkuYXBwbHlTdGVyZW90eXBlKHZTRmFpbHVyZU1vZGVGTUVBUHJvcGVydHksIEVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBKCkpOworCQkJfQorCQl9OwogCi0gICAgICAgIC8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAotICAgICAgICBpZiAodkNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEuY2FuRXhlY3V0ZSgpKSB7CisJCQkvLyBFeGVjdXRlIGNvbW1hbmQKKwkJCXZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBBcHBseSBFU0ZGTUVBIHByb2ZpbGUgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1vZGVsIFRoZSBtb2RlbCB0YXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlFU0ZGTUVBUHJvZmlsZShmaW5hbCBQYWNrYWdlIHBNb2RlbCkgewotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBNb2RlbCk7CisJLyoqCisJICogQXBwbHkgRVNGRk1FQSBwcm9maWxlIHRvIHRoZSBnaXZlbiBtb2RlbCBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIHBNb2RlbCBUaGUgbW9kZWwgdGFyZ2V0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5RVNGRk1FQVByb2ZpbGUoZmluYWwgUGFja2FnZSBwTW9kZWwpIHsKKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwTW9kZWwpOwogCi0gICAgICAgIFJlY29yZGluZ0NvbW1hbmQgdkFwcGx5Rk1FQVByb2ZpbGVDbWQgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBBUFBMWV9FU0ZGTUVBX1BST0ZJTEVfTEFCRUwpIHsKKwkJUmVjb3JkaW5nQ29tbWFuZCB2QXBwbHlGTUVBUHJvZmlsZUNtZCA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIEFQUExZX0VTRkZNRUFfUFJPRklMRV9MQUJFTCkgewogCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBFU0ZGTUVBIHByb2ZpbGUgYW5kIGFwcGx5IGl0Ci0gICAgICAgICAgICAgICAgUHJvZmlsZSB2RVNGRk1FQVByb2ZpbGUgPSAoUHJvZmlsZSkgUGFja2FnZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmxvYWRQYWNrYWdlKFVSSS5jcmVhdGVVUkkoRVNGRk1FQVNldC5QUk9GSUxFX1BBVEgpLCBwTW9kZWwuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKKwkJCQkvLyBSZXRyaWV2ZSBFU0ZGTUVBIHByb2ZpbGUgYW5kIGFwcGx5IGl0CisJCQkJUHJvZmlsZSB2RVNGRk1FQVByb2ZpbGUgPSAoUHJvZmlsZSkgUGFja2FnZVV0aWwKKwkJCQkJLmxvYWRQYWNrYWdlKFVSSS5jcmVhdGVVUkkoRVNGRk1FQVNldC5QUk9GSUxFX1BBVEgpLCBwTW9kZWwuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAodkVTRkZNRUFQcm9maWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFja2FnZVV0aWwuYXBwbHlQcm9maWxlKHBNb2RlbCwgdkVTRkZNRUFQcm9maWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07CisJCQkJaWYgKHZFU0ZGTUVBUHJvZmlsZSAhPSBudWxsKSB7CisJCQkJCVBhY2thZ2VVdGlsLmFwcGx5UHJvZmlsZShwTW9kZWwsIHZFU0ZGTUVBUHJvZmlsZSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQl9OwogCi0gICAgICAgIC8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAotICAgICAgICBpZiAodkFwcGx5Rk1FQVByb2ZpbGVDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2QXBwbHlGTUVBUHJvZmlsZUNtZCk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkFwcGx5Rk1FQVByb2ZpbGVDbWQuY2FuRXhlY3V0ZSgpKSB7CisJCQkvLyBFeGVjdXRlIGNvbW1hbmQKKwkJCXZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2QXBwbHlGTUVBUHJvZmlsZUNtZCk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEZNRUEgb2YgYSBTQmxvY2sgKFNCbG9ja0ZNRUEpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBTRk1FQSBUaGUgU0ZNRUEKLSAgICAgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHdoaWNoIGlzIGFuYWx5c2VkIGJ5IFNCbG9ja0ZNRUEKLSAgICAgKiBAcmV0dXJuIFRoZSBTQmxvY2tGTUVBCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU0Jsb2NrRk1FQSBnZXRTQmxvY2tGTUVBQnlTQmxvY2soSVNGTUVBIHBTRk1FQSwgSVNCbG9jayBwU0Jsb2NrKSB7Ci0gICAgICAgIElTQmxvY2tGTUVBIHZTQmxvY2tGTUVBID0gbnVsbDsKLSAgICAgICAgTGlzdDxJU0Jsb2NrRk1FQT4gdlNCbG9ja3NGTUVBTGlzdCA9IHBTRk1FQS5nZXRTQmxvY2tzRk1FQUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3I8SVNCbG9ja0ZNRUE+IHZJdGVyYXRvciA9IHZTQmxvY2tzRk1FQUxpc3QuaXRlcmF0b3IoKTsKKwkvKioKKwkgKiBHZXQgdGhlIEZNRUEgb2YgYSBTQmxvY2sgKFNCbG9ja0ZNRUEpLgorCSAqCisJICogQHBhcmFtIHBTRk1FQSBUaGUgU0ZNRUEKKwkgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHdoaWNoIGlzIGFuYWx5c2VkIGJ5IFNCbG9ja0ZNRUEKKwkgKiBAcmV0dXJuIFRoZSBTQmxvY2tGTUVBCisJICovCisJcHVibGljIHN0YXRpYyBJU0Jsb2NrRk1FQSBnZXRTQmxvY2tGTUVBQnlTQmxvY2soSVNGTUVBIHBTRk1FQSwgSVNCbG9jayBwU0Jsb2NrKSB7CisJCUlTQmxvY2tGTUVBIHZTQmxvY2tGTUVBID0gbnVsbDsKKwkJTGlzdDxJU0Jsb2NrRk1FQT4gdlNCbG9ja3NGTUVBTGlzdCA9IHBTRk1FQS5nZXRTQmxvY2tzRk1FQUxpc3QoKTsKKwkJSXRlcmF0b3I8SVNCbG9ja0ZNRUE+IHZJdGVyYXRvciA9IHZTQmxvY2tzRk1FQUxpc3QuaXRlcmF0b3IoKTsKIAotICAgICAgICB3aGlsZSAodlNCbG9ja0ZNRUEgPT0gbnVsbCAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB2U0Jsb2NrRk1FQSA9IHZJdGVyYXRvci5uZXh0KCk7CisJCXdoaWxlICh2U0Jsb2NrRk1FQSA9PSBudWxsICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCXZTQmxvY2tGTUVBID0gdkl0ZXJhdG9yLm5leHQoKTsKIAotICAgICAgICAgICAgaWYgKCF2U0Jsb2NrRk1FQS5nZXRTQmxvY2soKS5lcXVhbHMocFNCbG9jaykpIHsKLSAgICAgICAgICAgICAgICB2U0Jsb2NrRk1FQSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTQmxvY2tGTUVBOwotICAgIH0KKwkJCWlmICghdlNCbG9ja0ZNRUEuZ2V0U0Jsb2NrKCkuZXF1YWxzKHBTQmxvY2spKSB7CisJCQkJdlNCbG9ja0ZNRUEgPSBudWxsOworCQkJfQorCQl9CisJCXJldHVybiB2U0Jsb2NrRk1FQTsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9hYm91dC5odG1sIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvSUVTRkZNRUFGYWN0b3J5LmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lFU0ZGTUVBRmFjdG9yeS5qYXZhCmluZGV4IGQxMDIyNzEuLjk3ZjUxZjggMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvSUVTRkZNRUFGYWN0b3J5LmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JRVNGRk1FQUZhY3RvcnkuamF2YQpAQCAtMjEsNTcgKzIxLDU3IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUVTRkZNRUFGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotICAgIC8qKgotICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRkZNRUFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkVTRkZNRUFGYWN0b3J5LmluaXQoKTsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUlFU0ZGTUVBRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBRmFjdG9yeS5pbml0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNGTUVBPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRk1FQTwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNGTUVBIGNyZWF0ZVNGTUVBKCk7CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRk1FQTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZNRUE8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTRk1FQSBjcmVhdGVTRk1FQSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TQmxvY2sgRk1FQTwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0Jsb2NrIEZNRUE8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTQmxvY2tGTUVBIGNyZWF0ZVNCbG9ja0ZNRUEoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNCbG9jayBGTUVBPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TQmxvY2sgRk1FQTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNCbG9ja0ZNRUEgY3JlYXRlU0Jsb2NrRk1FQSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJQWJzdHJhY3RTRk1FQUVsZW1lbnQgY3JlYXRlQWJzdHJhY3RTRk1FQUVsZW1lbnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFic3RyYWN0IFNGTUVBIEVsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFic3RyYWN0IFNGTUVBIEVsZW1lbnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlBYnN0cmFjdFNGTUVBRWxlbWVudCBjcmVhdGVBYnN0cmFjdFNGTUVBRWxlbWVudCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNGYWlsdXJlTW9kZUZNRUEgY3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTRmFpbHVyZU1vZGVGTUVBIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRkZNRUFQYWNrYWdlIGdldEVTRkZNRUFQYWNrYWdlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJRVNGRk1FQVBhY2thZ2UgZ2V0RVNGRk1FQVBhY2thZ2UoKTsKIAogfSAvL0lFU0ZGTUVBRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JRVNGRk1FQVBhY2thZ2UuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvSUVTRkZNRUFQYWNrYWdlLmphdmEKaW5kZXggYjhiNmIyYi4uNTVlNjUxNyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JRVNGRk1FQVBhY2thZ2UuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lFU0ZGTUVBUGFja2FnZS5qYXZhCkBAIC0zNSwxMDk4ICszNSwxMDk4IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUVTRkZNRUFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOQU1FID0gImVzZmZtZWEiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAiZXNmZm1lYSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5wb2xhcnN5cy5vcmcvZXNmLzAuNy4wL0VTRkZNRUEiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGRk1FQSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIkVTRkZNRUEiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAiRVNGRk1FQSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRkZNRUFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkVTRkZNRUFQYWNrYWdlLmluaXQoKTsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUlFU0ZGTUVBUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZS5pbml0KCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGTUVBIDxlbT5TRk1FQTwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGTUVBCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZSNnZXRTRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTRk1FQSA9IDA7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5TRk1FQSA8ZW0+U0ZNRUE8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5TRk1FQQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuRVNGRk1FQVBhY2thZ2UjZ2V0U0ZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0ZNRUEgPSAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRk1FQV9fVVVJRCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZNRUFfX1VVSUQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9BTkFMWVNJU19fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZNRUFfX05BTUUgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9BTkFMWVNJU19fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGTUVBX19OQU1FID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRk1FQV9fREVTQ1JJUFRJT04gPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9BTkFMWVNJU19fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZNRUFfX0RFU0NSSVBUSU9OID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNTYWZldHkgQ29uY2VwdHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZNRUFfX1NTQUZFVFlfQ09OQ0VQVFNfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX19TU0FGRVRZX0NPTkNFUFRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNTYWZldHkgQ29uY2VwdHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZNRUFfX1NTQUZFVFlfQ09OQ0VQVFNfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX19TU0FGRVRZX0NPTkNFUFRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZNRUFfX0JBU0VfUEFDS0FHRSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRk1FQV9fQkFTRV9QQUNLQUdFID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrcyBGTUVBIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGTUVBX19TQkxPQ0tTX0ZNRUFfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2tzIEZNRUEgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZNRUFfX1NCTE9DS1NfRk1FQV9MSVNUID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0ZNRUE8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZNRUFfRkVBVFVSRV9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRk1FQTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRk1FQV9GRUFUVVJFX0NPVU5UID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0ZNRUE8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZNRUFfT1BFUkFUSU9OX0NPVU5UID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0ZNRUE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZNRUFfT1BFUkFUSU9OX0NPVU5UID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuQWJzdHJhY3RTRk1FQUVsZW1lbnQgPGVtPkFic3RyYWN0IFNGTUVBIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5BYnN0cmFjdFNGTUVBRWxlbWVudAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuRVNGRk1FQVBhY2thZ2UjZ2V0QWJzdHJhY3RTRk1FQUVsZW1lbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVCA9IDI7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5BYnN0cmFjdFNGTUVBRWxlbWVudCA8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkFic3RyYWN0U0ZNRUFFbGVtZW50CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZSNnZXRBYnN0cmFjdFNGTUVBRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UID0gMjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fVVVJRCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfX1VVSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19VVUlEID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQ09OQ0VQVF9fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fTkFNRSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19OQU1FID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQ09OQ0VQVF9fTkFNRTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfX0RFU0NSSVBUSU9OID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQ09OQ0VQVF9fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fREVTQ1JJUFRJT04gPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuU0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5TQmxvY2tGTUVBCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZSNnZXRTQmxvY2tGTUVBKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNCTE9DS19GTUVBID0gMTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNCbG9ja0ZNRUEgPGVtPlNCbG9jayBGTUVBPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuU0Jsb2NrRk1FQQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuRVNGRk1FQVBhY2thZ2UjZ2V0U0Jsb2NrRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTQkxPQ0tfRk1FQSA9IDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCTE9DS19GTUVBX19VVUlEID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19GTUVBX19VVUlEID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0ZNRUFfX05BTUUgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0ZNRUFfX05BTUUgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0ZNRUFfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0ZNRUFfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fREVTQ1JJUFRJT047CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfRk1FQV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19GTUVBX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0ZNRUFfX1NCTE9DSyA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jazwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19GTUVBX19TQkxPQ0sgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0ZNRUFfX0NSSVRJQ0FMSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfRk1FQV9fQ1JJVElDQUxJVFkgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfRk1FQV9fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfRk1FQV9fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TQmxvY2sgRk1FQTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfRk1FQV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0Jsb2NrIEZNRUE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0ZNRUFfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0Jsb2NrIEZNRUE8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0ZNRUFfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TQmxvY2sgRk1FQTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfRk1FQV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGYWlsdXJlTW9kZUZNRUEgPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGYWlsdXJlTW9kZUZNRUEKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBID0gMzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGYWlsdXJlTW9kZUZNRUEgPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGYWlsdXJlTW9kZUZNRUEKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBID0gMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19VVUlEID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fVVVJRCA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fTkFNRSA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX05BTUUgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFya3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX1JFTUFSS1MgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1hcmtzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIENyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0NSSVRJQ0FMSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBDcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9DUklUSUNBTElUWSA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWwgQ3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWwgQ3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIE9jY3VyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0UgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIE9jY3VyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0UgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIE9jY3VyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfT0NDVVJFTkNFID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWwgT2NjdXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0UgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgU2V2ZXJpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfU0VWRVJJVFkgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFNldmVyaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1NFVkVSSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFkgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFkgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIERldGVjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lTX0RFVEVDVEFCTEUgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBEZXRlY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfREVURUNUQUJJTElUWSA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWSA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERSA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19TRkFJTFVSRV9NT0RFID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OUyA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUyA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFZmZlY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19MT0NBTF9FRkZFQ1RTID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F1c2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19DQVVTRVMgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F1c2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19DQVVTRVMgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbCBEZXRlY3RhYmlsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9ERVRFQ1RBQklMSVRZID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0RFVEVDVEFCSUxJVFkgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeXN0ZW0gRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fU1lTVEVNX0VGRkVDVFMgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lzdGVtIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTY7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tZXIgRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGQUlMVVJFX01PREVfRk1FQV9fQ1VTVE9NRVJfRUZGRUNUUyA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE3OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21lciBFZmZlY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19DVVNUT01FUl9FRkZFQ1RTID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTc7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIEZNRUE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfX1NCTE9DS19GTUVBID0gQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBGTUVBPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX19TQkxPQ0tfRk1FQSA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE4OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkFJTFVSRV9NT0RFX0ZNRUFfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE5OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOTsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZBSUxVUkVfTU9ERV9GTUVBX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGTUVBX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGQUlMVVJFX01PREVfRk1FQV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CiAKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEgPGVtPlNGTUVBPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNGTUVBPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRk1FQQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0ZNRUEoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGTUVBIDxlbT5TRk1FQTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRk1FQTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNGTUVBKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEjZ2V0QmFzZV9QYWNrYWdlIDxlbT5CYXNlIFBhY2thZ2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGTUVBI2dldEJhc2VfUGFja2FnZSgpCi0gICAgICogQHNlZSAjZ2V0U0ZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNGTUVBX0Jhc2VfUGFja2FnZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRk1FQSNnZXRCYXNlX1BhY2thZ2UgPGVtPkJhc2UgUGFja2FnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEjZ2V0QmFzZV9QYWNrYWdlKCkKKwkgKiBAc2VlICNnZXRTRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0ZNRUFfQmFzZV9QYWNrYWdlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRk1FQSNnZXRTQmxvY2tzRk1FQUxpc3QgPGVtPlNCbG9ja3MgRk1FQSBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TQmxvY2tzIEZNRUEgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEjZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0ZNRUFfU0Jsb2Nrc0ZNRUFMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEjZ2V0U0Jsb2Nrc0ZNRUFMaXN0IDxlbT5TQmxvY2tzIEZNRUEgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0Jsb2NrcyBGTUVBIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGTUVBI2dldFNCbG9ja3NGTUVBTGlzdCgpCisJICogQHNlZSAjZ2V0U0ZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGTUVBX1NCbG9ja3NGTUVBTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBIDxlbT5TQmxvY2sgRk1FQTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TQmxvY2sgRk1FQTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0Jsb2NrRk1FQSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0Jsb2NrIEZNRUE8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNCbG9ja0ZNRUEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNCbG9ja0ZNRUEoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldFNCbG9jayA8ZW0+U0Jsb2NrPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0Jsb2NrPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldFNCbG9jaygpCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrRk1FQV9TQmxvY2soKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRTQmxvY2sgPGVtPlNCbG9jazwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jazwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRTQmxvY2soKQorCSAqIEBzZWUgI2dldFNCbG9ja0ZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCbG9ja0ZNRUFfU0Jsb2NrKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRDcml0aWNhbGl0eSA8ZW0+Q3JpdGljYWxpdHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbGl0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRDcml0aWNhbGl0eSgpCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0Jsb2NrRk1FQV9Dcml0aWNhbGl0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldENyaXRpY2FsaXR5IDxlbT5Dcml0aWNhbGl0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyaXRpY2FsaXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldENyaXRpY2FsaXR5KCkKKwkgKiBAc2VlICNnZXRTQmxvY2tGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTQmxvY2tGTUVBX0NyaXRpY2FsaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBDbGFzczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAc2VlICNnZXRTQmxvY2tGTUVBKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTQmxvY2tGTUVBX0Jhc2VfQ2xhc3MoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAc2VlICNnZXRTQmxvY2tGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTQmxvY2tGTUVBX0Jhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNCbG9ja0ZNRUEjZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0IDxlbT5TRmFpbHVyZSBNb2RlcyBGTUVBIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKQotICAgICAqIEBzZWUgI2dldFNCbG9ja0ZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCbG9ja0ZNRUFfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QgPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpCisJICogQHNlZSAjZ2V0U0Jsb2NrRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Jsb2NrRk1FQV9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JQWJzdHJhY3RTRk1FQUVsZW1lbnQgPGVtPkFic3RyYWN0IFNGTUVBIEVsZW1lbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JQWJzdHJhY3RTRk1FQUVsZW1lbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEFic3RyYWN0U0ZNRUFFbGVtZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklBYnN0cmFjdFNGTUVBRWxlbWVudCA8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklBYnN0cmFjdFNGTUVBRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QWJzdHJhY3RTRk1FQUVsZW1lbnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSA8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSA8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0UmVtYXJrcyA8ZW0+UmVtYXJrczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFya3M8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0UmVtYXJrcygpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9SZW1hcmtzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0UmVtYXJrcyA8ZW0+UmVtYXJrczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFya3M8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0UmVtYXJrcygpCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9SZW1hcmtzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsQ3JpdGljYWxpdHkgPGVtPkluaXRpYWwgQ3JpdGljYWxpdHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxDcml0aWNhbGl0eSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsQ3JpdGljYWxpdHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsQ3JpdGljYWxpdHkgPGVtPkluaXRpYWwgQ3JpdGljYWxpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxDcml0aWNhbGl0eSgpCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsQ3JpdGljYWxpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsQ3JpdGljYWxpdHkgPGVtPkZpbmFsIENyaXRpY2FsaXR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWwgQ3JpdGljYWxpdHk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxDcml0aWNhbGl0eSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbENyaXRpY2FsaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxDcml0aWNhbGl0eSA8ZW0+RmluYWwgQ3JpdGljYWxpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbCBDcml0aWNhbGl0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbENyaXRpY2FsaXR5KCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsQ3JpdGljYWxpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxPY2N1cmVuY2UgPGVtPkluaXRpYWwgT2NjdXJlbmNlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbE9jY3VyZW5jZSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsT2NjdXJlbmNlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbE9jY3VyZW5jZSA8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIE9jY3VyZW5jZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsT2NjdXJlbmNlKCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxPY2N1cmVuY2UoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsT2NjdXJlbmNlIDxlbT5GaW5hbCBPY2N1cmVuY2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbCBPY2N1cmVuY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxPY2N1cmVuY2UoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxPY2N1cmVuY2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbE9jY3VyZW5jZSA8ZW0+RmluYWwgT2NjdXJlbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWwgT2NjdXJlbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsT2NjdXJlbmNlKCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsT2NjdXJlbmNlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsU2V2ZXJpdHkgPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxTZXZlcml0eSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsU2V2ZXJpdHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsU2V2ZXJpdHkgPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxTZXZlcml0eSgpCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsU2V2ZXJpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsU2V2ZXJpdHkgPGVtPkZpbmFsIFNldmVyaXR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxTZXZlcml0eSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbFNldmVyaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxTZXZlcml0eSA8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbCBTZXZlcml0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbFNldmVyaXR5KCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsU2V2ZXJpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2lzRGV0ZWN0YWJsZSA8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIERldGVjdGFibGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjaXNEZXRlY3RhYmxlKCkKLSAgICAgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0lzRGV0ZWN0YWJsZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2lzRGV0ZWN0YWJsZSA8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIERldGVjdGFibGU8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjaXNEZXRlY3RhYmxlKCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0lzRGV0ZWN0YWJsZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkgPGVtPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsRGV0ZWN0YWJpbGl0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxEZXRlY3RhYmlsaXR5IDxlbT5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbERldGVjdGFiaWxpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNGYWlsdXJlTW9kZUZNRUFfQmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGYWlsdXJlTW9kZUZNRUFfQmFzZV9Qcm9wZXJ0eSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0ZhaWx1cmVNb2RlIDxlbT5TRmFpbHVyZSBNb2RlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRTRmFpbHVyZU1vZGUoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNGYWlsdXJlTW9kZUZNRUFfU0ZhaWx1cmVNb2RlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0ZhaWx1cmVNb2RlIDxlbT5TRmFpbHVyZSBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRTRmFpbHVyZU1vZGUoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGYWlsdXJlTW9kZUZNRUFfU0ZhaWx1cmVNb2RlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMgPGVtPkluaXRpYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyA8ZW0+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zIDxlbT5GaW5hbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucygpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbFByZXZlbnRpdmVBY3Rpb25zKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucyA8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxQcmV2ZW50aXZlQWN0aW9ucygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0TG9jYWxFZmZlY3RzIDxlbT5Mb2NhbCBFZmZlY3RzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWwgRWZmZWN0czwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRMb2NhbEVmZmVjdHMoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfTG9jYWxFZmZlY3RzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0TG9jYWxFZmZlY3RzIDxlbT5Mb2NhbCBFZmZlY3RzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWwgRWZmZWN0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRMb2NhbEVmZmVjdHMoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfTG9jYWxFZmZlY3RzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRDYXVzZXMgPGVtPkNhdXNlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdXNlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRDYXVzZXMoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfQ2F1c2VzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0Q2F1c2VzIDxlbT5DYXVzZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXVzZXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0Q2F1c2VzKCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0NhdXNlcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxEZXRlY3RhYmlsaXR5IDxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbERldGVjdGFiaWxpdHkoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxEZXRlY3RhYmlsaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxEZXRlY3RhYmlsaXR5IDxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbERldGVjdGFiaWxpdHkoKQorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxEZXRlY3RhYmlsaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRTeXN0ZW1FZmZlY3RzIDxlbT5TeXN0ZW0gRWZmZWN0czwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFN5c3RlbUVmZmVjdHMoKQotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZUZNRUEoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfU3lzdGVtRWZmZWN0cygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFN5c3RlbUVmZmVjdHMgPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lzdGVtIEVmZmVjdHM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U3lzdGVtRWZmZWN0cygpCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TeXN0ZW1FZmZlY3RzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRDdXN0b21lckVmZmVjdHMgPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXN0b21lciBFZmZlY3RzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEN1c3RvbWVyRWZmZWN0cygpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DdXN0b21lckVmZmVjdHMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRDdXN0b21lckVmZmVjdHMgPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXN0b21lciBFZmZlY3RzPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEN1c3RvbWVyRWZmZWN0cygpCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DdXN0b21lckVmZmVjdHMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFNCbG9ja0ZNRUEgPGVtPlNCbG9jayBGTUVBPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0Jsb2NrIEZNRUE8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0Jsb2NrRk1FQSgpCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TQmxvY2sgRk1FQTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRTQmxvY2tGTUVBKCkKKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRmFpbHVyZU1vZGVGTUVBX1NCbG9ja0ZNRUEoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElFU0ZGTUVBRmFjdG9yeSBnZXRFU0ZGTUVBRmFjdG9yeSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlFU0ZGTUVBRmFjdG9yeSBnZXRFU0ZGTUVBRmFjdG9yeSgpOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICAgICAqICAgPGxpPmVhY2ggb3BlcmF0aW9uIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAgICAgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludGVyZmFjZSBMaXRlcmFscyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuU0ZNRUEgPGVtPlNGTUVBPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuU0ZNRUEKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZSNnZXRTRk1FQSgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTRk1FQSA9IGVJTlNUQU5DRS5nZXRTRk1FQSgpOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGTUVBIDxlbT5TRk1FQTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGTUVBCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuRVNGRk1FQVBhY2thZ2UjZ2V0U0ZNRUEoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0ZNRUEgPSBlSU5TVEFOQ0UuZ2V0U0ZNRUEoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNGTUVBX19CQVNFX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0U0ZNRUFfQmFzZV9QYWNrYWdlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0ZNRUFfX0JBU0VfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRTRk1FQV9CYXNlX1BhY2thZ2UoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9ja3MgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRk1FQV9fU0JMT0NLU19GTUVBX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U0ZNRUFfU0Jsb2Nrc0ZNRUFMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrcyBGTUVBIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGTUVBX19TQkxPQ0tTX0ZNRUFfTElTVCA9IGVJTlNUQU5DRS5nZXRTRk1FQV9TQmxvY2tzRk1FQUxpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNCbG9ja0ZNRUEgPGVtPlNCbG9jayBGTUVBPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuU0Jsb2NrRk1FQQotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkVTRkZNRUFQYWNrYWdlI2dldFNCbG9ja0ZNRUEoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgU0JMT0NLX0ZNRUEgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrRk1FQSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNCbG9ja0ZNRUEgPGVtPlNCbG9jayBGTUVBPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuU0Jsb2NrRk1FQQorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkVTRkZNRUFQYWNrYWdlI2dldFNCbG9ja0ZNRUEoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0JMT0NLX0ZNRUEgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrRk1FQSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0JMT0NLX0ZNRUFfX1NCTE9DSyA9IGVJTlNUQU5DRS5nZXRTQmxvY2tGTUVBX1NCbG9jaygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNCTE9DS19GTUVBX19TQkxPQ0sgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrRk1FQV9TQmxvY2soKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0JMT0NLX0ZNRUFfX0NSSVRJQ0FMSVRZID0gZUlOU1RBTkNFLmdldFNCbG9ja0ZNRUFfQ3JpdGljYWxpdHkoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNCTE9DS19GTUVBX19DUklUSUNBTElUWSA9IGVJTlNUQU5DRS5nZXRTQmxvY2tGTUVBX0NyaXRpY2FsaXR5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrRk1FQV9CYXNlX0NsYXNzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNCTE9DS19GTUVBX19CQVNFX0NMQVNTID0gZUlOU1RBTkNFLmdldFNCbG9ja0ZNRUFfQmFzZV9DbGFzcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUID0gZUlOU1RBTkNFLmdldFNCbG9ja0ZNRUFfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUID0gZUlOU1RBTkNFLmdldFNCbG9ja0ZNRUFfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5BYnN0cmFjdFNGTUVBRWxlbWVudCA8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkFic3RyYWN0U0ZNRUFFbGVtZW50Ci0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuRVNGRk1FQVBhY2thZ2UjZ2V0QWJzdHJhY3RTRk1FQUVsZW1lbnQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFNGTUVBRWxlbWVudCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLkFic3RyYWN0U0ZNRUFFbGVtZW50IDxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuQWJzdHJhY3RTRk1FQUVsZW1lbnQKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZSNnZXRBYnN0cmFjdFNGTUVBRWxlbWVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBQlNUUkFDVF9TRk1FQV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZNRUFFbGVtZW50KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5TRmFpbHVyZU1vZGVGTUVBIDxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5TRmFpbHVyZU1vZGVGTUVBCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLmltcGwuRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTRkFJTFVSRV9NT0RFX0ZNRUEgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGYWlsdXJlTW9kZUZNRUEgPGVtPlNGYWlsdXJlIE1vZGUgRk1FQTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5pbXBsLlNGYWlsdXJlTW9kZUZNRUEKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuaW1wbC5FU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNGQUlMVVJFX01PREVfRk1FQSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZW1hcmtzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfUmVtYXJrcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbWFya3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX1JFTUFSS1MgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9SZW1hcmtzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIENyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0NSSVRJQ0FMSVRZID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbENyaXRpY2FsaXR5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBDcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9DUklUSUNBTElUWSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxDcml0aWNhbGl0eSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluYWwgQ3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxDcml0aWNhbGl0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIENyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9DUklUSUNBTElUWSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsQ3JpdGljYWxpdHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgT2NjdXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX09DQ1VSRU5DRSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxPY2N1cmVuY2UoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIE9jY3VyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsT2NjdXJlbmNlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbCBPY2N1cmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX09DQ1VSRU5DRSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsT2NjdXJlbmNlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluYWwgT2NjdXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbE9jY3VyZW5jZSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9TRVZFUklUWSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxTZXZlcml0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgU2V2ZXJpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfU0VWRVJJVFkgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsU2V2ZXJpdHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIFNldmVyaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9TRVZFUklUWSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsU2V2ZXJpdHkoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFkgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbFNldmVyaXR5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBEZXRlY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfSXNEZXRlY3RhYmxlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRGV0ZWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSVNfREVURUNUQUJMRSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0lzRGV0ZWN0YWJsZSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0RFVEVDVEFCSUxJVFkgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsRGV0ZWN0YWJpbGl0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbERldGVjdGFiaWxpdHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9CYXNlX1Byb3BlcnR5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX1NGQUlMVVJFX01PREUgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TRmFpbHVyZU1vZGUoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0ZBSUxVUkVfTU9ERV9GTUVBX19TRkFJTFVSRV9NT0RFID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfU0ZhaWx1cmVNb2RlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxQcmV2ZW50aXZlQWN0aW9ucygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxQcmV2ZW50aXZlQWN0aW9ucygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUyA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0xvY2FsRWZmZWN0cygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0xPQ0FMX0VGRkVDVFMgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Mb2NhbEVmZmVjdHMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhdXNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfQ2F1c2VzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F1c2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19DQVVTRVMgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DYXVzZXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0RFVEVDVEFCSUxJVFkgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbERldGVjdGFiaWxpdHkoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbCBEZXRlY3RhYmlsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9ERVRFQ1RBQklMSVRZID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxEZXRlY3RhYmlsaXR5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeXN0ZW0gRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fU1lTVEVNX0VGRkVDVFMgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TeXN0ZW1FZmZlY3RzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3lzdGVtIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTID0gZUlOU1RBTkNFLmdldFNGYWlsdXJlTW9kZUZNRUFfU3lzdGVtRWZmZWN0cygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tZXIgRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNGQUlMVVJFX01PREVfRk1FQV9fQ1VTVE9NRVJfRUZGRUNUUyA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX0N1c3RvbWVyRWZmZWN0cygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWVyIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRkFJTFVSRV9NT0RFX0ZNRUFfX0NVU1RPTUVSX0VGRkVDVFMgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DdXN0b21lckVmZmVjdHMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBGTUVBPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0ZBSUxVUkVfTU9ERV9GTUVBX19TQkxPQ0tfRk1FQSA9IGVJTlNUQU5DRS5nZXRTRmFpbHVyZU1vZGVGTUVBX1NCbG9ja0ZNRUEoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgRk1FQTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUEgPSBlSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCk7CiAKLSAgICB9CisJfQogCiB9IC8vSUVTRkZNRUFQYWNrYWdlCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lTQmxvY2tGTUVBLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lTQmxvY2tGTUVBLmphdmEKaW5kZXggYmI1NDJiMi4uOTI3NjkyMSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JU0Jsb2NrRk1FQS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvSVNCbG9ja0ZNRUEuamF2YQpAQCAtMzQsMTAxICszNCwxMDEgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0Jsb2NrRk1FQSBleHRlbmRzIElBYnN0cmFjdFNGTUVBRWxlbWVudCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTQmxvY2soSVNCbG9jaykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0Jsb2NrRk1FQV9TQmxvY2soKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTQmxvY2sgZ2V0U0Jsb2NrKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTQmxvY2soSVNCbG9jaykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0Jsb2NrRk1FQV9TQmxvY2soKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTQmxvY2sgZ2V0U0Jsb2NrKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNCbG9ja0ZNRUEjZ2V0U0Jsb2NrIDxlbT5TQmxvY2s8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jazwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTQmxvY2soSVNCbG9jayB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldFNCbG9jayA8ZW0+U0Jsb2NrPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2s8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNCbG9jaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0Jsb2NrKElTQmxvY2sgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldENyaXRpY2FsaXR5KGludCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0Jsb2NrRk1FQV9Dcml0aWNhbGl0eSgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IGdldENyaXRpY2FsaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENyaXRpY2FsaXR5KGludCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0Jsb2NrRk1FQV9Dcml0aWNhbGl0eSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldENyaXRpY2FsaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNCbG9ja0ZNRUEjZ2V0Q3JpdGljYWxpdHkgPGVtPkNyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q3JpdGljYWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENyaXRpY2FsaXR5KGludCB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldENyaXRpY2FsaXR5IDxlbT5Dcml0aWNhbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENyaXRpY2FsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDcml0aWNhbGl0eShpbnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTQmxvY2tGTUVBX0Jhc2VfQ2xhc3MoKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGdldEJhc2VfQ2xhc3MoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNCbG9ja0ZNRUFfQmFzZV9DbGFzcygpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldEJhc2VfQ2xhc3MgPGVtPkJhc2UgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfQ2xhc3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQX0uCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFNCbG9ja0ZNRUEgPGVtPlNCbG9jayBGTUVBPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0Jsb2NrRk1FQV9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFNCbG9ja0ZNRUEKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja0ZNRUEiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTQmxvY2tGTUVBX1NGYWlsdXJlTW9kZXNGTUVBTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0Jsb2NrRk1FQQorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0Jsb2NrRk1FQSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTRmFpbHVyZU1vZGVGTUVBPiBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKIAogfSAvLyBJU0Jsb2NrRk1FQQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JU0ZNRUEuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvSVNGTUVBLmphdmEKaW5kZXggZjUxYmZmYS4uZDljM2UwYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JU0ZNRUEuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lTRk1FQS5qYXZhCkBAIC0zMiw0NiArMzIsNDYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0ZNRUEgZXh0ZW5kcyBJQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGTUVBX0Jhc2VfUGFja2FnZSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBnZXRCYXNlX1BhY2thZ2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRk1FQV9CYXNlX1BhY2thZ2UoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCW9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgZ2V0QmFzZV9QYWNrYWdlKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGTUVBI2dldEJhc2VfUGFja2FnZSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUGFja2FnZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEjZ2V0QmFzZV9QYWNrYWdlIDxlbT5CYXNlIFBhY2thZ2U8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmFzZV9QYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TQmxvY2tzIEZNRUEgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQX0uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2tzIEZNRUEgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9ja3MgRk1FQSBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRk1FQV9TQmxvY2tzRk1FQUxpc3QoKQotICAgICAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SVNCbG9ja0ZNRUE+IGdldFNCbG9ja3NGTUVBTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9ja3MgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9ja3MgRk1FQSBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrcyBGTUVBIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGTUVBX1NCbG9ja3NGTUVBTGlzdCgpCisJICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJU0Jsb2NrRk1FQT4gZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCk7CiAKIH0gLy8gSVNGTUVBCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lTRmFpbHVyZU1vZGVGTUVBLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL0lTRmFpbHVyZU1vZGVGTUVBLmphdmEKaW5kZXggNmJjM2ZhYS4uMDU4YjhiZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9JU0ZhaWx1cmVNb2RlRk1FQS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvSVNGYWlsdXJlTW9kZUZNRUEuamF2YQpAQCAtNDksNTA5ICs0OSw1MDkgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0ZhaWx1cmVNb2RlRk1FQSBleHRlbmRzIElBYnN0cmFjdFNGTUVBRWxlbWVudCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYXJrczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVtYXJrczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1hcmtzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRSZW1hcmtzKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9SZW1hcmtzKCkKLSAgICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldFJlbWFya3MoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1hcmtzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZW1hcmtzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFya3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlbWFya3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX1JlbWFya3MoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0UmVtYXJrcygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFJlbWFya3MgPGVtPlJlbWFya3M8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFya3M8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFJlbWFya3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFJlbWFya3MoU3RyaW5nIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0UmVtYXJrcyA8ZW0+UmVtYXJrczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYXJrczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UmVtYXJrcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVtYXJrcyhTdHJpbmcgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBDcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgQ3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldEluaXRpYWxDcml0aWNhbGl0eShpbnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbENyaXRpY2FsaXR5KCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgZ2V0SW5pdGlhbENyaXRpY2FsaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBDcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgQ3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEluaXRpYWxDcml0aWNhbGl0eShpbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbENyaXRpY2FsaXR5KCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0SW5pdGlhbENyaXRpY2FsaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbENyaXRpY2FsaXR5IDxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRJbml0aWFsQ3JpdGljYWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEluaXRpYWxDcml0aWNhbGl0eShpbnQgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsQ3JpdGljYWxpdHkgPGVtPkluaXRpYWwgQ3JpdGljYWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgQ3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluaXRpYWxDcml0aWNhbGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5pdGlhbENyaXRpY2FsaXR5KGludCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBDcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaW5hbCBDcml0aWNhbGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBDcml0aWNhbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RmluYWxDcml0aWNhbGl0eShpbnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxDcml0aWNhbGl0eSgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IGdldEZpbmFsQ3JpdGljYWxpdHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBDcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaW5hbCBDcml0aWNhbGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBDcml0aWNhbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RmluYWxDcml0aWNhbGl0eShpbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxDcml0aWNhbGl0eSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldEZpbmFsQ3JpdGljYWxpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbENyaXRpY2FsaXR5IDxlbT5GaW5hbCBDcml0aWNhbGl0eTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWwgQ3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEZpbmFsQ3JpdGljYWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZpbmFsQ3JpdGljYWxpdHkoaW50IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxDcml0aWNhbGl0eSA8ZW0+RmluYWwgQ3JpdGljYWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsIENyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGaW5hbENyaXRpY2FsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGaW5hbENyaXRpY2FsaXR5KGludCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIE9jY3VyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIE9jY3VyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIE9jY3VyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0SW5pdGlhbE9jY3VyZW5jZShpbnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbE9jY3VyZW5jZSgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IGdldEluaXRpYWxPY2N1cmVuY2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIE9jY3VyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIE9jY3VyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIE9jY3VyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5pdGlhbE9jY3VyZW5jZShpbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbE9jY3VyZW5jZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldEluaXRpYWxPY2N1cmVuY2UoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsT2NjdXJlbmNlIDxlbT5Jbml0aWFsIE9jY3VyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEluaXRpYWxPY2N1cmVuY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEluaXRpYWxPY2N1cmVuY2UoaW50IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbE9jY3VyZW5jZSA8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgT2NjdXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbml0aWFsT2NjdXJlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbml0aWFsT2NjdXJlbmNlKGludCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBPY2N1cmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmluYWwgT2NjdXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsIE9jY3VyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RmluYWxPY2N1cmVuY2UoaW50KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsT2NjdXJlbmNlKCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgZ2V0RmluYWxPY2N1cmVuY2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBPY2N1cmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmluYWwgT2NjdXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsIE9jY3VyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RmluYWxPY2N1cmVuY2UoaW50KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsT2NjdXJlbmNlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0RmluYWxPY2N1cmVuY2UoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbE9jY3VyZW5jZSA8ZW0+RmluYWwgT2NjdXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBPY2N1cmVuY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEZpbmFsT2NjdXJlbmNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGaW5hbE9jY3VyZW5jZShpbnQgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbE9jY3VyZW5jZSA8ZW0+RmluYWwgT2NjdXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBPY2N1cmVuY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEZpbmFsT2NjdXJlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGaW5hbE9jY3VyZW5jZShpbnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldEluaXRpYWxTZXZlcml0eShpbnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFNldmVyaXR5KCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgZ2V0SW5pdGlhbFNldmVyaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEluaXRpYWxTZXZlcml0eShpbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFNldmVyaXR5KCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0SW5pdGlhbFNldmVyaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbFNldmVyaXR5IDxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRJbml0aWFsU2V2ZXJpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEluaXRpYWxTZXZlcml0eShpbnQgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsU2V2ZXJpdHkgPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluaXRpYWxTZXZlcml0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5pdGlhbFNldmVyaXR5KGludCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaW5hbCBTZXZlcml0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBTZXZlcml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RmluYWxTZXZlcml0eShpbnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxTZXZlcml0eSgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IGdldEZpbmFsU2V2ZXJpdHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBTZXZlcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaW5hbCBTZXZlcml0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBTZXZlcml0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RmluYWxTZXZlcml0eShpbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxTZXZlcml0eSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldEZpbmFsU2V2ZXJpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRGaW5hbFNldmVyaXR5IDxlbT5GaW5hbCBTZXZlcml0eTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEZpbmFsU2V2ZXJpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZpbmFsU2V2ZXJpdHkoaW50IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxTZXZlcml0eSA8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsIFNldmVyaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGaW5hbFNldmVyaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGaW5hbFNldmVyaXR5KGludCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBEZXRlY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBEZXRlY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIERldGVjdGFibGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldElzRGV0ZWN0YWJsZShib29sZWFuKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0lzRGV0ZWN0YWJsZSgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGJvb2xlYW4gaXNEZXRlY3RhYmxlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRGV0ZWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBEZXRlY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJc0RldGVjdGFibGUoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jc0RldGVjdGFibGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzRGV0ZWN0YWJsZSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2lzRGV0ZWN0YWJsZSA8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNEZXRlY3RhYmxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRJc0RldGVjdGFibGUoYm9vbGVhbiB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2lzRGV0ZWN0YWJsZSA8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNEZXRlY3RhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJc0RldGVjdGFibGUoYm9vbGVhbiB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0SW5pdGlhbERldGVjdGFiaWxpdHkoaW50KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxEZXRlY3RhYmlsaXR5KCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5pdGlhbERldGVjdGFiaWxpdHkoaW50KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxEZXRlY3RhYmlsaXR5KCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSA8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEluaXRpYWxEZXRlY3RhYmlsaXR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRJbml0aWFsRGV0ZWN0YWJpbGl0eShpbnQgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSA8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIERldGVjdGFiaWxpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluaXRpYWxEZXRlY3RhYmlsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbml0aWFsRGV0ZWN0YWJpbGl0eShpbnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0Jhc2VfUHJvcGVydHkoKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhc2VfUHJvcGVydHkoUHJvcGVydHkpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfQmFzZV9Qcm9wZXJ0eSgpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0ZhaWx1cmVNb2RlKElTRmFpbHVyZU1vZGUpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfU0ZhaWx1cmVNb2RlKCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0ZhaWx1cmVNb2RlIGdldFNGYWlsdXJlTW9kZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0ZhaWx1cmVNb2RlKElTRmFpbHVyZU1vZGUpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfU0ZhaWx1cmVNb2RlKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0ZhaWx1cmVNb2RlIGdldFNGYWlsdXJlTW9kZSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFNGYWlsdXJlTW9kZSA8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTRmFpbHVyZU1vZGUoSVNGYWlsdXJlTW9kZSB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFNGYWlsdXJlTW9kZSA8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTRmFpbHVyZU1vZGUoSVNGYWlsdXJlTW9kZSB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyhTdHJpbmcpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zIDxlbT5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyA8ZW0+SW5pdGlhbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyhTdHJpbmcgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaW5hbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5hbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoU3RyaW5nKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMgPGVtPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMgPGVtPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZyB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBFZmZlY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBFZmZlY3RzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldExvY2FsRWZmZWN0cyhTdHJpbmcpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfTG9jYWxFZmZlY3RzKCkKLSAgICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldExvY2FsRWZmZWN0cygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgRWZmZWN0czwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9jYWxFZmZlY3RzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Mb2NhbEVmZmVjdHMoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TG9jYWxFZmZlY3RzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0TG9jYWxFZmZlY3RzIDxlbT5Mb2NhbCBFZmZlY3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFZmZlY3RzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRMb2NhbEVmZmVjdHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldExvY2FsRWZmZWN0cyhTdHJpbmcgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRMb2NhbEVmZmVjdHMgPGVtPkxvY2FsIEVmZmVjdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvY2FsRWZmZWN0cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TG9jYWxFZmZlY3RzKFN0cmluZyB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXVzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdXNlczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXVzZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldENhdXNlcyhTdHJpbmcpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2dldFNGYWlsdXJlTW9kZUZNRUFfQ2F1c2VzKCkKLSAgICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldENhdXNlcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdXNlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F1c2VzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdXNlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2F1c2VzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DYXVzZXMoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Q2F1c2VzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0Q2F1c2VzIDxlbT5DYXVzZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdXNlczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q2F1c2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDYXVzZXMoU3RyaW5nIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0Q2F1c2VzIDxlbT5DYXVzZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdXNlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q2F1c2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDYXVzZXMoU3RyaW5nIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRGaW5hbERldGVjdGFiaWxpdHkoaW50KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsRGV0ZWN0YWJpbGl0eSgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IGdldEZpbmFsRGV0ZWN0YWJpbGl0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmFsIERldGVjdGFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGaW5hbERldGVjdGFiaWxpdHkoaW50KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsRGV0ZWN0YWJpbGl0eSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldEZpbmFsRGV0ZWN0YWJpbGl0eSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEZpbmFsRGV0ZWN0YWJpbGl0eSA8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RmluYWxEZXRlY3RhYmlsaXR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGaW5hbERldGVjdGFiaWxpdHkoaW50IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0RmluYWxEZXRlY3RhYmlsaXR5IDxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGaW5hbERldGVjdGFiaWxpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZpbmFsRGV0ZWN0YWJpbGl0eShpbnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lzdGVtIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRTeXN0ZW1FZmZlY3RzKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TeXN0ZW1FZmZlY3RzKCkKLSAgICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldFN5c3RlbUVmZmVjdHMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeXN0ZW0gRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3lzdGVtIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFN5c3RlbUVmZmVjdHMoU3RyaW5nKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX1N5c3RlbUVmZmVjdHMoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0U3lzdGVtRWZmZWN0cygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldFN5c3RlbUVmZmVjdHMgPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gRWZmZWN0czwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0U3lzdGVtRWZmZWN0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U3lzdGVtRWZmZWN0cyhTdHJpbmcgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRTeXN0ZW1FZmZlY3RzIDxlbT5TeXN0ZW0gRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFN5c3RlbUVmZmVjdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN5c3RlbUVmZmVjdHMoU3RyaW5nIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWVyIEVmZmVjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tZXIgRWZmZWN0czwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0Q3VzdG9tZXJFZmZlY3RzKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DdXN0b21lckVmZmVjdHMoKQotICAgICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q3VzdG9tZXJFZmZlY3RzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9tZXIgRWZmZWN0czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tZXIgRWZmZWN0czwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21lciBFZmZlY3RzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDdXN0b21lckVmZmVjdHMoU3RyaW5nKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX0N1c3RvbWVyRWZmZWN0cygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDdXN0b21lckVmZmVjdHMoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSNnZXRDdXN0b21lckVmZmVjdHMgPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEN1c3RvbWVyRWZmZWN0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q3VzdG9tZXJFZmZlY3RzKFN0cmluZyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBI2dldEN1c3RvbWVyRWZmZWN0cyA8ZW0+Q3VzdG9tZXIgRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tZXIgRWZmZWN0czwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q3VzdG9tZXJFZmZlY3RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDdXN0b21lckVmZmVjdHMoU3RyaW5nIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jayBGTUVBPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCA8ZW0+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9jayBGTUVBPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBGTUVBPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTQmxvY2tGTUVBKElTQmxvY2tGTUVBKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklFU0ZGTUVBUGFja2FnZSNnZXRTRmFpbHVyZU1vZGVGTUVBX1NCbG9ja0ZNRUEoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBI2dldFNGYWlsdXJlTW9kZXNGTUVBTGlzdAotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTQmxvY2tGTUVBIGdldFNCbG9ja0ZNRUEoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TQmxvY2sgRk1FQTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QgPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2sgRk1FQTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgRk1FQTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0Jsb2NrRk1FQShJU0Jsb2NrRk1FQSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSNnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNGYWlsdXJlTW9kZXNGTUVBTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0Jsb2NrRk1FQSBnZXRTQmxvY2tGTUVBKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBGTUVBPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRTQmxvY2tGTUVBKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTQmxvY2tGTUVBKElTQmxvY2tGTUVBIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNGYWlsdXJlTW9kZUZNRUEjZ2V0U0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBGTUVBPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTQmxvY2tGTUVBKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTQmxvY2tGTUVBKElTQmxvY2tGTUVBIHZhbHVlKTsKIAogfSAvLyBJU0ZhaWx1cmVNb2RlRk1FQQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL0Fic3RyYWN0U0ZNRUFFbGVtZW50LmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvQWJzdHJhY3RTRk1FQUVsZW1lbnQuamF2YQppbmRleCAzMWIyYTYyLi41Zjg3NjdmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvQWJzdHJhY3RTRk1FQUVsZW1lbnQuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvQWJzdHJhY3RTRk1FQUVsZW1lbnQuamF2YQpAQCAtMjUsMjMgKzI1LDIzIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBBYnN0cmFjdFNGTUVBRWxlbWVudCBleHRlbmRzIEFic3RyYWN0U1NhZmV0eUNvbmNlcHQgaW1wbGVtZW50cyBJQWJzdHJhY3RTRk1FQUVsZW1lbnQgewotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdFNGTUVBRWxlbWVudCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0U0ZNRUFFbGVtZW50KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkZNRUFQYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1NGTUVBX0VMRU1FTlQ7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkZNRUFQYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1NGTUVBX0VMRU1FTlQ7CisJfQogCiB9IC8vQWJzdHJhY3RTRk1FQUVsZW1lbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvaW1wbC9FU0ZGTUVBRmFjdG9yeS5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL0VTRkZNRUFGYWN0b3J5LmphdmEKaW5kZXggYmNlYTg3ZC4uMTc4ODEzZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL0VTRkZNRUFGYWN0b3J5LmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL0VTRkZNRUFGYWN0b3J5LmphdmEKQEAgLTI3LDExMCArMjcsMTEwIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZGTUVBRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIElFU0ZGTUVBRmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUVTRkZNRUFGYWN0b3J5IGluaXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJRVNGRk1FQUZhY3RvcnkgdGhlRVNGRk1FQUZhY3RvcnkgPSAoSUVTRkZNRUFGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KElFU0ZGTUVBUGFja2FnZS5lTlNfVVJJKTsKLSAgICAgICAgICAgIGlmICh0aGVFU0ZGTUVBRmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoZUVTRkZNRUFGYWN0b3J5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVTRkZNRUFGYWN0b3J5KCk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElFU0ZGTUVBRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJSUVTRkZNRUFGYWN0b3J5IHRoZUVTRkZNRUFGYWN0b3J5ID0gKElFU0ZGTUVBRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeShJRVNGRk1FQVBhY2thZ2UuZU5TX1VSSSk7CisJCQlpZiAodGhlRVNGRk1FQUZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVFU0ZGTUVBRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBFU0ZGTUVBRmFjdG9yeSgpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVTRkZNRUFGYWN0b3J5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFU0ZGTUVBRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotICAgICAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZNRUE6IHJldHVybiBjcmVhdGVTRk1FQSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUE6IHJldHVybiBjcmVhdGVTQmxvY2tGTUVBKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5BQlNUUkFDVF9TRk1FQV9FTEVNRU5UOiByZXR1cm4gY3JlYXRlQWJzdHJhY3RTRk1FQUVsZW1lbnQoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQTogcmV0dXJuIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBOiByZXR1cm4gY3JlYXRlU0ZNRUEoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBOiByZXR1cm4gY3JlYXRlU0Jsb2NrRk1FQSgpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0ZNRUFFbGVtZW50KCk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUE6IHJldHVybiBjcmVhdGVTRmFpbHVyZU1vZGVGTUVBKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRk1FQSBjcmVhdGVTRk1FQSgpIHsKLSAgICAgICAgU0ZNRUEgc2ZtZWEgPSBuZXcgU0ZNRUEoKTsKLSAgICAgICAgcmV0dXJuIHNmbWVhOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGTUVBIGNyZWF0ZVNGTUVBKCkgeworCQlTRk1FQSBzZm1lYSA9IG5ldyBTRk1FQSgpOworCQlyZXR1cm4gc2ZtZWE7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmxvY2tGTUVBIGNyZWF0ZVNCbG9ja0ZNRUEoKSB7Ci0gICAgICAgIFNCbG9ja0ZNRUEgc0Jsb2NrRk1FQSA9IG5ldyBTQmxvY2tGTUVBKCk7Ci0gICAgICAgIHJldHVybiBzQmxvY2tGTUVBOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0ZNRUEgY3JlYXRlU0Jsb2NrRk1FQSgpIHsKKwkJU0Jsb2NrRk1FQSBzQmxvY2tGTUVBID0gbmV3IFNCbG9ja0ZNRUEoKTsKKwkJcmV0dXJuIHNCbG9ja0ZNRUE7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElBYnN0cmFjdFNGTUVBRWxlbWVudCBjcmVhdGVBYnN0cmFjdFNGTUVBRWxlbWVudCgpIHsKLSAgICAgICAgQWJzdHJhY3RTRk1FQUVsZW1lbnQgYWJzdHJhY3RTRk1FQUVsZW1lbnQgPSBuZXcgQWJzdHJhY3RTRk1FQUVsZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0U0ZNRUFFbGVtZW50OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFic3RyYWN0U0ZNRUFFbGVtZW50IGNyZWF0ZUFic3RyYWN0U0ZNRUFFbGVtZW50KCkgeworCQlBYnN0cmFjdFNGTUVBRWxlbWVudCBhYnN0cmFjdFNGTUVBRWxlbWVudCA9IG5ldyBBYnN0cmFjdFNGTUVBRWxlbWVudCgpOworCQlyZXR1cm4gYWJzdHJhY3RTRk1FQUVsZW1lbnQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmFpbHVyZU1vZGVGTUVBIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEoKSB7Ci0gICAgICAgIFNGYWlsdXJlTW9kZUZNRUEgc0ZhaWx1cmVNb2RlRk1FQSA9IG5ldyBTRmFpbHVyZU1vZGVGTUVBKCk7Ci0gICAgICAgIHJldHVybiBzRmFpbHVyZU1vZGVGTUVBOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGYWlsdXJlTW9kZUZNRUEgY3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSgpIHsKKwkJU0ZhaWx1cmVNb2RlRk1FQSBzRmFpbHVyZU1vZGVGTUVBID0gbmV3IFNGYWlsdXJlTW9kZUZNRUEoKTsKKwkJcmV0dXJuIHNGYWlsdXJlTW9kZUZNRUE7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElFU0ZGTUVBUGFja2FnZSBnZXRFU0ZGTUVBUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIChJRVNGRk1FQVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElFU0ZGTUVBUGFja2FnZSBnZXRFU0ZGTUVBUGFja2FnZSgpIHsKKwkJcmV0dXJuIChJRVNGRk1FQVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBJRVNGRk1FQVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIElFU0ZGTUVBUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gSUVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CiAKIH0gLy9FU0ZGTUVBRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL0VTRkZNRUFQYWNrYWdlLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvRVNGRk1FQVBhY2thZ2UuamF2YQppbmRleCBjNDYwNzY3Li5jZDBlYjU2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvRVNGRk1FQVBhY2thZ2UuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvRVNGRk1FQVBhY2thZ2UuamF2YQpAQCAtNDMsNTE4ICs0Myw1MTggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEVTRkZNRUFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSUVTRkZNRUFQYWNrYWdlIHsKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBzZm1lYUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2ZtZWFFQ2xhc3MgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc0Jsb2NrRk1FQUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0Jsb2NrRk1FQUVDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFNGTUVBRWxlbWVudEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RTRk1FQUVsZW1lbnRFQ2xhc3MgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0gICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLSAgICAgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLSAgICAgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0gICAgICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLSAgICAgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotICAgICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUVTRkZNRUFQYWNrYWdlI2VOU19VUkkKLSAgICAgKiBAc2VlICNpbml0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFU0ZGTUVBUGFja2FnZSgpIHsKLSAgICAgICAgc3VwZXIoZU5TX1VSSSwgSUVTRkZNRUFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JRVNGRk1FQVBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVTRkZNRUFQYWNrYWdlKCkgeworCQlzdXBlcihlTlNfVVJJLCBJRVNGRk1FQUZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgSUVTRkZNRUFQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotICAgICAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNlTlNfVVJJCi0gICAgICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLSAgICAgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRVNGRk1FQVBhY2thZ2UgaW5pdCgpIHsKLSAgICAgICAgaWYgKGlzSW5pdGVkKSByZXR1cm4gKElFU0ZGTUVBUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJRVNGRk1FQVBhY2thZ2UuZU5TX1VSSSk7CisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgSUVTRkZNRUFQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJRVNGRk1FQVBhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKElFU0ZGTUVBUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJRVNGRk1FQVBhY2thZ2UuZU5TX1VSSSk7CiAKLSAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotICAgICAgICBFU0ZGTUVBUGFja2FnZSB0aGVFU0ZGTUVBUGFja2FnZSA9IChFU0ZGTUVBUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVNGRk1FQVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRVNGRk1FQVBhY2thZ2UoKSk7CisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJRVNGRk1FQVBhY2thZ2UgdGhlRVNGRk1FQVBhY2thZ2UgPSAoRVNGRk1FQVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVTRkZNRUFQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVTRkZNRUFQYWNrYWdlKCkpOwogCi0gICAgICAgIGlzSW5pdGVkID0gdHJ1ZTsKKwkJaXNJbml0ZWQgPSB0cnVlOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgICAgICBJRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLSAgICAgICAgSUVTRlNhZmV0eUNvbmNlcHRzUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlJRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJSUVTRlNhZmV0eUNvbmNlcHRzUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlRVNGRk1FQVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUVTRkZNRUFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLSAgICAgICAgdGhlRVNGRk1FQVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZUVTRkZNRUFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAotICAgICAgICAvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0gICAgICAgIHRoZUVTRkZNRUFQYWNrYWdlLmZyZWV6ZSgpOworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZUVTRkZNRUFQYWNrYWdlLmZyZWV6ZSgpOwogCiAgIAotICAgICAgICAvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLSAgICAgICAgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KElFU0ZGTUVBUGFja2FnZS5lTlNfVVJJLCB0aGVFU0ZGTUVBUGFja2FnZSk7Ci0gICAgICAgIHJldHVybiB0aGVFU0ZGTUVBUGFja2FnZTsKLSAgICB9CisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoSUVTRkZNRUFQYWNrYWdlLmVOU19VUkksIHRoZUVTRkZNRUFQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZUVTRkZNRUFQYWNrYWdlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0U0ZNRUEoKSB7Ci0gICAgICAgIHJldHVybiBzZm1lYUVDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTRk1FQSgpIHsKKwkJcmV0dXJuIHNmbWVhRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNGTUVBX0Jhc2VfUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXNmbWVhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGTUVBX0Jhc2VfUGFja2FnZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNmbWVhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZNRUFfU0Jsb2Nrc0ZNRUFMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc2ZtZWFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZNRUFfU0Jsb2Nrc0ZNRUFMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2ZtZWFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNCbG9ja0ZNRUEoKSB7Ci0gICAgICAgIHJldHVybiBzQmxvY2tGTUVBRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNCbG9ja0ZNRUEoKSB7CisJCXJldHVybiBzQmxvY2tGTUVBRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0ZNRUFfU0Jsb2NrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc0Jsb2NrRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tGTUVBX1NCbG9jaygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNCbG9ja0ZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTQmxvY2tGTUVBX0NyaXRpY2FsaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0Jsb2NrRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTQmxvY2tGTUVBX0NyaXRpY2FsaXR5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc0Jsb2NrRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0ZNRUFfQmFzZV9DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXNCbG9ja0ZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrRk1FQV9CYXNlX0NsYXNzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc0Jsb2NrRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0ZNRUFfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc0Jsb2NrRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tGTUVBX1NGYWlsdXJlTW9kZXNGTUVBTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNCbG9ja0ZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0U0ZNRUFFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RTRk1FQUVsZW1lbnRFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RTRk1FQUVsZW1lbnQoKSB7CisJCXJldHVybiBhYnN0cmFjdFNGTUVBRWxlbWVudEVDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNGYWlsdXJlTW9kZUZNRUEoKSB7Ci0gICAgICAgIHJldHVybiBzRmFpbHVyZU1vZGVGTUVBRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNGYWlsdXJlTW9kZUZNRUEoKSB7CisJCXJldHVybiBzRmFpbHVyZU1vZGVGTUVBRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfUmVtYXJrcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9SZW1hcmtzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbENyaXRpY2FsaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxDcml0aWNhbGl0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsQ3JpdGljYWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxDcml0aWNhbGl0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxPY2N1cmVuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbE9jY3VyZW5jZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsT2NjdXJlbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsT2NjdXJlbmNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFNldmVyaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxTZXZlcml0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsU2V2ZXJpdHkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxTZXZlcml0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0lzRGV0ZWN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jc0RldGVjdGFibGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsRGV0ZWN0YWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsRGV0ZWN0YWJpbGl0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0Jhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGYWlsdXJlTW9kZUZNRUFfQmFzZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmFpbHVyZU1vZGVGTUVBX1NGYWlsdXJlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGYWlsdXJlTW9kZUZNRUFfU0ZhaWx1cmVNb2RlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfTG9jYWxFZmZlY3RzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Mb2NhbEVmZmVjdHMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfQ2F1c2VzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DYXVzZXMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxEZXRlY3RhYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbERldGVjdGFiaWxpdHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfU3lzdGVtRWZmZWN0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNGYWlsdXJlTW9kZUZNRUFfU3lzdGVtRWZmZWN0cygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DdXN0b21lckVmZmVjdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTRmFpbHVyZU1vZGVGTUVBX0N1c3RvbWVyRWZmZWN0cygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2Upc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUVTRkZNRUFGYWN0b3J5IGdldEVTRkZNRUFGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKElFU0ZGTUVBRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJRVNGRk1FQUZhY3RvcnkgZ2V0RVNGRk1FQUZhY3RvcnkoKSB7CisJCXJldHVybiAoSUVTRkZNRUFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotICAgICAgICBpc0NyZWF0ZWQgPSB0cnVlOworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKIAotICAgICAgICAvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLSAgICAgICAgc2ZtZWFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0ZNRUEpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNmbWVhRUNsYXNzLCBTRk1FQV9fQkFTRV9QQUNLQUdFKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzZm1lYUVDbGFzcywgU0ZNRUFfX1NCTE9DS1NfRk1FQV9MSVNUKTsKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCXNmbWVhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNGTUVBKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZm1lYUVDbGFzcywgU0ZNRUFfX0JBU0VfUEFDS0FHRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2ZtZWFFQ2xhc3MsIFNGTUVBX19TQkxPQ0tTX0ZNRUFfTElTVCk7CiAKLSAgICAgICAgc0Jsb2NrRk1FQUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTQkxPQ0tfRk1FQSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrRk1FQUVDbGFzcywgU0JMT0NLX0ZNRUFfX1NCTE9DSyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc0Jsb2NrRk1FQUVDbGFzcywgU0JMT0NLX0ZNRUFfX0NSSVRJQ0FMSVRZKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tGTUVBRUNsYXNzLCBTQkxPQ0tfRk1FQV9fQkFTRV9DTEFTUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrRk1FQUVDbGFzcywgU0JMT0NLX0ZNRUFfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVCk7CisJCXNCbG9ja0ZNRUFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0JMT0NLX0ZNRUEpOworCQljcmVhdGVFUmVmZXJlbmNlKHNCbG9ja0ZNRUFFQ2xhc3MsIFNCTE9DS19GTUVBX19TQkxPQ0spOworCQljcmVhdGVFQXR0cmlidXRlKHNCbG9ja0ZNRUFFQ2xhc3MsIFNCTE9DS19GTUVBX19DUklUSUNBTElUWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrRk1FQUVDbGFzcywgU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1MpOworCQljcmVhdGVFUmVmZXJlbmNlKHNCbG9ja0ZNRUFFQ2xhc3MsIFNCTE9DS19GTUVBX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1QpOwogCi0gICAgICAgIGFic3RyYWN0U0ZNRUFFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1NGTUVBX0VMRU1FTlQpOworCQlhYnN0cmFjdFNGTUVBRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9TRk1FQV9FTEVNRU5UKTsKIAotICAgICAgICBzRmFpbHVyZU1vZGVGTUVBRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNGQUlMVVJFX01PREVfRk1FQSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfQ1JJVElDQUxJVFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfQ1JJVElDQUxJVFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfT0NDVVJFTkNFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfU0VWRVJJVFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fSVNfREVURUNUQUJMRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0RFVEVDVEFCSUxJVFkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19TRkFJTFVSRV9NT0RFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19MT0NBTF9FRkZFQ1RTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0NBVVNFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9ERVRFQ1RBQklMSVRZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0NVU1RPTUVSX0VGRkVDVFMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUEpOwotICAgIH0KKwkJc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRkFJTFVSRV9NT0RFX0ZNRUEpOworCQljcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fUkVNQVJLUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0NSSVRJQ0FMSVRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfT0NDVVJFTkNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX09DQ1VSRU5DRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1NFVkVSSVRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1NFVkVSSVRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0lTX0RFVEVDVEFCTEUpOworCQljcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX0JBU0VfUFJPUEVSVFkpOworCQljcmVhdGVFUmVmZXJlbmNlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9QUkVWRU5USVZFX0FDVElPTlMpOworCQljcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19DQVVTRVMpOworCQljcmVhdGVFQXR0cmlidXRlKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIFNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19TWVNURU1fRUZGRUNUUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcywgU0ZBSUxVUkVfTU9ERV9GTUVBX19DVVNUT01FUl9FRkZFQ1RTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBTRkFJTFVSRV9NT0RFX0ZNRUFfX1NCTE9DS19GTUVBKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CiAKLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotICAgICAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7CisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgcGFja2FnZQotICAgICAgICBzZXROYW1lKGVOQU1FKTsKLSAgICAgICAgc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0gICAgICAgIHNldE5zVVJJKGVOU19VUkkpOworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKIAotICAgICAgICAvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0gICAgICAgIElFU0ZDb3JlUGFja2FnZSB0aGVFU0ZDb3JlUGFja2FnZSA9IChJRVNGQ29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSUVTRkNvcmVQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBVTUxQYWNrYWdlIHRoZVVNTFBhY2thZ2UgPSAoVU1MUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVTUxQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBJRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlIHRoZUVTRkFyY2hpdGVjdHVyZUNvbmNlcHRzUGFja2FnZSA9IChJRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKElFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UuZU5TX1VSSSk7Ci0gICAgICAgIFR5cGVzUGFja2FnZSB0aGVUeXBlc1BhY2thZ2UgPSAoVHlwZXNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFR5cGVzUGFja2FnZS5lTlNfVVJJKTsKLSAgICAgICAgSVNEeXNmdW5jdGlvbnNQYWNrYWdlIHRoZVNEeXNmdW5jdGlvbnNQYWNrYWdlID0gKElTRHlzZnVuY3Rpb25zUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJU0R5c2Z1bmN0aW9uc1BhY2thZ2UuZU5TX1VSSSk7CisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJSUVTRkNvcmVQYWNrYWdlIHRoZUVTRkNvcmVQYWNrYWdlID0gKElFU0ZDb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJRVNGQ29yZVBhY2thZ2UuZU5TX1VSSSk7CisJCVVNTFBhY2thZ2UgdGhlVU1MUGFja2FnZSA9IChVTUxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVNTFBhY2thZ2UuZU5TX1VSSSk7CisJCUlFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UgdGhlRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlID0gKElFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSUVTRkFyY2hpdGVjdHVyZUNvbmNlcHRzUGFja2FnZS5lTlNfVVJJKTsKKwkJVHlwZXNQYWNrYWdlIHRoZVR5cGVzUGFja2FnZSA9IChUeXBlc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHlwZXNQYWNrYWdlLmVOU19VUkkpOworCQlJU0R5c2Z1bmN0aW9uc1BhY2thZ2UgdGhlU0R5c2Z1bmN0aW9uc1BhY2thZ2UgPSAoSVNEeXNmdW5jdGlvbnNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKElTRHlzZnVuY3Rpb25zUGFja2FnZS5lTlNfVVJJKTsKIAotICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKIAotICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLSAgICAgICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotICAgICAgICBzZm1lYUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFU0ZDb3JlUGFja2FnZS5nZXRBYnN0cmFjdFNTYWZldHlBbmFseXNpcygpKTsKLSAgICAgICAgc0Jsb2NrRk1FQUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZNRUFFbGVtZW50KCkpOwotICAgICAgICBhYnN0cmFjdFNGTUVBRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFU0ZDb3JlUGFja2FnZS5nZXRBYnN0cmFjdFNTYWZldHlDb25jZXB0KCkpOwotICAgICAgICBzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTRk1FQUVsZW1lbnQoKSk7CisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJc2ZtZWFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRVNGQ29yZVBhY2thZ2UuZ2V0QWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMoKSk7CisJCXNCbG9ja0ZNRUFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGTUVBRWxlbWVudCgpKTsKKwkJYWJzdHJhY3RTRk1FQUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRVNGQ29yZVBhY2thZ2UuZ2V0QWJzdHJhY3RTU2FmZXR5Q29uY2VwdCgpKTsKKwkJc0ZhaWx1cmVNb2RlRk1FQUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZNRUFFbGVtZW50KCkpOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycwotICAgICAgICBpbml0RUNsYXNzKHNmbWVhRUNsYXNzLCBJU0ZNRUEuY2xhc3MsICJTRk1FQSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRTRk1FQV9CYXNlX1BhY2thZ2UoKSwgdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksIG51bGwsICJiYXNlX1BhY2thZ2UiLCBudWxsLCAxLCAxLCBJU0ZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFNGTUVBX1NCbG9ja3NGTUVBTGlzdCgpLCB0aGlzLmdldFNCbG9ja0ZNRUEoKSwgbnVsbCwgInNCbG9ja3NGTUVBTGlzdCIsIG51bGwsIDAsIC0xLCBJU0ZNRUEuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKHNmbWVhRUNsYXNzLCBJU0ZNRUEuY2xhc3MsICJTRk1FQSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTRk1FQV9CYXNlX1BhY2thZ2UoKSwgdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksIG51bGwsICJiYXNlX1BhY2thZ2UiLCBudWxsLCAxLCAxLCBJU0ZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNGTUVBX1NCbG9ja3NGTUVBTGlzdCgpLCB0aGlzLmdldFNCbG9ja0ZNRUEoKSwgbnVsbCwgInNCbG9ja3NGTUVBTGlzdCIsIG51bGwsIDAsIC0xLCBJU0ZNRUEuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLSAgICAgICAgaW5pdEVDbGFzcyhzQmxvY2tGTUVBRUNsYXNzLCBJU0Jsb2NrRk1FQS5jbGFzcywgIlNCbG9ja0ZNRUEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U0Jsb2NrRk1FQV9TQmxvY2soKSwgdGhlRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlLmdldFNCbG9jaygpLCBudWxsLCAic0Jsb2NrIiwgbnVsbCwgMSwgMSwgSVNCbG9ja0ZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNCbG9ja0ZNRUFfQ3JpdGljYWxpdHkoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImNyaXRpY2FsaXR5IiwgIjAiLCAxLCAxLCBJU0Jsb2NrRk1FQS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRTQmxvY2tGTUVBX0Jhc2VfQ2xhc3MoKSwgdGhlVU1MUGFja2FnZS5nZXRDbGFzc18oKSwgbnVsbCwgImJhc2VfQ2xhc3MiLCBudWxsLCAxLCAxLCBJU0Jsb2NrRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U0Jsb2NrRk1FQV9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKSwgdGhpcy5nZXRTRmFpbHVyZU1vZGVGTUVBKCksIHRoaXMuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCksICJzRmFpbHVyZU1vZGVzRk1FQUxpc3QiLCBudWxsLCAwLCAtMSwgSVNCbG9ja0ZNRUEuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQ2xhc3Moc0Jsb2NrRk1FQUVDbGFzcywgSVNCbG9ja0ZNRUEuY2xhc3MsICJTQmxvY2tGTUVBIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNCbG9ja0ZNRUFfU0Jsb2NrKCksIHRoZUVTRkFyY2hpdGVjdHVyZUNvbmNlcHRzUGFja2FnZS5nZXRTQmxvY2soKSwgbnVsbCwgInNCbG9jayIsIG51bGwsIDEsIDEsIElTQmxvY2tGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTQmxvY2tGTUVBX0NyaXRpY2FsaXR5KCksIHRoZVR5cGVzUGFja2FnZS5nZXRJbnRlZ2VyKCksICJjcml0aWNhbGl0eSIsICIwIiwgMSwgMSwgSVNCbG9ja0ZNRUEuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0Jsb2NrRk1FQV9CYXNlX0NsYXNzKCksIHRoZVVNTFBhY2thZ2UuZ2V0Q2xhc3NfKCksIG51bGwsICJiYXNlX0NsYXNzIiwgbnVsbCwgMSwgMSwgSVNCbG9ja0ZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNCbG9ja0ZNRUFfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCksIHRoaXMuZ2V0U0ZhaWx1cmVNb2RlRk1FQSgpLCB0aGlzLmdldFNGYWlsdXJlTW9kZUZNRUFfU0Jsb2NrRk1FQSgpLCAic0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0IiwgbnVsbCwgMCwgLTEsIElTQmxvY2tGTUVBLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAogCi0gICAgICAgIGluaXRFQ2xhc3MoYWJzdHJhY3RTRk1FQUVsZW1lbnRFQ2xhc3MsIElBYnN0cmFjdFNGTUVBRWxlbWVudC5jbGFzcywgIkFic3RyYWN0U0ZNRUFFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQ2xhc3MoYWJzdHJhY3RTRk1FQUVsZW1lbnRFQ2xhc3MsIElBYnN0cmFjdFNGTUVBRWxlbWVudC5jbGFzcywgIkFic3RyYWN0U0ZNRUFFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCiAKLSAgICAgICAgaW5pdEVDbGFzcyhzRmFpbHVyZU1vZGVGTUVBRUNsYXNzLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIlNGYWlsdXJlTW9kZUZNRUEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9SZW1hcmtzKCksIHRoZVR5cGVzUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlbWFya3MiLCBudWxsLCAwLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsQ3JpdGljYWxpdHkoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImluaXRpYWxDcml0aWNhbGl0eSIsICIwIiwgMSwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbENyaXRpY2FsaXR5KCksIHRoZVR5cGVzUGFja2FnZS5nZXRJbnRlZ2VyKCksICJmaW5hbENyaXRpY2FsaXR5IiwgIjAiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxPY2N1cmVuY2UoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImluaXRpYWxPY2N1cmVuY2UiLCAiMCIsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxPY2N1cmVuY2UoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImZpbmFsT2NjdXJlbmNlIiwgIjAiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxTZXZlcml0eSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SW50ZWdlcigpLCAiaW5pdGlhbFNldmVyaXR5IiwgIjAiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsU2V2ZXJpdHkoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImZpbmFsU2V2ZXJpdHkiLCAiMCIsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfSXNEZXRlY3RhYmxlKCksIHRoZVR5cGVzUGFja2FnZS5nZXRCb29sZWFuKCksICJpc0RldGVjdGFibGUiLCAiZmFsc2UiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxEZXRlY3RhYmlsaXR5KCksIHRoZVR5cGVzUGFja2FnZS5nZXRJbnRlZ2VyKCksICJpbml0aWFsRGV0ZWN0YWJpbGl0eSIsICIwIiwgMSwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9CYXNlX1Byb3BlcnR5KCksIHRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwgbnVsbCwgImJhc2VfUHJvcGVydHkiLCBudWxsLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TRmFpbHVyZU1vZGUoKSwgdGhlU0R5c2Z1bmN0aW9uc1BhY2thZ2UuZ2V0U0ZhaWx1cmVNb2RlKCksIG51bGwsICJzRmFpbHVyZU1vZGUiLCBudWxsLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKSwgdGhlVHlwZXNQYWNrYWdlLmdldFN0cmluZygpLCAiaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zIiwgbnVsbCwgMCwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxQcmV2ZW50aXZlQWN0aW9ucygpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0U3RyaW5nKCksICJmaW5hbFByZXZlbnRpdmVBY3Rpb25zIiwgbnVsbCwgMCwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfTG9jYWxFZmZlY3RzKCksIHRoZVR5cGVzUGFja2FnZS5nZXRTdHJpbmcoKSwgImxvY2FsRWZmZWN0cyIsIG51bGwsIDAsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0NhdXNlcygpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXVzZXMiLCBudWxsLCAwLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbERldGVjdGFiaWxpdHkoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImZpbmFsRGV0ZWN0YWJpbGl0eSIsICIwIiwgMSwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TeXN0ZW1FZmZlY3RzKCksIHRoZVR5cGVzUGFja2FnZS5nZXRTdHJpbmcoKSwgInN5c3RlbUVmZmVjdHMiLCBudWxsLCAwLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9DdXN0b21lckVmZmVjdHMoKSwgdGhlVHlwZXNQYWNrYWdlLmdldFN0cmluZygpLCAiY3VzdG9tZXJFZmZlY3RzIiwgbnVsbCwgMCwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFNGYWlsdXJlTW9kZUZNRUFfU0Jsb2NrRk1FQSgpLCB0aGlzLmdldFNCbG9ja0ZNRUEoKSwgdGhpcy5nZXRTQmxvY2tGTUVBX1NGYWlsdXJlTW9kZXNGTUVBTGlzdCgpLCAic0Jsb2NrRk1FQSIsIG51bGwsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUNsYXNzKHNGYWlsdXJlTW9kZUZNRUFFQ2xhc3MsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAiU0ZhaWx1cmVNb2RlRk1FQSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX1JlbWFya3MoKSwgdGhlVHlwZXNQYWNrYWdlLmdldFN0cmluZygpLCAicmVtYXJrcyIsIG51bGwsIDAsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxDcml0aWNhbGl0eSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SW50ZWdlcigpLCAiaW5pdGlhbENyaXRpY2FsaXR5IiwgIjAiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsQ3JpdGljYWxpdHkoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImZpbmFsQ3JpdGljYWxpdHkiLCAiMCIsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbE9jY3VyZW5jZSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SW50ZWdlcigpLCAiaW5pdGlhbE9jY3VyZW5jZSIsICIwIiwgMSwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbE9jY3VyZW5jZSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SW50ZWdlcigpLCAiZmluYWxPY2N1cmVuY2UiLCAiMCIsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbFNldmVyaXR5KCksIHRoZVR5cGVzUGFja2FnZS5nZXRJbnRlZ2VyKCksICJpbml0aWFsU2V2ZXJpdHkiLCAiMCIsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfRmluYWxTZXZlcml0eSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SW50ZWdlcigpLCAiZmluYWxTZXZlcml0eSIsICIwIiwgMSwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Jc0RldGVjdGFibGUoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRGV0ZWN0YWJsZSIsICJmYWxzZSIsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfSW5pdGlhbERldGVjdGFiaWxpdHkoKSwgdGhlVHlwZXNQYWNrYWdlLmdldEludGVnZXIoKSwgImluaXRpYWxEZXRlY3RhYmlsaXR5IiwgIjAiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RVJlZmVyZW5jZShnZXRTRmFpbHVyZU1vZGVGTUVBX0Jhc2VfUHJvcGVydHkoKSwgdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLCBudWxsLCAiYmFzZV9Qcm9wZXJ0eSIsIG51bGwsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTRmFpbHVyZU1vZGVGTUVBX1NGYWlsdXJlTW9kZSgpLCB0aGVTRHlzZnVuY3Rpb25zUGFja2FnZS5nZXRTRmFpbHVyZU1vZGUoKSwgbnVsbCwgInNGYWlsdXJlTW9kZSIsIG51bGwsIDEsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0luaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0U3RyaW5nKCksICJpbml0aWFsUHJldmVudGl2ZUFjdGlvbnMiLCBudWxsLCAwLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9GaW5hbFByZXZlbnRpdmVBY3Rpb25zKCksIHRoZVR5cGVzUGFja2FnZS5nZXRTdHJpbmcoKSwgImZpbmFsUHJldmVudGl2ZUFjdGlvbnMiLCBudWxsLCAwLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9Mb2NhbEVmZmVjdHMoKSwgdGhlVHlwZXNQYWNrYWdlLmdldFN0cmluZygpLCAibG9jYWxFZmZlY3RzIiwgbnVsbCwgMCwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNGYWlsdXJlTW9kZUZNRUFfQ2F1c2VzKCksIHRoZVR5cGVzUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdXNlcyIsIG51bGwsIDAsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0ZpbmFsRGV0ZWN0YWJpbGl0eSgpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0SW50ZWdlcigpLCAiZmluYWxEZXRlY3RhYmlsaXR5IiwgIjAiLCAxLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX1N5c3RlbUVmZmVjdHMoKSwgdGhlVHlwZXNQYWNrYWdlLmdldFN0cmluZygpLCAic3lzdGVtRWZmZWN0cyIsIG51bGwsIDAsIDEsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRmFpbHVyZU1vZGVGTUVBX0N1c3RvbWVyRWZmZWN0cygpLCB0aGVUeXBlc1BhY2thZ2UuZ2V0U3RyaW5nKCksICJjdXN0b21lckVmZmVjdHMiLCBudWxsLCAwLCAxLCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0ZhaWx1cmVNb2RlRk1FQV9TQmxvY2tGTUVBKCksIHRoaXMuZ2V0U0Jsb2NrRk1FQSgpLCB0aGlzLmdldFNCbG9ja0ZNRUFfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCksICJzQmxvY2tGTUVBIiwgbnVsbCwgMSwgMSwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLSAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIGFubm90YXRpb25zCi0gICAgICAgIC8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwKLSAgICAgICAgY3JlYXRlVU1MQW5ub3RhdGlvbnMoKTsKLSAgICB9CisJCS8vIENyZWF0ZSBhbm5vdGF0aW9ucworCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MCisJCWNyZWF0ZVVNTEFubm90YXRpb25zKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MPC9iPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVTUxBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIjsgLy8kTk9OLU5MUy0xJAkKLSAgICAgICAgYWRkQW5ub3RhdGlvbgotICAgICAgICAgICh0aGlzLCAKLSAgICAgICAgICAgc291cmNlLCAKLSAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAib3JpZ2luYWxOYW1lIiwgIkVTRkZNRUEiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICB9KTsKLSAgICB9CisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVTUxBbm5vdGF0aW9ucygpIHsKKwkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIjsgLy8kTk9OLU5MUy0xJAkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh0aGlzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAib3JpZ2luYWxOYW1lIiwgIkVTRkZNRUEiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsKKwl9CiAKIH0gLy9FU0ZGTUVBUGFja2FnZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL1NCbG9ja0ZNRUEuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvaW1wbC9TQmxvY2tGTUVBLmphdmEKaW5kZXggODAwY2M2Yi4uNTg1MGFiYyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL1NCbG9ja0ZNRUEuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvU0Jsb2NrRk1FQS5qYXZhCkBAIC00NCwyNTQgKzQ0LDI1NCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU0Jsb2NrRk1FQSBleHRlbmRzIEFic3RyYWN0U0ZNRUFFbGVtZW50IGltcGxlbWVudHMgSVNCbG9ja0ZNRUEgewotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNCbG9jaygpIDxlbT5TQmxvY2s8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNCbG9jaygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTQmxvY2sgc0Jsb2NrOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNCbG9jaygpIDxlbT5TQmxvY2s8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNCbG9jaygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIElTQmxvY2sgc0Jsb2NrOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRpY2FsaXR5KCkgPGVtPkNyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDcml0aWNhbGl0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JJVElDQUxJVFlfRURFRkFVTFQgPSAwOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcml0aWNhbGl0eSgpIDxlbT5Dcml0aWNhbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3JpdGljYWxpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENSSVRJQ0FMSVRZX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfQ2xhc3MoKSA8ZW0+QmFzZSBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2VfQ2xhc3M7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9DbGFzcygpIDxlbT5CYXNlIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzZV9DbGFzczsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTQmxvY2tGTUVBKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0Jsb2NrRk1FQSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZGTUVBUGFja2FnZS5MaXRlcmFscy5TQkxPQ0tfRk1FQTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGRk1FQVBhY2thZ2UuTGl0ZXJhbHMuU0JMT0NLX0ZNRUE7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmxvY2sgZ2V0U0Jsb2NrKCkgewotICAgICAgICBpZiAoc0Jsb2NrICE9IG51bGwgJiYgc0Jsb2NrLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRTQmxvY2sgPSAoSW50ZXJuYWxFT2JqZWN0KXNCbG9jazsKLSAgICAgICAgICAgIHNCbG9jayA9IChJU0Jsb2NrKWVSZXNvbHZlUHJveHkob2xkU0Jsb2NrKTsKLSAgICAgICAgICAgIGlmIChzQmxvY2sgIT0gb2xkU0Jsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TQkxPQ0ssIG9sZFNCbG9jaywgc0Jsb2NrKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNCbG9jazsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmxvY2sgZ2V0U0Jsb2NrKCkgeworCQlpZiAoc0Jsb2NrICE9IG51bGwgJiYgc0Jsb2NrLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTQmxvY2sgPSAoSW50ZXJuYWxFT2JqZWN0KXNCbG9jazsKKwkJCXNCbG9jayA9IChJU0Jsb2NrKWVSZXNvbHZlUHJveHkob2xkU0Jsb2NrKTsKKwkJCWlmIChzQmxvY2sgIT0gb2xkU0Jsb2NrKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TQkxPQ0ssIG9sZFNCbG9jaywgc0Jsb2NrKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNCbG9jazsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9jayBiYXNpY0dldFNCbG9jaygpIHsKLSAgICAgICAgcmV0dXJuIHNCbG9jazsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmxvY2sgYmFzaWNHZXRTQmxvY2soKSB7CisJCXJldHVybiBzQmxvY2s7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0Jsb2NrKElTQmxvY2sgbmV3U0Jsb2NrKSB7Ci0gICAgICAgIElTQmxvY2sgb2xkU0Jsb2NrID0gc0Jsb2NrOwotICAgICAgICBzQmxvY2sgPSBuZXdTQmxvY2s7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fU0JMT0NLLCBvbGRTQmxvY2ssIHNCbG9jaykpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTQmxvY2soSVNCbG9jayBuZXdTQmxvY2spIHsKKwkJSVNCbG9jayBvbGRTQmxvY2sgPSBzQmxvY2s7CisJCXNCbG9jayA9IG5ld1NCbG9jazsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TQkxPQ0ssIG9sZFNCbG9jaywgc0Jsb2NrKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDcml0aWNhbGl0eSgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0NyaXRpY2FsaXR5JyBhdHRyaWJ1dGUKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q3JpdGljYWxpdHkoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdDcml0aWNhbGl0eScgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENyaXRpY2FsaXR5KGludCBuZXdDcml0aWNhbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnQ3JpdGljYWxpdHknIGF0dHJpYnV0ZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3JpdGljYWxpdHkoaW50IG5ld0NyaXRpY2FsaXR5KSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdDcml0aWNhbGl0eScgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCkgewotICAgICAgICBpZiAoYmFzZV9DbGFzcyAhPSBudWxsICYmIGJhc2VfQ2xhc3MuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KWJhc2VfQ2xhc3M7Ci0gICAgICAgICAgICBiYXNlX0NsYXNzID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKWVSZXNvbHZlUHJveHkob2xkQmFzZV9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9DbGFzcyAhPSBvbGRCYXNlX0NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19CQVNFX0NMQVNTLCBvbGRCYXNlX0NsYXNzLCBiYXNlX0NsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCkgeworCQlpZiAoYmFzZV9DbGFzcyAhPSBudWxsICYmIGJhc2VfQ2xhc3MuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KWJhc2VfQ2xhc3M7CisJCQliYXNlX0NsYXNzID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKWVSZXNvbHZlUHJveHkob2xkQmFzZV9DbGFzcyk7CisJCQlpZiAoYmFzZV9DbGFzcyAhPSBvbGRCYXNlX0NsYXNzKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19CQVNFX0NMQVNTLCBvbGRCYXNlX0NsYXNzLCBiYXNlX0NsYXNzKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2ljR2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNpY0dldEJhc2VfQ2xhc3MoKSB7CisJCXJldHVybiBiYXNlX0NsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgewotICAgICAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKLSAgICAgICAgYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fQkFTRV9DTEFTUywgb2xkQmFzZV9DbGFzcywgYmFzZV9DbGFzcykpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIG5ld0Jhc2VfQ2xhc3MpIHsKKwkJb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3Mgb2xkQmFzZV9DbGFzcyA9IGJhc2VfQ2xhc3M7CisJCWJhc2VfQ2xhc3MgPSBuZXdCYXNlX0NsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1MsIG9sZEJhc2VfQ2xhc3MsIGJhc2VfQ2xhc3MpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IGdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fU0JMT0NLOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U0Jsb2NrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENyaXRpY2FsaXR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX0NsYXNzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NCTE9DSzoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNCbG9jaygpOworCQkJCXJldHVybiBiYXNpY0dldFNCbG9jaygpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX0NSSVRJQ0FMSVRZOgorCQkJCXJldHVybiBnZXRDcml0aWNhbGl0eSgpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1M6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRCYXNlX0NsYXNzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9DbGFzcygpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVDoKKwkJCQlyZXR1cm4gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TQkxPQ0s6Ci0gICAgICAgICAgICAgICAgc2V0U0Jsb2NrKChJU0Jsb2NrKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgc2V0Q3JpdGljYWxpdHkoKEludGVnZXIpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZhaWx1cmVNb2RlRk1FQT4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NCTE9DSzoKKwkJCQlzZXRTQmxvY2soKElTQmxvY2spbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19DUklUSUNBTElUWToKKwkJCQlzZXRDcml0aWNhbGl0eSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1Q6CisJCQkJZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTRmFpbHVyZU1vZGVGTUVBPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TQkxPQ0s6Ci0gICAgICAgICAgICAgICAgc2V0U0Jsb2NrKChJU0Jsb2NrKW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19DUklUSUNBTElUWToKLSAgICAgICAgICAgICAgICBzZXRDcml0aWNhbGl0eShDUklUSUNBTElUWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1M6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19TQkxPQ0s6CisJCQkJc2V0U0Jsb2NrKChJU0Jsb2NrKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19DUklUSUNBTElUWToKKwkJCQlzZXRDcml0aWNhbGl0eShDUklUSUNBTElUWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVDoKKwkJCQlnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NCTE9DSzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc0Jsb2NrICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENyaXRpY2FsaXR5KCkgIT0gQ1JJVElDQUxJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9DbGFzcyAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUFfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIWdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fU0JMT0NLOgorCQkJCXJldHVybiBzQmxvY2sgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19DUklUSUNBTElUWToKKwkJCQlyZXR1cm4gZ2V0Q3JpdGljYWxpdHkoKSAhPSBDUklUSUNBTElUWV9FREVGQVVMVDsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBX19CQVNFX0NMQVNTOgorCQkJCXJldHVybiBiYXNlX0NsYXNzICE9IG51bGw7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TQkxPQ0tfRk1FQV9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUOgorCQkJCXJldHVybiAhZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CiAKIH0gLy9TQmxvY2tGTUVBCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvU0ZNRUEuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvaW1wbC9TRk1FQS5qYXZhCmluZGV4IGNjOTMzNTMuLjNlZDEyMmIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvaW1wbC9TRk1FQS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvaW1wbC9TRk1FQS5qYXZhCkBAIC00MiwxNTMgKzQyLDE1MyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU0ZNRUEgZXh0ZW5kcyBBYnN0cmFjdFNTYWZldHlBbmFseXNpcyBpbXBsZW1lbnRzIElTRk1FQSB7Ci0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9QYWNrYWdlKCkgPGVtPkJhc2UgUGFja2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0QmFzZV9QYWNrYWdlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBiYXNlX1BhY2thZ2U7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9QYWNrYWdlKCkgPGVtPkJhc2UgUGFja2FnZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmFzZV9QYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBiYXNlX1BhY2thZ2U7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0ZNRUEoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTRk1FQSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZGTUVBUGFja2FnZS5MaXRlcmFscy5TRk1FQTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGRk1FQVBhY2thZ2UuTGl0ZXJhbHMuU0ZNRUE7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgZ2V0QmFzZV9QYWNrYWdlKCkgewotICAgICAgICBpZiAoYmFzZV9QYWNrYWdlICE9IG51bGwgJiYgYmFzZV9QYWNrYWdlLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX1BhY2thZ2UgPSAoSW50ZXJuYWxFT2JqZWN0KWJhc2VfUGFja2FnZTsKLSAgICAgICAgICAgIGJhc2VfUGFja2FnZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKWVSZXNvbHZlUHJveHkob2xkQmFzZV9QYWNrYWdlKTsKLSAgICAgICAgICAgIGlmIChiYXNlX1BhY2thZ2UgIT0gb2xkQmFzZV9QYWNrYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0UsIG9sZEJhc2VfUGFja2FnZSwgYmFzZV9QYWNrYWdlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUGFja2FnZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgZ2V0QmFzZV9QYWNrYWdlKCkgeworCQlpZiAoYmFzZV9QYWNrYWdlICE9IG51bGwgJiYgYmFzZV9QYWNrYWdlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRCYXNlX1BhY2thZ2UgPSAoSW50ZXJuYWxFT2JqZWN0KWJhc2VfUGFja2FnZTsKKwkJCWJhc2VfUGFja2FnZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKWVSZXNvbHZlUHJveHkob2xkQmFzZV9QYWNrYWdlKTsKKwkJCWlmIChiYXNlX1BhY2thZ2UgIT0gb2xkQmFzZV9QYWNrYWdlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0UsIG9sZEJhc2VfUGFja2FnZSwgYmFzZV9QYWNrYWdlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUGFja2FnZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBiYXNpY0dldEJhc2VfUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUGFja2FnZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgYmFzaWNHZXRCYXNlX1BhY2thZ2UoKSB7CisJCXJldHVybiBiYXNlX1BhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgbmV3QmFzZV9QYWNrYWdlKSB7Ci0gICAgICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb2xkQmFzZV9QYWNrYWdlID0gYmFzZV9QYWNrYWdlOwotICAgICAgICBiYXNlX1BhY2thZ2UgPSBuZXdCYXNlX1BhY2thZ2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fQkFTRV9QQUNLQUdFLCBvbGRCYXNlX1BhY2thZ2UsIGJhc2VfUGFja2FnZSkpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBuZXdCYXNlX1BhY2thZ2UpIHsKKwkJb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvbGRCYXNlX1BhY2thZ2UgPSBiYXNlX1BhY2thZ2U7CisJCWJhc2VfUGFja2FnZSA9IG5ld0Jhc2VfUGFja2FnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0UsIG9sZEJhc2VfUGFja2FnZSwgYmFzZV9QYWNrYWdlKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTQmxvY2tGTUVBPiBnZXRTQmxvY2tzRk1FQUxpc3QoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmxvY2tzIEZNRUEgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0Jsb2NrRk1FQT4gZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrcyBGTUVBIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19TQkxPQ0tTX0ZNRUFfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0U6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRCYXNlX1BhY2thZ2UoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlX1BhY2thZ2UoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19TQkxPQ0tTX0ZNRUFfTElTVDoKKwkJCQlyZXR1cm4gZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fU0JMT0NLU19GTUVBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRTQmxvY2tzRk1FQUxpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTQmxvY2tGTUVBPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fQkFTRV9QQUNLQUdFOgorCQkJCXNldEJhc2VfUGFja2FnZSgob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZNRUFfX1NCTE9DS1NfRk1FQV9MSVNUOgorCQkJCWdldFNCbG9ja3NGTUVBTGlzdCgpLmNsZWFyKCk7CisJCQkJZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0Jsb2NrRk1FQT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fQkFTRV9QQUNLQUdFOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUGFja2FnZSgob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fU0JMT0NLU19GTUVBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fQkFTRV9QQUNLQUdFOgorCQkJCXNldEJhc2VfUGFja2FnZSgob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQV9fU0JMT0NLU19GTUVBX0xJU1Q6CisJCQkJZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfUGFja2FnZSAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZNRUFfX1NCTE9DS1NfRk1FQV9MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkuaXNFbXB0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBX19CQVNFX1BBQ0tBR0U6CisJCQkJcmV0dXJuIGJhc2VfUGFja2FnZSAhPSBudWxsOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZNRUFfX1NCTE9DS1NfRk1FQV9MSVNUOgorCQkJCXJldHVybiAhZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CiAKIH0gLy9TRk1FQQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL1NGYWlsdXJlTW9kZUZNRUEuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvaW1wbC9TRmFpbHVyZU1vZGVGTUVBLmphdmEKaW5kZXggOWJmMWEwOS4uNjEwMDY0ZiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS9pbXBsL1NGYWlsdXJlTW9kZUZNRUEuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL2ltcGwvU0ZhaWx1cmVNb2RlRk1FQS5qYXZhCkBAIC01NywxMDczICs1NywxMDczIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBTRmFpbHVyZU1vZGVGTUVBIGV4dGVuZHMgQWJzdHJhY3RTRk1FQUVsZW1lbnQgaW1wbGVtZW50cyBJU0ZhaWx1cmVNb2RlRk1FQSB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFya3MoKSA8ZW0+UmVtYXJrczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UmVtYXJrcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNQVJLU19FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFya3MoKSA8ZW0+UmVtYXJrczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVtYXJrcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNQVJLU19FREVGQVVMVCA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1hcmtzKCkgPGVtPlJlbWFya3M8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFJlbWFya3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVtYXJrcyA9IFJFTUFSS1NfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYXJrcygpIDxlbT5SZW1hcmtzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZW1hcmtzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlbWFya3MgPSBSRU1BUktTX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxDcml0aWNhbGl0eSgpIDxlbT5Jbml0aWFsIENyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRJbml0aWFsQ3JpdGljYWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQgPSAwOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsQ3JpdGljYWxpdHkoKSA8ZW0+SW5pdGlhbCBDcml0aWNhbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5pdGlhbENyaXRpY2FsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0NSSVRJQ0FMSVRZX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5hbENyaXRpY2FsaXR5KCkgPGVtPkZpbmFsIENyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGaW5hbENyaXRpY2FsaXR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9DUklUSUNBTElUWV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsQ3JpdGljYWxpdHkoKSA8ZW0+RmluYWwgQ3JpdGljYWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbmFsQ3JpdGljYWxpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0NSSVRJQ0FMSVRZX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsT2NjdXJlbmNlKCkgPGVtPkluaXRpYWwgT2NjdXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRJbml0aWFsT2NjdXJlbmNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX09DQ1VSRU5DRV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxPY2N1cmVuY2UoKSA8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluaXRpYWxPY2N1cmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfT0NDVVJFTkNFX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxPY2N1cmVuY2UoKSA8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEluaXRpYWxPY2N1cmVuY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaW5pdGlhbE9jY3VyZW5jZSA9IElOSVRJQUxfT0NDVVJFTkNFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxPY2N1cmVuY2UoKSA8ZW0+SW5pdGlhbCBPY2N1cmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluaXRpYWxPY2N1cmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaW5pdGlhbE9jY3VyZW5jZSA9IElOSVRJQUxfT0NDVVJFTkNFX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsT2NjdXJlbmNlKCkgPGVtPkZpbmFsIE9jY3VyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RmluYWxPY2N1cmVuY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX09DQ1VSRU5DRV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsT2NjdXJlbmNlKCkgPGVtPkZpbmFsIE9jY3VyZW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmluYWxPY2N1cmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX09DQ1VSRU5DRV9FREVGQVVMVCA9IDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5hbE9jY3VyZW5jZSgpIDxlbT5GaW5hbCBPY2N1cmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZpbmFsT2NjdXJlbmNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGZpbmFsT2NjdXJlbmNlID0gRklOQUxfT0NDVVJFTkNFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsT2NjdXJlbmNlKCkgPGVtPkZpbmFsIE9jY3VyZW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmluYWxPY2N1cmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgZmluYWxPY2N1cmVuY2UgPSBGSU5BTF9PQ0NVUkVOQ0VfRURFRkFVTFQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFNldmVyaXR5KCkgPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEluaXRpYWxTZXZlcml0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9TRVZFUklUWV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxTZXZlcml0eSgpIDxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsU2V2ZXJpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfU0VWRVJJVFlfRURFRkFVTFQgPSAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFNldmVyaXR5KCkgPGVtPkluaXRpYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEluaXRpYWxTZXZlcml0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBpbml0aWFsU2V2ZXJpdHkgPSBJTklUSUFMX1NFVkVSSVRZX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxTZXZlcml0eSgpIDxlbT5Jbml0aWFsIFNldmVyaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsU2V2ZXJpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaW5pdGlhbFNldmVyaXR5ID0gSU5JVElBTF9TRVZFUklUWV9FREVGQVVMVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5hbFNldmVyaXR5KCkgPGVtPkZpbmFsIFNldmVyaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGaW5hbFNldmVyaXR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9TRVZFUklUWV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsU2V2ZXJpdHkoKSA8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbmFsU2V2ZXJpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX1NFVkVSSVRZX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsU2V2ZXJpdHkoKSA8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZpbmFsU2V2ZXJpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZmluYWxTZXZlcml0eSA9IEZJTkFMX1NFVkVSSVRZX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsU2V2ZXJpdHkoKSA8ZW0+RmluYWwgU2V2ZXJpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbmFsU2V2ZXJpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgZmluYWxTZXZlcml0eSA9IEZJTkFMX1NFVkVSSVRZX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0ZWN0YWJsZSgpIDxlbT5JcyBEZXRlY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0RldGVjdGFibGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19ERVRFQ1RBQkxFX0VERUZBVUxUID0gZmFsc2U7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0ZWN0YWJsZSgpIDxlbT5JcyBEZXRlY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RldGVjdGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19ERVRFQ1RBQkxFX0VERUZBVUxUID0gZmFsc2U7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RldGVjdGFibGUoKSA8ZW0+SXMgRGV0ZWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNEZXRlY3RhYmxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RldGVjdGFibGUgPSBJU19ERVRFQ1RBQkxFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0ZWN0YWJsZSgpIDxlbT5JcyBEZXRlY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RldGVjdGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzRGV0ZWN0YWJsZSA9IElTX0RFVEVDVEFCTEVfRURFRkFVTFQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKSA8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9ERVRFQ1RBQklMSVRZX0VERUZBVUxUID0gMDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKSA8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9ERVRFQ1RBQklMSVRZX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxEZXRlY3RhYmlsaXR5KCkgPGVtPkluaXRpYWwgRGV0ZWN0YWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaW5pdGlhbERldGVjdGFiaWxpdHkgPSBJTklUSUFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKSA8ZW0+SW5pdGlhbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBpbml0aWFsRGV0ZWN0YWJpbGl0eSA9IElOSVRJQUxfREVURUNUQUJJTElUWV9FREVGQVVMVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9Qcm9wZXJ0eSgpIDxlbT5CYXNlIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHkgYmFzZV9Qcm9wZXJ0eTsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNGYWlsdXJlTW9kZSgpIDxlbT5TRmFpbHVyZSBNb2RlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBJU0ZhaWx1cmVNb2RlIHNGYWlsdXJlTW9kZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTRmFpbHVyZU1vZGUoKSA8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNGYWlsdXJlTW9kZSBzRmFpbHVyZU1vZGU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkgPGVtPkluaXRpYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkgPGVtPkluaXRpYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpIDxlbT5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyA9IElOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpIDxlbT5Jbml0aWFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyA9IElOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKSA8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QUkVWRU5USVZFX0FDVElPTlNfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkgPGVtPkZpbmFsIFByZXZlbnRpdmUgQWN0aW9uczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKSA8ZW0+RmluYWwgUHJldmVudGl2ZSBBY3Rpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmFsUHJldmVudGl2ZUFjdGlvbnMgPSBGSU5BTF9QUkVWRU5USVZFX0FDVElPTlNfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucygpIDxlbT5GaW5hbCBQcmV2ZW50aXZlIEFjdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZmluYWxQcmV2ZW50aXZlQWN0aW9ucyA9IEZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OU19FREVGQVVMVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEVmZmVjdHMoKSA8ZW0+TG9jYWwgRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0TG9jYWxFZmZlY3RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9FRkZFQ1RTX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxFZmZlY3RzKCkgPGVtPkxvY2FsIEVmZmVjdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvY2FsRWZmZWN0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRUZGRUNUU19FREVGQVVMVCA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEVmZmVjdHMoKSA8ZW0+TG9jYWwgRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0TG9jYWxFZmZlY3RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsRWZmZWN0cyA9IExPQ0FMX0VGRkVDVFNfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxFZmZlY3RzKCkgPGVtPkxvY2FsIEVmZmVjdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvY2FsRWZmZWN0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsb2NhbEVmZmVjdHMgPSBMT0NBTF9FRkZFQ1RTX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdXNlcygpIDxlbT5DYXVzZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENhdXNlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FVU0VTX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F1c2VzKCkgPGVtPkNhdXNlczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2F1c2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVVTRVNfRURFRkFVTFQgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F1c2VzKCkgPGVtPkNhdXNlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2F1c2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNhdXNlcyA9IENBVVNFU19FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXVzZXMoKSA8ZW0+Q2F1c2VzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYXVzZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY2F1c2VzID0gQ0FVU0VTX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsRGV0ZWN0YWJpbGl0eSgpIDxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGaW5hbERldGVjdGFiaWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQgPSAwOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5hbERldGVjdGFiaWxpdHkoKSA8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmluYWxEZXRlY3RhYmlsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9ERVRFQ1RBQklMSVRZX0VERUZBVUxUID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmFsRGV0ZWN0YWJpbGl0eSgpIDxlbT5GaW5hbCBEZXRlY3RhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGaW5hbERldGVjdGFiaWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZmluYWxEZXRlY3RhYmlsaXR5ID0gRklOQUxfREVURUNUQUJJTElUWV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5hbERldGVjdGFiaWxpdHkoKSA8ZW0+RmluYWwgRGV0ZWN0YWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmluYWxEZXRlY3RhYmlsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZpbmFsRGV0ZWN0YWJpbGl0eSA9IEZJTkFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtRWZmZWN0cygpIDxlbT5TeXN0ZW0gRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U3lzdGVtRWZmZWN0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0VGRkVDVFNfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1FZmZlY3RzKCkgPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTeXN0ZW1FZmZlY3RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fRUZGRUNUU19FREVGQVVMVCA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1FZmZlY3RzKCkgPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTeXN0ZW1FZmZlY3RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUVmZmVjdHMgPSBTWVNURU1fRUZGRUNUU19FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1FZmZlY3RzKCkgPGVtPlN5c3RlbSBFZmZlY3RzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTeXN0ZW1FZmZlY3RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUVmZmVjdHMgPSBTWVNURU1fRUZGRUNUU19FREVGQVVMVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21lckVmZmVjdHMoKSA8ZW0+Q3VzdG9tZXIgRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q3VzdG9tZXJFZmZlY3RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01FUl9FRkZFQ1RTX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tZXJFZmZlY3RzKCkgPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN1c3RvbWVyRWZmZWN0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NRVJfRUZGRUNUU19FREVGQVVMVCA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21lckVmZmVjdHMoKSA8ZW0+Q3VzdG9tZXIgRWZmZWN0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q3VzdG9tZXJFZmZlY3RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWVyRWZmZWN0cyA9IENVU1RPTUVSX0VGRkVDVFNfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tZXJFZmZlY3RzKCkgPGVtPkN1c3RvbWVyIEVmZmVjdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN1c3RvbWVyRWZmZWN0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjdXN0b21lckVmZmVjdHMgPSBDVVNUT01FUl9FRkZFQ1RTX0VERUZBVUxUOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNGYWlsdXJlTW9kZUZNRUEoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTRmFpbHVyZU1vZGVGTUVBKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkZNRUFQYWNrYWdlLkxpdGVyYWxzLlNGQUlMVVJFX01PREVfRk1FQTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGRk1FQVBhY2thZ2UuTGl0ZXJhbHMuU0ZBSUxVUkVfTU9ERV9GTUVBOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtYXJrcygpIHsKLSAgICAgICAgcmV0dXJuIHJlbWFya3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVtYXJrcygpIHsKKwkJcmV0dXJuIHJlbWFya3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtYXJrcyhTdHJpbmcgbmV3UmVtYXJrcykgewotICAgICAgICBTdHJpbmcgb2xkUmVtYXJrcyA9IHJlbWFya3M7Ci0gICAgICAgIHJlbWFya3MgPSBuZXdSZW1hcmtzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTLCBvbGRSZW1hcmtzLCByZW1hcmtzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbWFya3MoU3RyaW5nIG5ld1JlbWFya3MpIHsKKwkJU3RyaW5nIG9sZFJlbWFya3MgPSByZW1hcmtzOworCQlyZW1hcmtzID0gbmV3UmVtYXJrczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fUkVNQVJLUywgb2xkUmVtYXJrcywgcmVtYXJrcykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5pdGlhbENyaXRpY2FsaXR5KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnSW5pdGlhbCBDcml0aWNhbGl0eScgYXR0cmlidXRlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEluaXRpYWxDcml0aWNhbGl0eSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0luaXRpYWwgQ3JpdGljYWxpdHknIGF0dHJpYnV0ZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ3JpdGljYWxpdHkoaW50IG5ld0luaXRpYWxDcml0aWNhbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnSW5pdGlhbCBDcml0aWNhbGl0eScgYXR0cmlidXRlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ3JpdGljYWxpdHkoaW50IG5ld0luaXRpYWxDcml0aWNhbGl0eSkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnSW5pdGlhbCBDcml0aWNhbGl0eScgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmluYWxDcml0aWNhbGl0eSgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0ZpbmFsIENyaXRpY2FsaXR5JyBhdHRyaWJ1dGUKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0RmluYWxDcml0aWNhbGl0eSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0ZpbmFsIENyaXRpY2FsaXR5JyBhdHRyaWJ1dGUKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxDcml0aWNhbGl0eShpbnQgbmV3RmluYWxDcml0aWNhbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnRmluYWwgQ3JpdGljYWxpdHknIGF0dHJpYnV0ZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmluYWxDcml0aWNhbGl0eShpbnQgbmV3RmluYWxDcml0aWNhbGl0eSkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnRmluYWwgQ3JpdGljYWxpdHknIGF0dHJpYnV0ZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluaXRpYWxPY2N1cmVuY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbml0aWFsT2NjdXJlbmNlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEluaXRpYWxPY2N1cmVuY2UoKSB7CisJCXJldHVybiBpbml0aWFsT2NjdXJlbmNlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxPY2N1cmVuY2UoaW50IG5ld0luaXRpYWxPY2N1cmVuY2UpIHsKLSAgICAgICAgaW50IG9sZEluaXRpYWxPY2N1cmVuY2UgPSBpbml0aWFsT2NjdXJlbmNlOwotICAgICAgICBpbml0aWFsT2NjdXJlbmNlID0gbmV3SW5pdGlhbE9jY3VyZW5jZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0UsIG9sZEluaXRpYWxPY2N1cmVuY2UsIGluaXRpYWxPY2N1cmVuY2UpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbE9jY3VyZW5jZShpbnQgbmV3SW5pdGlhbE9jY3VyZW5jZSkgeworCQlpbnQgb2xkSW5pdGlhbE9jY3VyZW5jZSA9IGluaXRpYWxPY2N1cmVuY2U7CisJCWluaXRpYWxPY2N1cmVuY2UgPSBuZXdJbml0aWFsT2NjdXJlbmNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX09DQ1VSRU5DRSwgb2xkSW5pdGlhbE9jY3VyZW5jZSwgaW5pdGlhbE9jY3VyZW5jZSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmluYWxPY2N1cmVuY2UoKSB7Ci0gICAgICAgIHJldHVybiBmaW5hbE9jY3VyZW5jZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRGaW5hbE9jY3VyZW5jZSgpIHsKKwkJcmV0dXJuIGZpbmFsT2NjdXJlbmNlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsT2NjdXJlbmNlKGludCBuZXdGaW5hbE9jY3VyZW5jZSkgewotICAgICAgICBpbnQgb2xkRmluYWxPY2N1cmVuY2UgPSBmaW5hbE9jY3VyZW5jZTsKLSAgICAgICAgZmluYWxPY2N1cmVuY2UgPSBuZXdGaW5hbE9jY3VyZW5jZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfT0NDVVJFTkNFLCBvbGRGaW5hbE9jY3VyZW5jZSwgZmluYWxPY2N1cmVuY2UpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmluYWxPY2N1cmVuY2UoaW50IG5ld0ZpbmFsT2NjdXJlbmNlKSB7CisJCWludCBvbGRGaW5hbE9jY3VyZW5jZSA9IGZpbmFsT2NjdXJlbmNlOworCQlmaW5hbE9jY3VyZW5jZSA9IG5ld0ZpbmFsT2NjdXJlbmNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0UsIG9sZEZpbmFsT2NjdXJlbmNlLCBmaW5hbE9jY3VyZW5jZSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5pdGlhbFNldmVyaXR5KCkgewotICAgICAgICByZXR1cm4gaW5pdGlhbFNldmVyaXR5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEluaXRpYWxTZXZlcml0eSgpIHsKKwkJcmV0dXJuIGluaXRpYWxTZXZlcml0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2V2ZXJpdHkoaW50IG5ld0luaXRpYWxTZXZlcml0eSkgewotICAgICAgICBpbnQgb2xkSW5pdGlhbFNldmVyaXR5ID0gaW5pdGlhbFNldmVyaXR5OwotICAgICAgICBpbml0aWFsU2V2ZXJpdHkgPSBuZXdJbml0aWFsU2V2ZXJpdHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfU0VWRVJJVFksIG9sZEluaXRpYWxTZXZlcml0eSwgaW5pdGlhbFNldmVyaXR5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZXZlcml0eShpbnQgbmV3SW5pdGlhbFNldmVyaXR5KSB7CisJCWludCBvbGRJbml0aWFsU2V2ZXJpdHkgPSBpbml0aWFsU2V2ZXJpdHk7CisJCWluaXRpYWxTZXZlcml0eSA9IG5ld0luaXRpYWxTZXZlcml0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9TRVZFUklUWSwgb2xkSW5pdGlhbFNldmVyaXR5LCBpbml0aWFsU2V2ZXJpdHkpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEZpbmFsU2V2ZXJpdHkoKSB7Ci0gICAgICAgIHJldHVybiBmaW5hbFNldmVyaXR5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEZpbmFsU2V2ZXJpdHkoKSB7CisJCXJldHVybiBmaW5hbFNldmVyaXR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsU2V2ZXJpdHkoaW50IG5ld0ZpbmFsU2V2ZXJpdHkpIHsKLSAgICAgICAgaW50IG9sZEZpbmFsU2V2ZXJpdHkgPSBmaW5hbFNldmVyaXR5OwotICAgICAgICBmaW5hbFNldmVyaXR5ID0gbmV3RmluYWxTZXZlcml0eTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFksIG9sZEZpbmFsU2V2ZXJpdHksIGZpbmFsU2V2ZXJpdHkpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmluYWxTZXZlcml0eShpbnQgbmV3RmluYWxTZXZlcml0eSkgeworCQlpbnQgb2xkRmluYWxTZXZlcml0eSA9IGZpbmFsU2V2ZXJpdHk7CisJCWZpbmFsU2V2ZXJpdHkgPSBuZXdGaW5hbFNldmVyaXR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9TRVZFUklUWSwgb2xkRmluYWxTZXZlcml0eSwgZmluYWxTZXZlcml0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGV0ZWN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzRGV0ZWN0YWJsZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXRlY3RhYmxlKCkgeworCQlyZXR1cm4gaXNEZXRlY3RhYmxlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElzRGV0ZWN0YWJsZShib29sZWFuIG5ld0lzRGV0ZWN0YWJsZSkgewotICAgICAgICBib29sZWFuIG9sZElzRGV0ZWN0YWJsZSA9IGlzRGV0ZWN0YWJsZTsKLSAgICAgICAgaXNEZXRlY3RhYmxlID0gbmV3SXNEZXRlY3RhYmxlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFLCBvbGRJc0RldGVjdGFibGUsIGlzRGV0ZWN0YWJsZSkpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJc0RldGVjdGFibGUoYm9vbGVhbiBuZXdJc0RldGVjdGFibGUpIHsKKwkJYm9vbGVhbiBvbGRJc0RldGVjdGFibGUgPSBpc0RldGVjdGFibGU7CisJCWlzRGV0ZWN0YWJsZSA9IG5ld0lzRGV0ZWN0YWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSVNfREVURUNUQUJMRSwgb2xkSXNEZXRlY3RhYmxlLCBpc0RldGVjdGFibGUpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluaXRpYWxEZXRlY3RhYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gaW5pdGlhbERldGVjdGFiaWxpdHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKSB7CisJCXJldHVybiBpbml0aWFsRGV0ZWN0YWJpbGl0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsRGV0ZWN0YWJpbGl0eShpbnQgbmV3SW5pdGlhbERldGVjdGFiaWxpdHkpIHsKLSAgICAgICAgaW50IG9sZEluaXRpYWxEZXRlY3RhYmlsaXR5ID0gaW5pdGlhbERldGVjdGFiaWxpdHk7Ci0gICAgICAgIGluaXRpYWxEZXRlY3RhYmlsaXR5ID0gbmV3SW5pdGlhbERldGVjdGFiaWxpdHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfREVURUNUQUJJTElUWSwgb2xkSW5pdGlhbERldGVjdGFiaWxpdHksIGluaXRpYWxEZXRlY3RhYmlsaXR5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxEZXRlY3RhYmlsaXR5KGludCBuZXdJbml0aWFsRGV0ZWN0YWJpbGl0eSkgeworCQlpbnQgb2xkSW5pdGlhbERldGVjdGFiaWxpdHkgPSBpbml0aWFsRGV0ZWN0YWJpbGl0eTsKKwkJaW5pdGlhbERldGVjdGFiaWxpdHkgPSBuZXdJbml0aWFsRGV0ZWN0YWJpbGl0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZLCBvbGRJbml0aWFsRGV0ZWN0YWJpbGl0eSwgaW5pdGlhbERldGVjdGFiaWxpdHkpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgaWYgKGJhc2VfUHJvcGVydHkgIT0gbnVsbCAmJiBiYXNlX1Byb3BlcnR5LmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX1Byb3BlcnR5ID0gKEludGVybmFsRU9iamVjdCliYXNlX1Byb3BlcnR5OwotICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSllUmVzb2x2ZVByb3h5KG9sZEJhc2VfUHJvcGVydHkpOwotICAgICAgICAgICAgaWYgKGJhc2VfUHJvcGVydHkgIT0gb2xkQmFzZV9Qcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0JBU0VfUFJPUEVSVFksIG9sZEJhc2VfUHJvcGVydHksIGJhc2VfUHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKSB7CisJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG51bGwgJiYgYmFzZV9Qcm9wZXJ0eS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9Qcm9wZXJ0eSA9IChJbnRlcm5hbEVPYmplY3QpYmFzZV9Qcm9wZXJ0eTsKKwkJCWJhc2VfUHJvcGVydHkgPSAoUHJvcGVydHkpZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKKwkJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19CQVNFX1BST1BFUlRZLCBvbGRCYXNlX1Byb3BlcnR5LCBiYXNlX1Byb3BlcnR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBiYXNpY0dldEJhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiBiYXNlX1Byb3BlcnR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgewotICAgICAgICBQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0JBU0VfUFJPUEVSVFksIG9sZEJhc2VfUHJvcGVydHksIGJhc2VfUHJvcGVydHkpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7CisJCVByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OworCQliYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWSwgb2xkQmFzZV9Qcm9wZXJ0eSwgYmFzZV9Qcm9wZXJ0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0ZhaWx1cmVNb2RlIGdldFNGYWlsdXJlTW9kZSgpIHsKLSAgICAgICAgaWYgKHNGYWlsdXJlTW9kZSAhPSBudWxsICYmIHNGYWlsdXJlTW9kZS5lSXNQcm94eSgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkU0ZhaWx1cmVNb2RlID0gKEludGVybmFsRU9iamVjdClzRmFpbHVyZU1vZGU7Ci0gICAgICAgICAgICBzRmFpbHVyZU1vZGUgPSAoSVNGYWlsdXJlTW9kZSllUmVzb2x2ZVByb3h5KG9sZFNGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICBpZiAoc0ZhaWx1cmVNb2RlICE9IG9sZFNGYWlsdXJlTW9kZSkgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NGQUlMVVJFX01PREUsIG9sZFNGYWlsdXJlTW9kZSwgc0ZhaWx1cmVNb2RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNGYWlsdXJlTW9kZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTRmFpbHVyZU1vZGUgZ2V0U0ZhaWx1cmVNb2RlKCkgeworCQlpZiAoc0ZhaWx1cmVNb2RlICE9IG51bGwgJiYgc0ZhaWx1cmVNb2RlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTRmFpbHVyZU1vZGUgPSAoSW50ZXJuYWxFT2JqZWN0KXNGYWlsdXJlTW9kZTsKKwkJCXNGYWlsdXJlTW9kZSA9IChJU0ZhaWx1cmVNb2RlKWVSZXNvbHZlUHJveHkob2xkU0ZhaWx1cmVNb2RlKTsKKwkJCWlmIChzRmFpbHVyZU1vZGUgIT0gb2xkU0ZhaWx1cmVNb2RlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERSwgb2xkU0ZhaWx1cmVNb2RlLCBzRmFpbHVyZU1vZGUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc0ZhaWx1cmVNb2RlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0ZhaWx1cmVNb2RlIGJhc2ljR2V0U0ZhaWx1cmVNb2RlKCkgewotICAgICAgICByZXR1cm4gc0ZhaWx1cmVNb2RlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGYWlsdXJlTW9kZSBiYXNpY0dldFNGYWlsdXJlTW9kZSgpIHsKKwkJcmV0dXJuIHNGYWlsdXJlTW9kZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTRmFpbHVyZU1vZGUoSVNGYWlsdXJlTW9kZSBuZXdTRmFpbHVyZU1vZGUpIHsKLSAgICAgICAgSVNGYWlsdXJlTW9kZSBvbGRTRmFpbHVyZU1vZGUgPSBzRmFpbHVyZU1vZGU7Ci0gICAgICAgIHNGYWlsdXJlTW9kZSA9IG5ld1NGYWlsdXJlTW9kZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERSwgb2xkU0ZhaWx1cmVNb2RlLCBzRmFpbHVyZU1vZGUpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0ZhaWx1cmVNb2RlKElTRmFpbHVyZU1vZGUgbmV3U0ZhaWx1cmVNb2RlKSB7CisJCUlTRmFpbHVyZU1vZGUgb2xkU0ZhaWx1cmVNb2RlID0gc0ZhaWx1cmVNb2RlOworCQlzRmFpbHVyZU1vZGUgPSBuZXdTRmFpbHVyZU1vZGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NGQUlMVVJFX01PREUsIG9sZFNGYWlsdXJlTW9kZSwgc0ZhaWx1cmVNb2RlKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBpbml0aWFsUHJldmVudGl2ZUFjdGlvbnM7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCkgeworCQlyZXR1cm4gaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyhTdHJpbmcgbmV3SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKSB7Ci0gICAgICAgIFN0cmluZyBvbGRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMgPSBpbml0aWFsUHJldmVudGl2ZUFjdGlvbnM7Ci0gICAgICAgIGluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyA9IG5ld0luaXRpYWxQcmV2ZW50aXZlQWN0aW9uczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlMsIG9sZEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucywgaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyhTdHJpbmcgbmV3SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKSB7CisJCVN0cmluZyBvbGRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMgPSBpbml0aWFsUHJldmVudGl2ZUFjdGlvbnM7CisJCWluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyA9IG5ld0luaXRpYWxQcmV2ZW50aXZlQWN0aW9uczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlMsIG9sZEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucywgaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkgewotICAgICAgICByZXR1cm4gZmluYWxQcmV2ZW50aXZlQWN0aW9uczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKCkgeworCQlyZXR1cm4gZmluYWxQcmV2ZW50aXZlQWN0aW9uczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZyBuZXdGaW5hbFByZXZlbnRpdmVBY3Rpb25zKSB7Ci0gICAgICAgIFN0cmluZyBvbGRGaW5hbFByZXZlbnRpdmVBY3Rpb25zID0gZmluYWxQcmV2ZW50aXZlQWN0aW9uczsKLSAgICAgICAgZmluYWxQcmV2ZW50aXZlQWN0aW9ucyA9IG5ld0ZpbmFsUHJldmVudGl2ZUFjdGlvbnM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUywgb2xkRmluYWxQcmV2ZW50aXZlQWN0aW9ucywgZmluYWxQcmV2ZW50aXZlQWN0aW9ucykpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKFN0cmluZyBuZXdGaW5hbFByZXZlbnRpdmVBY3Rpb25zKSB7CisJCVN0cmluZyBvbGRGaW5hbFByZXZlbnRpdmVBY3Rpb25zID0gZmluYWxQcmV2ZW50aXZlQWN0aW9uczsKKwkJZmluYWxQcmV2ZW50aXZlQWN0aW9ucyA9IG5ld0ZpbmFsUHJldmVudGl2ZUFjdGlvbnM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUywgb2xkRmluYWxQcmV2ZW50aXZlQWN0aW9ucywgZmluYWxQcmV2ZW50aXZlQWN0aW9ucykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxFZmZlY3RzKCkgewotICAgICAgICByZXR1cm4gbG9jYWxFZmZlY3RzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExvY2FsRWZmZWN0cygpIHsKKwkJcmV0dXJuIGxvY2FsRWZmZWN0czsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbEVmZmVjdHMoU3RyaW5nIG5ld0xvY2FsRWZmZWN0cykgewotICAgICAgICBTdHJpbmcgb2xkTG9jYWxFZmZlY3RzID0gbG9jYWxFZmZlY3RzOwotICAgICAgICBsb2NhbEVmZmVjdHMgPSBuZXdMb2NhbEVmZmVjdHM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0xPQ0FMX0VGRkVDVFMsIG9sZExvY2FsRWZmZWN0cywgbG9jYWxFZmZlY3RzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2FsRWZmZWN0cyhTdHJpbmcgbmV3TG9jYWxFZmZlY3RzKSB7CisJCVN0cmluZyBvbGRMb2NhbEVmZmVjdHMgPSBsb2NhbEVmZmVjdHM7CisJCWxvY2FsRWZmZWN0cyA9IG5ld0xvY2FsRWZmZWN0czsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUywgb2xkTG9jYWxFZmZlY3RzLCBsb2NhbEVmZmVjdHMpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdXNlcygpIHsKLSAgICAgICAgcmV0dXJuIGNhdXNlczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDYXVzZXMoKSB7CisJCXJldHVybiBjYXVzZXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2F1c2VzKFN0cmluZyBuZXdDYXVzZXMpIHsKLSAgICAgICAgU3RyaW5nIG9sZENhdXNlcyA9IGNhdXNlczsKLSAgICAgICAgY2F1c2VzID0gbmV3Q2F1c2VzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19DQVVTRVMsIG9sZENhdXNlcywgY2F1c2VzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENhdXNlcyhTdHJpbmcgbmV3Q2F1c2VzKSB7CisJCVN0cmluZyBvbGRDYXVzZXMgPSBjYXVzZXM7CisJCWNhdXNlcyA9IG5ld0NhdXNlczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTLCBvbGRDYXVzZXMsIGNhdXNlcykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmluYWxEZXRlY3RhYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gZmluYWxEZXRlY3RhYmlsaXR5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEZpbmFsRGV0ZWN0YWJpbGl0eSgpIHsKKwkJcmV0dXJuIGZpbmFsRGV0ZWN0YWJpbGl0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbERldGVjdGFiaWxpdHkoaW50IG5ld0ZpbmFsRGV0ZWN0YWJpbGl0eSkgewotICAgICAgICBpbnQgb2xkRmluYWxEZXRlY3RhYmlsaXR5ID0gZmluYWxEZXRlY3RhYmlsaXR5OwotICAgICAgICBmaW5hbERldGVjdGFiaWxpdHkgPSBuZXdGaW5hbERldGVjdGFiaWxpdHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0RFVEVDVEFCSUxJVFksIG9sZEZpbmFsRGV0ZWN0YWJpbGl0eSwgZmluYWxEZXRlY3RhYmlsaXR5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbmFsRGV0ZWN0YWJpbGl0eShpbnQgbmV3RmluYWxEZXRlY3RhYmlsaXR5KSB7CisJCWludCBvbGRGaW5hbERldGVjdGFiaWxpdHkgPSBmaW5hbERldGVjdGFiaWxpdHk7CisJCWZpbmFsRGV0ZWN0YWJpbGl0eSA9IG5ld0ZpbmFsRGV0ZWN0YWJpbGl0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWSwgb2xkRmluYWxEZXRlY3RhYmlsaXR5LCBmaW5hbERldGVjdGFiaWxpdHkpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUVmZmVjdHMoKSB7Ci0gICAgICAgIHJldHVybiBzeXN0ZW1FZmZlY3RzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUVmZmVjdHMoKSB7CisJCXJldHVybiBzeXN0ZW1FZmZlY3RzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVmZmVjdHMoU3RyaW5nIG5ld1N5c3RlbUVmZmVjdHMpIHsKLSAgICAgICAgU3RyaW5nIG9sZFN5c3RlbUVmZmVjdHMgPSBzeXN0ZW1FZmZlY3RzOwotICAgICAgICBzeXN0ZW1FZmZlY3RzID0gbmV3U3lzdGVtRWZmZWN0czsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU1lTVEVNX0VGRkVDVFMsIG9sZFN5c3RlbUVmZmVjdHMsIHN5c3RlbUVmZmVjdHMpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3lzdGVtRWZmZWN0cyhTdHJpbmcgbmV3U3lzdGVtRWZmZWN0cykgeworCQlTdHJpbmcgb2xkU3lzdGVtRWZmZWN0cyA9IHN5c3RlbUVmZmVjdHM7CisJCXN5c3RlbUVmZmVjdHMgPSBuZXdTeXN0ZW1FZmZlY3RzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19TWVNURU1fRUZGRUNUUywgb2xkU3lzdGVtRWZmZWN0cywgc3lzdGVtRWZmZWN0cykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tZXJFZmZlY3RzKCkgewotICAgICAgICByZXR1cm4gY3VzdG9tZXJFZmZlY3RzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbWVyRWZmZWN0cygpIHsKKwkJcmV0dXJuIGN1c3RvbWVyRWZmZWN0czsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21lckVmZmVjdHMoU3RyaW5nIG5ld0N1c3RvbWVyRWZmZWN0cykgewotICAgICAgICBTdHJpbmcgb2xkQ3VzdG9tZXJFZmZlY3RzID0gY3VzdG9tZXJFZmZlY3RzOwotICAgICAgICBjdXN0b21lckVmZmVjdHMgPSBuZXdDdXN0b21lckVmZmVjdHM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0NVU1RPTUVSX0VGRkVDVFMsIG9sZEN1c3RvbWVyRWZmZWN0cywgY3VzdG9tZXJFZmZlY3RzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1c3RvbWVyRWZmZWN0cyhTdHJpbmcgbmV3Q3VzdG9tZXJFZmZlY3RzKSB7CisJCVN0cmluZyBvbGRDdXN0b21lckVmZmVjdHMgPSBjdXN0b21lckVmZmVjdHM7CisJCWN1c3RvbWVyRWZmZWN0cyA9IG5ld0N1c3RvbWVyRWZmZWN0czsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ1VTVE9NRVJfRUZGRUNUUywgb2xkQ3VzdG9tZXJFZmZlY3RzLCBjdXN0b21lckVmZmVjdHMpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9ja0ZNRUEgZ2V0U0Jsb2NrRk1FQSgpIHsKLSAgICAgICAgSVNCbG9ja0ZNRUEgc0Jsb2NrRk1FQSA9IGJhc2ljR2V0U0Jsb2NrRk1FQSgpOwotICAgICAgICByZXR1cm4gc0Jsb2NrRk1FQSAhPSBudWxsICYmIHNCbG9ja0ZNRUEuZUlzUHJveHkoKSA/IChJU0Jsb2NrRk1FQSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3Qpc0Jsb2NrRk1FQSkgOiBzQmxvY2tGTUVBOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0ZNRUEgZ2V0U0Jsb2NrRk1FQSgpIHsKKwkJSVNCbG9ja0ZNRUEgc0Jsb2NrRk1FQSA9IGJhc2ljR2V0U0Jsb2NrRk1FQSgpOworCQlyZXR1cm4gc0Jsb2NrRk1FQSAhPSBudWxsICYmIHNCbG9ja0ZNRUEuZUlzUHJveHkoKSA/IChJU0Jsb2NrRk1FQSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3Qpc0Jsb2NrRk1FQSkgOiBzQmxvY2tGTUVBOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0Jsb2NrRk1FQSBiYXNpY0dldFNCbG9ja0ZNRUEoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmxvY2sgRk1FQScgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0Jsb2NrRk1FQSBiYXNpY0dldFNCbG9ja0ZNRUEoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmxvY2sgRk1FQScgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0Jsb2NrRk1FQShJU0Jsb2NrRk1FQSBuZXdTQmxvY2tGTUVBKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTQmxvY2sgRk1FQScgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTQmxvY2tGTUVBKElTQmxvY2tGTUVBIG5ld1NCbG9ja0ZNRUEpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NCbG9jayBGTUVBJyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZW1hcmtzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluaXRpYWxDcml0aWNhbGl0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9DUklUSUNBTElUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RmluYWxDcml0aWNhbGl0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX09DQ1VSRU5DRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5pdGlhbE9jY3VyZW5jZSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZpbmFsT2NjdXJlbmNlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfU0VWRVJJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluaXRpYWxTZXZlcml0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9TRVZFUklUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RmluYWxTZXZlcml0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0RldGVjdGFibGUoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNGYWlsdXJlTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNGYWlsdXJlTW9kZSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucygpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19MT0NBTF9FRkZFQ1RTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbEVmZmVjdHMoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDYXVzZXMoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RmluYWxEZXRlY3RhYmlsaXR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTeXN0ZW1FZmZlY3RzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0NVU1RPTUVSX0VGRkVDVFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEN1c3RvbWVyRWZmZWN0cygpOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19TQkxPQ0tfRk1FQToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNCbG9ja0ZNRUEoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTQmxvY2tGTUVBKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fUkVNQVJLUzoKKwkJCQlyZXR1cm4gZ2V0UmVtYXJrcygpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0NSSVRJQ0FMSVRZOgorCQkJCXJldHVybiBnZXRJbml0aWFsQ3JpdGljYWxpdHkoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfQ1JJVElDQUxJVFk6CisJCQkJcmV0dXJuIGdldEZpbmFsQ3JpdGljYWxpdHkoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0U6CisJCQkJcmV0dXJuIGdldEluaXRpYWxPY2N1cmVuY2UoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfT0NDVVJFTkNFOgorCQkJCXJldHVybiBnZXRGaW5hbE9jY3VyZW5jZSgpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1NFVkVSSVRZOgorCQkJCXJldHVybiBnZXRJbml0aWFsU2V2ZXJpdHkoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFk6CisJCQkJcmV0dXJuIGdldEZpbmFsU2V2ZXJpdHkoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSVNfREVURUNUQUJMRToKKwkJCQlyZXR1cm4gaXNEZXRlY3RhYmxlKCk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfREVURUNUQUJJTElUWToKKwkJCQlyZXR1cm4gZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEJhc2VfUHJvcGVydHkoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NGQUlMVVJFX01PREU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTRmFpbHVyZU1vZGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTRmFpbHVyZU1vZGUoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlM6CisJCQkJcmV0dXJuIGdldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9QUkVWRU5USVZFX0FDVElPTlM6CisJCQkJcmV0dXJuIGdldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUzoKKwkJCQlyZXR1cm4gZ2V0TG9jYWxFZmZlY3RzKCk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0NBVVNFUzoKKwkJCQlyZXR1cm4gZ2V0Q2F1c2VzKCk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0RFVEVDVEFCSUxJVFk6CisJCQkJcmV0dXJuIGdldEZpbmFsRGV0ZWN0YWJpbGl0eSgpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19TWVNURU1fRUZGRUNUUzoKKwkJCQlyZXR1cm4gZ2V0U3lzdGVtRWZmZWN0cygpOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19DVVNUT01FUl9FRkZFQ1RTOgorCQkJCXJldHVybiBnZXRDdXN0b21lckVmZmVjdHMoKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUE6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTQmxvY2tGTUVBKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrRk1FQSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1JFTUFSS1M6Ci0gICAgICAgICAgICAgICAgc2V0UmVtYXJrcygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgc2V0SW5pdGlhbENyaXRpY2FsaXR5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZOgotICAgICAgICAgICAgICAgIHNldEZpbmFsQ3JpdGljYWxpdHkoKEludGVnZXIpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0U6Ci0gICAgICAgICAgICAgICAgc2V0SW5pdGlhbE9jY3VyZW5jZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0U6Ci0gICAgICAgICAgICAgICAgc2V0RmluYWxPY2N1cmVuY2UoKEludGVnZXIpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9TRVZFUklUWToKLSAgICAgICAgICAgICAgICBzZXRJbml0aWFsU2V2ZXJpdHkoKEludGVnZXIpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFk6Ci0gICAgICAgICAgICAgICAgc2V0RmluYWxTZXZlcml0eSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFOgotICAgICAgICAgICAgICAgIHNldElzRGV0ZWN0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0RFVEVDVEFCSUxJVFk6Ci0gICAgICAgICAgICAgICAgc2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKEludGVnZXIpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19TRkFJTFVSRV9NT0RFOgotICAgICAgICAgICAgICAgIHNldFNGYWlsdXJlTW9kZSgoSVNGYWlsdXJlTW9kZSluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKLSAgICAgICAgICAgICAgICBzZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9QUkVWRU5USVZFX0FDVElPTlM6Ci0gICAgICAgICAgICAgICAgc2V0RmluYWxQcmV2ZW50aXZlQWN0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0xPQ0FMX0VGRkVDVFM6Ci0gICAgICAgICAgICAgICAgc2V0TG9jYWxFZmZlY3RzKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTOgotICAgICAgICAgICAgICAgIHNldENhdXNlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0RFVEVDVEFCSUxJVFk6Ci0gICAgICAgICAgICAgICAgc2V0RmluYWxEZXRlY3RhYmlsaXR5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTOgotICAgICAgICAgICAgICAgIHNldFN5c3RlbUVmZmVjdHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19DVVNUT01FUl9FRkZFQ1RTOgotICAgICAgICAgICAgICAgIHNldEN1c3RvbWVyRWZmZWN0cygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NCTE9DS19GTUVBOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0ZNRUEoKElTQmxvY2tGTUVBKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fUkVNQVJLUzoKKwkJCQlzZXRSZW1hcmtzKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9DUklUSUNBTElUWToKKwkJCQlzZXRJbml0aWFsQ3JpdGljYWxpdHkoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfQ1JJVElDQUxJVFk6CisJCQkJc2V0RmluYWxDcml0aWNhbGl0eSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX09DQ1VSRU5DRToKKwkJCQlzZXRJbml0aWFsT2NjdXJlbmNlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX09DQ1VSRU5DRToKKwkJCQlzZXRGaW5hbE9jY3VyZW5jZSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1NFVkVSSVRZOgorCQkJCXNldEluaXRpYWxTZXZlcml0eSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9TRVZFUklUWToKKwkJCQlzZXRGaW5hbFNldmVyaXR5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lTX0RFVEVDVEFCTEU6CisJCQkJc2V0SXNEZXRlY3RhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfREVURUNUQUJJTElUWToKKwkJCQlzZXRJbml0aWFsRGV0ZWN0YWJpbGl0eSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NGQUlMVVJFX01PREU6CisJCQkJc2V0U0ZhaWx1cmVNb2RlKChJU0ZhaWx1cmVNb2RlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TOgorCQkJCXNldEluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKKwkJCQlzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUzoKKwkJCQlzZXRMb2NhbEVmZmVjdHMoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19DQVVTRVM6CisJCQkJc2V0Q2F1c2VzKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWToKKwkJCQlzZXRGaW5hbERldGVjdGFiaWxpdHkoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU1lTVEVNX0VGRkVDVFM6CisJCQkJc2V0U3lzdGVtRWZmZWN0cygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0NVU1RPTUVSX0VGRkVDVFM6CisJCQkJc2V0Q3VzdG9tZXJFZmZlY3RzKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUE6CisJCQkJc2V0U0Jsb2NrRk1FQSgoSVNCbG9ja0ZNRUEpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1JFTUFSS1M6Ci0gICAgICAgICAgICAgICAgc2V0UmVtYXJrcyhSRU1BUktTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgc2V0SW5pdGlhbENyaXRpY2FsaXR5KElOSVRJQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgc2V0RmluYWxDcml0aWNhbGl0eShGSU5BTF9DUklUSUNBTElUWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX09DQ1VSRU5DRToKLSAgICAgICAgICAgICAgICBzZXRJbml0aWFsT2NjdXJlbmNlKElOSVRJQUxfT0NDVVJFTkNFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX09DQ1VSRU5DRToKLSAgICAgICAgICAgICAgICBzZXRGaW5hbE9jY3VyZW5jZShGSU5BTF9PQ0NVUkVOQ0VfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9TRVZFUklUWToKLSAgICAgICAgICAgICAgICBzZXRJbml0aWFsU2V2ZXJpdHkoSU5JVElBTF9TRVZFUklUWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9TRVZFUklUWToKLSAgICAgICAgICAgICAgICBzZXRGaW5hbFNldmVyaXR5KEZJTkFMX1NFVkVSSVRZX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lTX0RFVEVDVEFCTEU6Ci0gICAgICAgICAgICAgICAgc2V0SXNEZXRlY3RhYmxlKElTX0RFVEVDVEFCTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZOgotICAgICAgICAgICAgICAgIHNldEluaXRpYWxEZXRlY3RhYmlsaXR5KElOSVRJQUxfREVURUNUQUJJTElUWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICBzZXRTRmFpbHVyZU1vZGUoKElTRmFpbHVyZU1vZGUpbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKLSAgICAgICAgICAgICAgICBzZXRJbml0aWFsUHJldmVudGl2ZUFjdGlvbnMoSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TOgotICAgICAgICAgICAgICAgIHNldEZpbmFsUHJldmVudGl2ZUFjdGlvbnMoRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0xPQ0FMX0VGRkVDVFM6Ci0gICAgICAgICAgICAgICAgc2V0TG9jYWxFZmZlY3RzKExPQ0FMX0VGRkVDVFNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTOgotICAgICAgICAgICAgICAgIHNldENhdXNlcyhDQVVTRVNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWToKLSAgICAgICAgICAgICAgICBzZXRGaW5hbERldGVjdGFiaWxpdHkoRklOQUxfREVURUNUQUJJTElUWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19TWVNURU1fRUZGRUNUUzoKLSAgICAgICAgICAgICAgICBzZXRTeXN0ZW1FZmZlY3RzKFNZU1RFTV9FRkZFQ1RTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0NVU1RPTUVSX0VGRkVDVFM6Ci0gICAgICAgICAgICAgICAgc2V0Q3VzdG9tZXJFZmZlY3RzKENVU1RPTUVSX0VGRkVDVFNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUE6Ci0gICAgICAgICAgICAgICAgc2V0U0Jsb2NrRk1FQSgoSVNCbG9ja0ZNRUEpbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTOgorCQkJCXNldFJlbWFya3MoUkVNQVJLU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JTklUSUFMX0NSSVRJQ0FMSVRZOgorCQkJCXNldEluaXRpYWxDcml0aWNhbGl0eShJTklUSUFMX0NSSVRJQ0FMSVRZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZOgorCQkJCXNldEZpbmFsQ3JpdGljYWxpdHkoRklOQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9PQ0NVUkVOQ0U6CisJCQkJc2V0SW5pdGlhbE9jY3VyZW5jZShJTklUSUFMX09DQ1VSRU5DRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0U6CisJCQkJc2V0RmluYWxPY2N1cmVuY2UoRklOQUxfT0NDVVJFTkNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfU0VWRVJJVFk6CisJCQkJc2V0SW5pdGlhbFNldmVyaXR5KElOSVRJQUxfU0VWRVJJVFlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfU0VWRVJJVFk6CisJCQkJc2V0RmluYWxTZXZlcml0eShGSU5BTF9TRVZFUklUWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFOgorCQkJCXNldElzRGV0ZWN0YWJsZShJU19ERVRFQ1RBQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfREVURUNUQUJJTElUWToKKwkJCQlzZXRJbml0aWFsRGV0ZWN0YWJpbGl0eShJTklUSUFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQkFTRV9QUk9QRVJUWToKKwkJCQlzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NGQUlMVVJFX01PREU6CisJCQkJc2V0U0ZhaWx1cmVNb2RlKChJU0ZhaWx1cmVNb2RlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlM6CisJCQkJc2V0SW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKElOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKKwkJCQlzZXRGaW5hbFByZXZlbnRpdmVBY3Rpb25zKEZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19MT0NBTF9FRkZFQ1RTOgorCQkJCXNldExvY2FsRWZmZWN0cyhMT0NBTF9FRkZFQ1RTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0NBVVNFUzoKKwkJCQlzZXRDYXVzZXMoQ0FVU0VTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0RFVEVDVEFCSUxJVFk6CisJCQkJc2V0RmluYWxEZXRlY3RhYmlsaXR5KEZJTkFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU1lTVEVNX0VGRkVDVFM6CisJCQkJc2V0U3lzdGVtRWZmZWN0cyhTWVNURU1fRUZGRUNUU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19DVVNUT01FUl9FRkZFQ1RTOgorCQkJCXNldEN1c3RvbWVyRWZmZWN0cyhDVVNUT01FUl9FRkZFQ1RTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NCTE9DS19GTUVBOgorCQkJCXNldFNCbG9ja0ZNRUEoKElTQmxvY2tGTUVBKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTOgotICAgICAgICAgICAgICAgIHJldHVybiBSRU1BUktTX0VERUZBVUxUID09IG51bGwgPyByZW1hcmtzICE9IG51bGwgOiAhUkVNQVJLU19FREVGQVVMVC5lcXVhbHMocmVtYXJrcyk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluaXRpYWxDcml0aWNhbGl0eSgpICE9IElOSVRJQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaW5hbENyaXRpY2FsaXR5KCkgIT0gRklOQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfT0NDVVJFTkNFOgotICAgICAgICAgICAgICAgIHJldHVybiBpbml0aWFsT2NjdXJlbmNlICE9IElOSVRJQUxfT0NDVVJFTkNFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsT2NjdXJlbmNlICE9IEZJTkFMX09DQ1VSRU5DRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9TRVZFUklUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5pdGlhbFNldmVyaXR5ICE9IElOSVRJQUxfU0VWRVJJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1NFVkVSSVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFNldmVyaXR5ICE9IEZJTkFMX1NFVkVSSVRZX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0RldGVjdGFibGUgIT0gSVNfREVURUNUQUJMRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZOgotICAgICAgICAgICAgICAgIHJldHVybiBpbml0aWFsRGV0ZWN0YWJpbGl0eSAhPSBJTklUSUFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICByZXR1cm4gc0ZhaWx1cmVNb2RlICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TOgotICAgICAgICAgICAgICAgIHJldHVybiBJTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OU19FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zICE9IG51bGwgOiAhSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlNfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUID09IG51bGwgPyBmaW5hbFByZXZlbnRpdmVBY3Rpb25zICE9IG51bGwgOiAhRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxULmVxdWFscyhmaW5hbFByZXZlbnRpdmVBY3Rpb25zKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gTE9DQUxfRUZGRUNUU19FREVGQVVMVCA9PSBudWxsID8gbG9jYWxFZmZlY3RzICE9IG51bGwgOiAhTE9DQUxfRUZGRUNUU19FREVGQVVMVC5lcXVhbHMobG9jYWxFZmZlY3RzKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBDQVVTRVNfRURFRkFVTFQgPT0gbnVsbCA/IGNhdXNlcyAhPSBudWxsIDogIUNBVVNFU19FREVGQVVMVC5lcXVhbHMoY2F1c2VzKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxEZXRlY3RhYmlsaXR5ICE9IEZJTkFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTOgotICAgICAgICAgICAgICAgIHJldHVybiBTWVNURU1fRUZGRUNUU19FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtRWZmZWN0cyAhPSBudWxsIDogIVNZU1RFTV9FRkZFQ1RTX0VERUZBVUxULmVxdWFscyhzeXN0ZW1FZmZlY3RzKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ1VTVE9NRVJfRUZGRUNUUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gQ1VTVE9NRVJfRUZGRUNUU19FREVGQVVMVCA9PSBudWxsID8gY3VzdG9tZXJFZmZlY3RzICE9IG51bGwgOiAhQ1VTVE9NRVJfRUZGRUNUU19FREVGQVVMVC5lcXVhbHMoY3VzdG9tZXJFZmZlY3RzKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrRk1FQSgpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19SRU1BUktTOgorCQkJCXJldHVybiBSRU1BUktTX0VERUZBVUxUID09IG51bGwgPyByZW1hcmtzICE9IG51bGwgOiAhUkVNQVJLU19FREVGQVVMVC5lcXVhbHMocmVtYXJrcyk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfQ1JJVElDQUxJVFk6CisJCQkJcmV0dXJuIGdldEluaXRpYWxDcml0aWNhbGl0eSgpICE9IElOSVRJQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX0NSSVRJQ0FMSVRZOgorCQkJCXJldHVybiBnZXRGaW5hbENyaXRpY2FsaXR5KCkgIT0gRklOQUxfQ1JJVElDQUxJVFlfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfT0NDVVJFTkNFOgorCQkJCXJldHVybiBpbml0aWFsT2NjdXJlbmNlICE9IElOSVRJQUxfT0NDVVJFTkNFX0VERUZBVUxUOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19GSU5BTF9PQ0NVUkVOQ0U6CisJCQkJcmV0dXJuIGZpbmFsT2NjdXJlbmNlICE9IEZJTkFMX09DQ1VSRU5DRV9FREVGQVVMVDsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9TRVZFUklUWToKKwkJCQlyZXR1cm4gaW5pdGlhbFNldmVyaXR5ICE9IElOSVRJQUxfU0VWRVJJVFlfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1NFVkVSSVRZOgorCQkJCXJldHVybiBmaW5hbFNldmVyaXR5ICE9IEZJTkFMX1NFVkVSSVRZX0VERUZBVUxUOworCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBX19JU19ERVRFQ1RBQkxFOgorCQkJCXJldHVybiBpc0RldGVjdGFibGUgIT0gSVNfREVURUNUQUJMRV9FREVGQVVMVDsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fSU5JVElBTF9ERVRFQ1RBQklMSVRZOgorCQkJCXJldHVybiBpbml0aWFsRGV0ZWN0YWJpbGl0eSAhPSBJTklUSUFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0JBU0VfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0ZBSUxVUkVfTU9ERToKKwkJCQlyZXR1cm4gc0ZhaWx1cmVNb2RlICE9IG51bGw7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0lOSVRJQUxfUFJFVkVOVElWRV9BQ1RJT05TOgorCQkJCXJldHVybiBJTklUSUFMX1BSRVZFTlRJVkVfQUNUSU9OU19FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zICE9IG51bGwgOiAhSU5JVElBTF9QUkVWRU5USVZFX0FDVElPTlNfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxQcmV2ZW50aXZlQWN0aW9ucyk7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX0ZJTkFMX1BSRVZFTlRJVkVfQUNUSU9OUzoKKwkJCQlyZXR1cm4gRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxUID09IG51bGwgPyBmaW5hbFByZXZlbnRpdmVBY3Rpb25zICE9IG51bGwgOiAhRklOQUxfUFJFVkVOVElWRV9BQ1RJT05TX0VERUZBVUxULmVxdWFscyhmaW5hbFByZXZlbnRpdmVBY3Rpb25zKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fTE9DQUxfRUZGRUNUUzoKKwkJCQlyZXR1cm4gTE9DQUxfRUZGRUNUU19FREVGQVVMVCA9PSBudWxsID8gbG9jYWxFZmZlY3RzICE9IG51bGwgOiAhTE9DQUxfRUZGRUNUU19FREVGQVVMVC5lcXVhbHMobG9jYWxFZmZlY3RzKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ0FVU0VTOgorCQkJCXJldHVybiBDQVVTRVNfRURFRkFVTFQgPT0gbnVsbCA/IGNhdXNlcyAhPSBudWxsIDogIUNBVVNFU19FREVGQVVMVC5lcXVhbHMoY2F1c2VzKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fRklOQUxfREVURUNUQUJJTElUWToKKwkJCQlyZXR1cm4gZmluYWxEZXRlY3RhYmlsaXR5ICE9IEZJTkFMX0RFVEVDVEFCSUxJVFlfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZGTUVBUGFja2FnZS5TRkFJTFVSRV9NT0RFX0ZNRUFfX1NZU1RFTV9FRkZFQ1RTOgorCQkJCXJldHVybiBTWVNURU1fRUZGRUNUU19FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtRWZmZWN0cyAhPSBudWxsIDogIVNZU1RFTV9FRkZFQ1RTX0VERUZBVUxULmVxdWFscyhzeXN0ZW1FZmZlY3RzKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fQ1VTVE9NRVJfRUZGRUNUUzoKKwkJCQlyZXR1cm4gQ1VTVE9NRVJfRUZGRUNUU19FREVGQVVMVCA9PSBudWxsID8gY3VzdG9tZXJFZmZlY3RzICE9IG51bGwgOiAhQ1VTVE9NRVJfRUZGRUNUU19FREVGQVVMVC5lcXVhbHMoY3VzdG9tZXJFZmZlY3RzKTsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQV9fU0JMT0NLX0ZNRUE6CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrRk1FQSgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAocmVtYXJrczogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzdWx0LmFwcGVuZChyZW1hcmtzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsT2NjdXJlbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKGluaXRpYWxPY2N1cmVuY2UpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZpbmFsT2NjdXJlbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKGZpbmFsT2NjdXJlbmNlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsU2V2ZXJpdHk6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoaW5pdGlhbFNldmVyaXR5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmaW5hbFNldmVyaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKGZpbmFsU2V2ZXJpdHkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzRGV0ZWN0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpc0RldGVjdGFibGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxEZXRlY3RhYmlsaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKGluaXRpYWxEZXRlY3RhYmlsaXR5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsUHJldmVudGl2ZUFjdGlvbnM6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmaW5hbFByZXZlbnRpdmVBY3Rpb25zOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKGZpbmFsUHJldmVudGl2ZUFjdGlvbnMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGxvY2FsRWZmZWN0czogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzdWx0LmFwcGVuZChsb2NhbEVmZmVjdHMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNhdXNlczogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjYXVzZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZpbmFsRGV0ZWN0YWJpbGl0eTogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmaW5hbERldGVjdGFiaWxpdHkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHN5c3RlbUVmZmVjdHM6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoc3lzdGVtRWZmZWN0cyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY3VzdG9tZXJFZmZlY3RzOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKGN1c3RvbWVyRWZmZWN0cyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVtYXJrczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyZW1hcmtzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsT2NjdXJlbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxPY2N1cmVuY2UpOworCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmFsT2NjdXJlbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGZpbmFsT2NjdXJlbmNlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsU2V2ZXJpdHk6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5pdGlhbFNldmVyaXR5KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBmaW5hbFNldmVyaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGZpbmFsU2V2ZXJpdHkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGlzRGV0ZWN0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpc0RldGVjdGFibGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxEZXRlY3RhYmlsaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxEZXRlY3RhYmlsaXR5KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsUHJldmVudGl2ZUFjdGlvbnM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5pdGlhbFByZXZlbnRpdmVBY3Rpb25zKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBmaW5hbFByZXZlbnRpdmVBY3Rpb25zOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGZpbmFsUHJldmVudGl2ZUFjdGlvbnMpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2FsRWZmZWN0czogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChsb2NhbEVmZmVjdHMpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNhdXNlczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjYXVzZXMpOworCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmFsRGV0ZWN0YWJpbGl0eTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChmaW5hbERldGVjdGFiaWxpdHkpOworCQlyZXN1bHQuYXBwZW5kKCIsIHN5c3RlbUVmZmVjdHM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc3lzdGVtRWZmZWN0cyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY3VzdG9tZXJFZmZlY3RzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGN1c3RvbWVyRWZmZWN0cyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KIAogfSAvL1NGYWlsdXJlTW9kZUZNRUEKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvdXRpbC9FU0ZGTUVBQWRhcHRlckZhY3RvcnkuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvdXRpbC9FU0ZGTUVBQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA1Mzc0MmFkLi43ZmE5YTVmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL3V0aWwvRVNGRk1FQUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS91dGlsL0VTRkZNRUFBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0zMiwyMDkgKzMyLDIwOSBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgRVNGRk1FQUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJRVNGRk1FQVBhY2thZ2UgbW9kZWxQYWNrYWdlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElFU0ZGTUVBUGFja2FnZSBtb2RlbFBhY2thZ2U7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVTRkZNRUFBZGFwdGVyRmFjdG9yeSgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBJRVNGRk1FQVBhY2thZ2UuZUlOU1RBTkNFOwotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVNGRk1FQUFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IElFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFU0ZGTUVBU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KLSAgICAgICAgbmV3IEVTRkZNRUFTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTRk1FQShJU0ZNRUEgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGTUVBQWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU0Jsb2NrRk1FQShJU0Jsb2NrRk1FQSBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU0Jsb2NrRk1FQUFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U0ZNRUFFbGVtZW50KElBYnN0cmFjdFNGTUVBRWxlbWVudCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTRk1FQUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTRmFpbHVyZU1vZGVGTUVBKElTRmFpbHVyZU1vZGVGTUVBIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTRmFpbHVyZU1vZGVGTUVBQWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTRWxlbWVudChJQWJzdHJhY3RTRWxlbWVudCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTRWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzKElBYnN0cmFjdFNTYWZldHlBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXNBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KElBYnN0cmFjdFNTYWZldHlDb25jZXB0IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBYnN0cmFjdFNTYWZldHlDb25jZXB0QWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRVNGRk1FQVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBFU0ZGTUVBU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU0ZNRUEoSVNGTUVBIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTRk1FQUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNCbG9ja0ZNRUEoSVNCbG9ja0ZNRUEgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNCbG9ja0ZNRUFBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNGTUVBRWxlbWVudChJQWJzdHJhY3RTRk1FQUVsZW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0ZNRUFFbGVtZW50QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU0ZhaWx1cmVNb2RlRk1FQShJU0ZhaWx1cmVNb2RlRk1FQSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU0ZhaWx1cmVNb2RlRk1FQUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U0VsZW1lbnQoSUFic3RyYWN0U0VsZW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0VsZW1lbnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNTYWZldHlBbmFseXNpcyhJQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChJQWJzdHJhY3RTU2FmZXR5Q29uY2VwdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0gICAgICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CiAKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRk1FQSA8ZW0+U0ZNRUE8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRk1FQQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTRk1FQUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEgPGVtPlNGTUVBPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZNRUEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0ZNRUFBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQSA8ZW0+U0Jsb2NrIEZNRUE8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTQmxvY2tGTUVBCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNCbG9ja0ZNRUFBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSVNCbG9ja0ZNRUEgPGVtPlNCbG9jayBGTUVBPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0Jsb2NrRk1FQQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTQmxvY2tGTUVBQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUFic3RyYWN0U0ZNRUFFbGVtZW50IDxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JQWJzdHJhY3RTRk1FQUVsZW1lbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTRk1FQUVsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmZtZWEuSUFic3RyYWN0U0ZNRUFFbGVtZW50IDxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JQWJzdHJhY3RTRk1FQUVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTRk1FQUVsZW1lbnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQSA8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTRmFpbHVyZU1vZGVGTUVBQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBIDxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUFBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTRWxlbWVudCA8ZW0+QWJzdHJhY3QgU0VsZW1lbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNFbGVtZW50Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U0VsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U0VsZW1lbnQgPGVtPkFic3RyYWN0IFNFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzIDxlbT5BYnN0cmFjdCBTU2FmZXR5IEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXNBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzIDxlbT5BYnN0cmFjdCBTU2FmZXR5IEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXNBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTU2FmZXR5Q29uY2VwdCA8ZW0+QWJzdHJhY3QgU1NhZmV0eSBDb25jZXB0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTU2FmZXR5Q29uY2VwdAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNTYWZldHlDb25jZXB0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNTYWZldHlDb25jZXB0IDxlbT5BYnN0cmFjdCBTU2FmZXR5IENvbmNlcHQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNTYWZldHlDb25jZXB0CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U1NhZmV0eUNvbmNlcHRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKIH0gLy9FU0ZGTUVBQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvdXRpbC9FU0ZGTUVBU3dpdGNoLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZmbWVhL3V0aWwvRVNGRk1FQVN3aXRjaC5qYXZhCmluZGV4IGU3MjQxNWMuLmExY2UwMzUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmZtZWEvdXRpbC9FU0ZGTUVBU3dpdGNoLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmZm1lYS91dGlsL0VTRkZNRUFTd2l0Y2guamF2YQpAQCAtMzUsMjA2ICszNSwyMDYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEVTRkZNRUFTd2l0Y2g8VD4gZXh0ZW5kcyBTd2l0Y2g8VD4gewotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgSUVTRkZNRUFQYWNrYWdlIG1vZGVsUGFja2FnZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElFU0ZGTUVBUGFja2FnZSBtb2RlbFBhY2thZ2U7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVTRkZNRUFTd2l0Y2goKSB7Ci0gICAgICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWxQYWNrYWdlID0gSUVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVTRkZNRUFTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gSUVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIGVQYWNrYWdlIHRoZSBwYWNrYWdlIGluIHF1ZXN0aW9uLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgc3dpdGNoIGZvciB0aGUgZ2l2ZW4gcGFja2FnZS4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTd2l0Y2hGb3IoRVBhY2thZ2UgZVBhY2thZ2UpIHsKLSAgICAgICAgcmV0dXJuIGVQYWNrYWdlID09IG1vZGVsUGFja2FnZTsKLSAgICB9CisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gZVBhY2thZ2UgdGhlIHBhY2thZ2UgaW4gcXVlc3Rpb24uCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N3aXRjaEZvcihFUGFja2FnZSBlUGFja2FnZSkgeworCQlyZXR1cm4gZVBhY2thZ2UgPT0gbW9kZWxQYWNrYWdlOworCX0KIAotICAgIC8qKgotICAgICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0gICAgICAgIHN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZGTUVBUGFja2FnZS5TRk1FQTogewotICAgICAgICAgICAgICAgIElTRk1FQSBzZm1lYSA9IChJU0ZNRUEpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTRk1FQShzZm1lYSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMoc2ZtZWEpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc2ZtZWEpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNCTE9DS19GTUVBOiB7Ci0gICAgICAgICAgICAgICAgSVNCbG9ja0ZNRUEgc0Jsb2NrRk1FQSA9IChJU0Jsb2NrRk1FQSl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNCbG9ja0ZNRUEoc0Jsb2NrRk1FQSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRk1FQUVsZW1lbnQoc0Jsb2NrRk1FQSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzQmxvY2tGTUVBKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNCbG9ja0ZNRUEpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLkFCU1RSQUNUX1NGTUVBX0VMRU1FTlQ6IHsKLSAgICAgICAgICAgICAgICBJQWJzdHJhY3RTRk1FQUVsZW1lbnQgYWJzdHJhY3RTRk1FQUVsZW1lbnQgPSAoSUFic3RyYWN0U0ZNRUFFbGVtZW50KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRk1FQUVsZW1lbnQoYWJzdHJhY3RTRk1FQUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTRk1FQUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoYWJzdHJhY3RTRk1FQUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGQUlMVVJFX01PREVfRk1FQTogewotICAgICAgICAgICAgICAgIElTRmFpbHVyZU1vZGVGTUVBIHNGYWlsdXJlTW9kZUZNRUEgPSAoSVNGYWlsdXJlTW9kZUZNRUEpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTRmFpbHVyZU1vZGVGTUVBKHNGYWlsdXJlTW9kZUZNRUEpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZNRUFFbGVtZW50KHNGYWlsdXJlTW9kZUZNRUEpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0ZhaWx1cmVNb2RlRk1FQSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzRmFpbHVyZU1vZGVGTUVBKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9CisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgSUVTRkZNRUFQYWNrYWdlLlNGTUVBOiB7CisJCQkJSVNGTUVBIHNmbWVhID0gKElTRk1FQSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNGTUVBKHNmbWVhKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlBbmFseXNpcyhzZm1lYSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzZm1lYSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0JMT0NLX0ZNRUE6IHsKKwkJCQlJU0Jsb2NrRk1FQSBzQmxvY2tGTUVBID0gKElTQmxvY2tGTUVBKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU0Jsb2NrRk1FQShzQmxvY2tGTUVBKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGTUVBRWxlbWVudChzQmxvY2tGTUVBKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNCbG9ja0ZNRUEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0Jsb2NrRk1FQSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuQUJTVFJBQ1RfU0ZNRUFfRUxFTUVOVDogeworCQkJCUlBYnN0cmFjdFNGTUVBRWxlbWVudCBhYnN0cmFjdFNGTUVBRWxlbWVudCA9IChJQWJzdHJhY3RTRk1FQUVsZW1lbnQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGTUVBRWxlbWVudChhYnN0cmFjdFNGTUVBRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChhYnN0cmFjdFNGTUVBRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChhYnN0cmFjdFNGTUVBRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGRk1FQVBhY2thZ2UuU0ZBSUxVUkVfTU9ERV9GTUVBOiB7CisJCQkJSVNGYWlsdXJlTW9kZUZNRUEgc0ZhaWx1cmVNb2RlRk1FQSA9IChJU0ZhaWx1cmVNb2RlRk1FQSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNGYWlsdXJlTW9kZUZNRUEoc0ZhaWx1cmVNb2RlRk1FQSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRk1FQUVsZW1lbnQoc0ZhaWx1cmVNb2RlRk1FQSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzRmFpbHVyZU1vZGVGTUVBKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNGYWlsdXJlTW9kZUZNRUEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGTUVBPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0ZNRUE8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTRk1FQShJU0ZNRUEgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRk1FQTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGTUVBPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU0ZNRUEoSVNGTUVBIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TQmxvY2sgRk1FQTwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCbG9jayBGTUVBPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlU0Jsb2NrRk1FQShJU0Jsb2NrRk1FQSBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCbG9jayBGTUVBPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Jsb2NrIEZNRUE8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTQmxvY2tGTUVBKElTQmxvY2tGTUVBIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0ZNRUEgRWxlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U0ZNRUFFbGVtZW50KElBYnN0cmFjdFNGTUVBRWxlbWVudCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNGTUVBIEVsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRk1FQSBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQWJzdHJhY3RTRk1FQUVsZW1lbnQoSUFic3RyYWN0U0ZNRUFFbGVtZW50IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRmFpbHVyZSBNb2RlIEZNRUE8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTRmFpbHVyZU1vZGVGTUVBKElTRmFpbHVyZU1vZGVGTUVBIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0ZhaWx1cmUgTW9kZSBGTUVBPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU0ZhaWx1cmVNb2RlRk1FQShJU0ZhaWx1cmVNb2RlRk1FQSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0VsZW1lbnQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRWxlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U0VsZW1lbnQoSUFic3RyYWN0U0VsZW1lbnQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRWxlbWVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQWJzdHJhY3RTRWxlbWVudChJQWJzdHJhY3RTRWxlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1NhZmV0eSBBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNTYWZldHkgQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VBYnN0cmFjdFNTYWZldHlBbmFseXNpcyhJQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTU2FmZXR5IEFuYWx5c2lzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1NhZmV0eSBBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzKElBYnN0cmFjdFNTYWZldHlBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1NhZmV0eSBDb25jZXB0PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1NhZmV0eSBDb25jZXB0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChJQWJzdHJhY3RTU2FmZXR5Q29uY2VwdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNTYWZldHkgQ29uY2VwdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNTYWZldHkgQ29uY2VwdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCiB9IC8vRVNGRk1FQVN3aXRjaApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL0lNRVNGRk1FQUZhY3RvcnkuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9JTUVTRkZNRUFGYWN0b3J5LmphdmEKaW5kZXggMDQ2MWZkZC4uZGRlZWYyMiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL0lNRVNGRk1FQUZhY3RvcnkuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvSU1FU0ZGTUVBRmFjdG9yeS5qYXZhCkBAIC0yMCwyMCArMjAsMjAgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTUVTRkZNRUFGYWN0b3J5Ci0gICAgZXh0ZW5kcyBJRVNGRk1FQUZhY3RvcnkgeworCWV4dGVuZHMgSUVTRkZNRUFGYWN0b3J5IHsKIAotICAgIC8qKgotICAgICAqIFNwZWNpYWxpc2UgdGhlIGVJTlNUQU5DRSBpbml0aWFsaXNhdGlvbiB3aXRoIHRoZSBuZXcgaW50ZXJmYWNlIHR5cGUKLSAgICAgKiAob3ZlcnJpZGRlbiBpbiB0aGUgb3ZlcnJpZGVfZmFjdG9yeSBleHRlbnNpb24pLgotICAgICAqLwotICAgIElNRVNGRk1FQUZhY3RvcnkgSU5TVEFOQ0UgPSBNRVNGRk1FQUZhY3RvcnkuaW5pdCgpOworCS8qKgorCSAqIFNwZWNpYWxpc2UgdGhlIGVJTlNUQU5DRSBpbml0aWFsaXNhdGlvbiB3aXRoIHRoZSBuZXcgaW50ZXJmYWNlIHR5cGUKKwkgKiAob3ZlcnJpZGRlbiBpbiB0aGUgb3ZlcnJpZGVfZmFjdG9yeSBleHRlbnNpb24pLgorCSAqLworCUlNRVNGRk1FQUZhY3RvcnkgSU5TVEFOQ0UgPSBNRVNGRk1FQUZhY3RvcnkuaW5pdCgpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgSU1TRk1FQSBjcmVhdGVTRk1FQSgpOworCUBPdmVycmlkZQorCUlNU0ZNRUEgY3JlYXRlU0ZNRUEoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU0Jsb2NrRk1FQSBjcmVhdGVTQmxvY2tGTUVBKCk7CisJQE92ZXJyaWRlCisJSU1TQmxvY2tGTUVBIGNyZWF0ZVNCbG9ja0ZNRUEoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU0ZhaWx1cmVNb2RlRk1FQSBjcmVhdGVTRmFpbHVyZU1vZGVGTUVBKCk7CisJQE92ZXJyaWRlCisJSU1TRmFpbHVyZU1vZGVGTUVBIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEoKTsKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9JTVNCbG9ja0ZNRUEuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9JTVNCbG9ja0ZNRUEuamF2YQppbmRleCAyNmRkOTIyLi43N2MzNGY2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvSU1TQmxvY2tGTUVBLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL0lNU0Jsb2NrRk1FQS5qYXZhCkBAIC0yMCw2ICsyMCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TQmxvY2tGTUVBCi0gICAgZXh0ZW5kcyBJU0Jsb2NrRk1FQSB7CisJZXh0ZW5kcyBJU0Jsb2NrRk1FQSB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9JTVNGTUVBLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvSU1TRk1FQS5qYXZhCmluZGV4IGU0ZmI2ZDIuLjQ4NTAzYzcgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9JTVNGTUVBLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL0lNU0ZNRUEuamF2YQpAQCAtMjAsNiArMjAsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU0ZNRUEKLSAgICBleHRlbmRzIElTRk1FQSB7CisJZXh0ZW5kcyBJU0ZNRUEgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvSU1TRmFpbHVyZU1vZGVGTUVBLmphdmEgYi9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvSU1TRmFpbHVyZU1vZGVGTUVBLmphdmEKaW5kZXggMjI3N2U4NS4uZjhjOGU0YyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL0lNU0ZhaWx1cmVNb2RlRk1FQS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9JTVNGYWlsdXJlTW9kZUZNRUEuamF2YQpAQCAtMjAsNiArMjAsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU0ZhaWx1cmVNb2RlRk1FQQotICAgIGV4dGVuZHMgSVNGYWlsdXJlTW9kZUZNRUEgeworCWV4dGVuZHMgSVNGYWlsdXJlTW9kZUZNRUEgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvaW1wbC9NRVNGRk1FQUZhY3RvcnkuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9pbXBsL01FU0ZGTUVBRmFjdG9yeS5qYXZhCmluZGV4IGZmNzU2OTkuLjI2MWFiZTAgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9pbXBsL01FU0ZGTUVBRmFjdG9yeS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9pbXBsL01FU0ZGTUVBRmFjdG9yeS5qYXZhCkBAIC0zMiw0OSArMzIsNDkgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIE1FU0ZGTUVBRmFjdG9yeQotICAgIGV4dGVuZHMgRVNGRk1FQUZhY3RvcnkKLSAgICBpbXBsZW1lbnRzIElNRVNGRk1FQUZhY3RvcnkgeworCWV4dGVuZHMgRVNGRk1FQUZhY3RvcnkKKwlpbXBsZW1lbnRzIElNRVNGRk1FQUZhY3RvcnkgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTUVTRkZNRUFGYWN0b3J5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBNRVNGRk1FQUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgaW5pdGlhbGlzZWQgZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSU1FU0ZGTUVBRmFjdG9yeSBpbml0KCkgewotICAgICAgICBJRVNGRk1FQUZhY3RvcnkgdkZhY3RvcnkgPSBFU0ZGTUVBRmFjdG9yeS5pbml0KCk7CisJLyoqCisJICogQHJldHVybiBUaGUgaW5pdGlhbGlzZWQgZmFjdG9yeQorCSAqLworCXB1YmxpYyBzdGF0aWMgSU1FU0ZGTUVBRmFjdG9yeSBpbml0KCkgeworCQlJRVNGRk1FQUZhY3RvcnkgdkZhY3RvcnkgPSBFU0ZGTUVBRmFjdG9yeS5pbml0KCk7CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZhY3RvcnkgcmV0dXJuZWQgYnkgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGNhbiBzdWl0LAotICAgICAgICAvLyBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IGluc3RhbmNlCi0gICAgICAgIGlmICghKHZGYWN0b3J5IGluc3RhbmNlb2YgSU1FU0ZGTUVBRmFjdG9yeSkpIHsKLSAgICAgICAgICAgIHZGYWN0b3J5ID0gbmV3IE1FU0ZGTUVBRmFjdG9yeSgpOwotICAgICAgICB9CisJCS8vIENoZWNrIGlmIHRoZSBmYWN0b3J5IHJldHVybmVkIGJ5IHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBjYW4gc3VpdCwKKwkJLy8gb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQorCQlpZiAoISh2RmFjdG9yeSBpbnN0YW5jZW9mIElNRVNGRk1FQUZhY3RvcnkpKSB7CisJCQl2RmFjdG9yeSA9IG5ldyBNRVNGRk1FQUZhY3RvcnkoKTsKKwkJfQogCi0gICAgICAgIHJldHVybiAoSU1FU0ZGTUVBRmFjdG9yeSkgdkZhY3Rvcnk7Ci0gICAgfQorCQlyZXR1cm4gKElNRVNGRk1FQUZhY3RvcnkpIHZGYWN0b3J5OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TRk1FQSBjcmVhdGVTRk1FQSgpIHsKLSAgICAgICAgSU1TRk1FQSB2Rk1FQSA9IG5ldyBNU0ZNRUEoKTsKLSAgICAgICAgcmV0dXJuIHZGTUVBOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU0ZNRUEgY3JlYXRlU0ZNRUEoKSB7CisJCUlNU0ZNRUEgdkZNRUEgPSBuZXcgTVNGTUVBKCk7CisJCXJldHVybiB2Rk1FQTsKKwl9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TQmxvY2tGTUVBIGNyZWF0ZVNCbG9ja0ZNRUEoKSB7Ci0gICAgICAgIElNU0Jsb2NrRk1FQSB2U0Jsb2NrRk1FQSA9IG5ldyBNU0Jsb2NrRk1FQSgpOwotICAgICAgICByZXR1cm4gdlNCbG9ja0ZNRUE7Ci0gICAgfQorCUBPdmVycmlkZQorCXB1YmxpYyBJTVNCbG9ja0ZNRUEgY3JlYXRlU0Jsb2NrRk1FQSgpIHsKKwkJSU1TQmxvY2tGTUVBIHZTQmxvY2tGTUVBID0gbmV3IE1TQmxvY2tGTUVBKCk7CisJCXJldHVybiB2U0Jsb2NrRk1FQTsKKwl9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TRmFpbHVyZU1vZGVGTUVBIGNyZWF0ZVNGYWlsdXJlTW9kZUZNRUEoKSB7Ci0gICAgICAgIElNU0ZhaWx1cmVNb2RlRk1FQSB2U0ZhaWx1cmVNb2RlRk1FQSA9IG5ldyBNU0ZhaWx1cmVNb2RlRk1FQSgpOwotICAgICAgICByZXR1cm4gdlNGYWlsdXJlTW9kZUZNRUE7Ci0gICAgfQorCUBPdmVycmlkZQorCXB1YmxpYyBJTVNGYWlsdXJlTW9kZUZNRUEgY3JlYXRlU0ZhaWx1cmVNb2RlRk1FQSgpIHsKKwkJSU1TRmFpbHVyZU1vZGVGTUVBIHZTRmFpbHVyZU1vZGVGTUVBID0gbmV3IE1TRmFpbHVyZU1vZGVGTUVBKCk7CisJCXJldHVybiB2U0ZhaWx1cmVNb2RlRk1FQTsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvaW1wbC9NU0Jsb2NrRk1FQS5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2ltcGwvTVNCbG9ja0ZNRUEuamF2YQppbmRleCA5ZjQ5NDIwLi40YTBmOGFjIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvaW1wbC9NU0Jsb2NrRk1FQS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9pbXBsL01TQmxvY2tGTUVBLmphdmEKQEAgLTMxLDc3ICszMSw3NyBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNCbG9ja0ZNRUEKLSAgICBleHRlbmRzIFNCbG9ja0ZNRUEKLSAgICBpbXBsZW1lbnRzIElNU0Jsb2NrRk1FQSB7CisJZXh0ZW5kcyBTQmxvY2tGTUVBCisJaW1wbGVtZW50cyBJTVNCbG9ja0ZNRUEgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNCbG9ja0ZNRUEoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TQmxvY2tGTUVBKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ2xhc3MoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ2xhc3MoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9DbGFzcygpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9DbGFzcygpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDcml0aWNhbGl0eSgpIHsKLSAgICAgICAgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IHZTRmFpbHVyZU1vZGVzRk1FQUxpc3QgPSBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKLSAgICAgICAgaW50IHZIaWdoZXN0Q3JpdGljYWxpdHkgPSAwOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldENyaXRpY2FsaXR5KCkgeworCQlFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gdlNGYWlsdXJlTW9kZXNGTUVBTGlzdCA9IGdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpOworCQlpbnQgdkhpZ2hlc3RDcml0aWNhbGl0eSA9IDA7CiAKLSAgICAgICAgaWYgKCF2U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChJU0ZhaWx1cmVNb2RlRk1FQSB2U0ZhaWx1cmVNb2RlRk1FQSA6IHZTRmFpbHVyZU1vZGVzRk1FQUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpbnQgdkNyaXRpY2FsaXR5Rk0gPSB2U0ZhaWx1cmVNb2RlRk1FQS5nZXRGaW5hbENyaXRpY2FsaXR5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZIaWdoZXN0Q3JpdGljYWxpdHkgPCB2Q3JpdGljYWxpdHlGTSkgewotICAgICAgICAgICAgICAgICAgICB2SGlnaGVzdENyaXRpY2FsaXR5ID0gdkNyaXRpY2FsaXR5Rk07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2SGlnaGVzdENyaXRpY2FsaXR5OwotICAgIH0KKwkJaWYgKCF2U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0LmlzRW1wdHkoKSkgeworCQkJZm9yIChJU0ZhaWx1cmVNb2RlRk1FQSB2U0ZhaWx1cmVNb2RlRk1FQSA6IHZTRmFpbHVyZU1vZGVzRk1FQUxpc3QpIHsKKwkJCQlpbnQgdkNyaXRpY2FsaXR5Rk0gPSB2U0ZhaWx1cmVNb2RlRk1FQS5nZXRGaW5hbENyaXRpY2FsaXR5KCk7CisJCQkJaWYgKHZIaWdoZXN0Q3JpdGljYWxpdHkgPCB2Q3JpdGljYWxpdHlGTSkgeworCQkJCQl2SGlnaGVzdENyaXRpY2FsaXR5ID0gdkNyaXRpY2FsaXR5Rk07CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB2SGlnaGVzdENyaXRpY2FsaXR5OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IGdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IHZTRmFpbHVyZU1vZGVzRk1FQUxpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4oKTsKLSAgICAgICAgQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkgeworCQlFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gdlNGYWlsdXJlTW9kZXNGTUVBTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTRmFpbHVyZU1vZGVGTUVBPigpOworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXRyaWV2ZSBhbGwgU1BvcnRzTEFuYWx5c2lzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNGYWlsdXJlTW9kZUZNRUEuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNGTUVBTGlzdC5hZGQoKElTRmFpbHVyZU1vZGVGTUVBKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCS8qKgorCQkJICogUmV0cmlldmUgYWxsIFNQb3J0c0xBbmFseXNpcy4KKwkJCSAqLworCQkJZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzKTsKKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZTRmFpbHVyZU1vZGVzRk1FQUxpc3QuYWRkKChJU0ZhaWx1cmVNb2RlRk1FQSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IHZVU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTRmFpbHVyZU1vZGVGTUVBPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrRk1FQV9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKSwKLSAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzRk1FQUxpc3Quc2l6ZSgpLAotICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNGTUVBTGlzdC50b0FycmF5KCkpOwotICAgICAgICByZXR1cm4gdlVTRmFpbHVyZU1vZGVzRk1FQUxpc3Q7Ci0gICAgfQorCQlVbm1vZGlmaWFibGVFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gdlVTRmFpbHVyZU1vZGVzRk1FQUxpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+KAorCQkJdGhpcywKKwkJCUVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTQmxvY2tGTUVBX1NGYWlsdXJlTW9kZXNGTUVBTGlzdCgpLAorCQkJdlNGYWlsdXJlTW9kZXNGTUVBTGlzdC5zaXplKCksCisJCQl2U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0LnRvQXJyYXkoKSk7CisJCXJldHVybiB2VVNGYWlsdXJlTW9kZXNGTUVBTGlzdDsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9pbXBsL01TRk1FQS5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2ltcGwvTVNGTUVBLmphdmEKaW5kZXggYjlmMDlhMy4uN2ZiNDVmYyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2ltcGwvTVNGTUVBLmphdmEKKysrIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2ltcGwvTVNGTUVBLmphdmEKQEAgLTMxLDU3ICszMSw1NyBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNGTUVBCi0gICAgZXh0ZW5kcyBTRk1FQQotICAgIGltcGxlbWVudHMgSU1TRk1FQSB7CisJZXh0ZW5kcyBTRk1FQQorCWltcGxlbWVudHMgSU1TRk1FQSB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNU0ZNRUEoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TRk1FQSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX1BhY2thZ2UoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUGFja2FnZSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1BhY2thZ2UoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUGFja2FnZSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTQmxvY2tGTUVBPiBnZXRTQmxvY2tzRk1FQUxpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElTQmxvY2tGTUVBPiB2U1NCbG9ja3NGTUVBTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTQmxvY2tGTUVBPigpOwotICAgICAgICBQYWNrYWdlIHZCYXNlID0gZ2V0QmFzZV9QYWNrYWdlKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU0Jsb2NrRk1FQT4gZ2V0U0Jsb2Nrc0ZNRUFMaXN0KCkgeworCQlFTGlzdDxJU0Jsb2NrRk1FQT4gdlNTQmxvY2tzRk1FQUxpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0Jsb2NrRk1FQT4oKTsKKwkJUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNCbG9ja0ZNRUEuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNTQmxvY2tzRk1FQUxpc3QuYWRkKChJU0Jsb2NrRk1FQSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNCbG9ja0ZNRUEuY2xhc3MpOworCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlNTQmxvY2tzRk1FQUxpc3QuYWRkKChJU0Jsb2NrRk1FQSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNCbG9ja0ZNRUE+IHZVU1NCbG9ja3NGTUVBTGlzdCA9Ci0gICAgICAgICAgICBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNCbG9ja0ZNRUE+KAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgRVNGRk1FQVBhY2thZ2UuZUlOU1RBTkNFLmdldFNGTUVBX1NCbG9ja3NGTUVBTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTU0Jsb2Nrc0ZNRUFMaXN0LnNpemUoKSwKLSAgICAgICAgICAgICAgICB2U1NCbG9ja3NGTUVBTGlzdC50b0FycmF5KCkpOworCQlVbm1vZGlmaWFibGVFTGlzdDxJU0Jsb2NrRk1FQT4gdlVTU0Jsb2Nrc0ZNRUFMaXN0ID0KKwkJCW5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU0Jsb2NrRk1FQT4oCisJCQkJdGhpcywKKwkJCQlFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZNRUFfU0Jsb2Nrc0ZNRUFMaXN0KCksCisJCQkJdlNTQmxvY2tzRk1FQUxpc3Quc2l6ZSgpLAorCQkJCXZTU0Jsb2Nrc0ZNRUFMaXN0LnRvQXJyYXkoKSk7CiAKLSAgICAgICAgcmV0dXJuIHZVU1NCbG9ja3NGTUVBTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNTQmxvY2tzRk1FQUxpc3Q7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvaW1wbC9NU0ZhaWx1cmVNb2RlRk1FQS5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL2ltcGwvTVNGYWlsdXJlTW9kZUZNRUEuamF2YQppbmRleCBjNDgxNzZmLi4xM2Y3MGNmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvaW1wbC9NU0ZhaWx1cmVNb2RlRk1FQS5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9pbXBsL01TRmFpbHVyZU1vZGVGTUVBLmphdmEKQEAgLTI3LDcyICsyNyw3MiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNGYWlsdXJlTW9kZUZNRUEKLSAgICBleHRlbmRzIFNGYWlsdXJlTW9kZUZNRUEKLSAgICBpbXBsZW1lbnRzIElNU0ZhaWx1cmVNb2RlRk1FQSB7CisJZXh0ZW5kcyBTRmFpbHVyZU1vZGVGTUVBCisJaW1wbGVtZW50cyBJTVNGYWlsdXJlTW9kZUZNRUEgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNGYWlsdXJlTW9kZUZNRUEoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TRmFpbHVyZU1vZGVGTUVBKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUHJvcGVydHkoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUHJvcGVydHkoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTQmxvY2tGTUVBIGJhc2ljR2V0U0Jsb2NrRk1FQSgpIHsKLSAgICAgICAgUHJvcGVydHkgdkJhc2UgPSBnZXRCYXNlX1Byb3BlcnR5KCk7Ci0gICAgICAgIElTQmxvY2tGTUVBIHZTQmxvY2tGTUVBID0gbnVsbDsKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdk93bmVyID0gdkJhc2UuZ2V0T3duZXIoKTsKLSAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNCbG9ja0ZNRUEuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZTQmxvY2tGTUVBID0gKElTQmxvY2tGTUVBKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U0Jsb2NrRk1FQTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0Jsb2NrRk1FQSBiYXNpY0dldFNCbG9ja0ZNRUEoKSB7CisJCVByb3BlcnR5IHZCYXNlID0gZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCQlJU0Jsb2NrRk1FQSB2U0Jsb2NrRk1FQSA9IG51bGw7CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlFbGVtZW50IHZPd25lciA9IHZCYXNlLmdldE93bmVyKCk7CisJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2T3duZXIsIElTQmxvY2tGTUVBLmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2U0Jsb2NrRk1FQSA9IChJU0Jsb2NrRk1FQSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdlNCbG9ja0ZNRUE7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0RmluYWxDcml0aWNhbGl0eSgpIHsKLSAgICAgICAgaW50IHZGaW5hbENyaXRpY2FsaXR5ID0gZ2V0RmluYWxTZXZlcml0eSgpICogZ2V0RmluYWxPY2N1cmVuY2UoKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXRGaW5hbENyaXRpY2FsaXR5KCkgeworCQlpbnQgdkZpbmFsQ3JpdGljYWxpdHkgPSBnZXRGaW5hbFNldmVyaXR5KCkgKiBnZXRGaW5hbE9jY3VyZW5jZSgpOwogCi0gICAgICAgIGlmIChpc0RldGVjdGFibGUpIHsKLSAgICAgICAgICAgIHZGaW5hbENyaXRpY2FsaXR5ICo9IGdldEZpbmFsRGV0ZWN0YWJpbGl0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2RmluYWxDcml0aWNhbGl0eTsKLSAgICB9CisJCWlmIChpc0RldGVjdGFibGUpIHsKKwkJCXZGaW5hbENyaXRpY2FsaXR5ICo9IGdldEZpbmFsRGV0ZWN0YWJpbGl0eSgpOworCQl9CisJCXJldHVybiB2RmluYWxDcml0aWNhbGl0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbml0aWFsQ3JpdGljYWxpdHkoKSB7Ci0gICAgICAgIGludCB2SW5pdGlhbENyaXRpY2FsaXR5ID0gZ2V0SW5pdGlhbFNldmVyaXR5KCkgKiBnZXRJbml0aWFsT2NjdXJlbmNlKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbENyaXRpY2FsaXR5KCkgeworCQlpbnQgdkluaXRpYWxDcml0aWNhbGl0eSA9IGdldEluaXRpYWxTZXZlcml0eSgpICogZ2V0SW5pdGlhbE9jY3VyZW5jZSgpOwogCi0gICAgICAgIGlmIChpc0RldGVjdGFibGUpIHsKLSAgICAgICAgICAgIHZJbml0aWFsQ3JpdGljYWxpdHkgKj0gZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdkluaXRpYWxDcml0aWNhbGl0eTsKLSAgICB9CisJCWlmIChpc0RldGVjdGFibGUpIHsKKwkJCXZJbml0aWFsQ3JpdGljYWxpdHkgKj0gZ2V0SW5pdGlhbERldGVjdGFiaWxpdHkoKTsKKwkJfQorCQlyZXR1cm4gdkluaXRpYWxDcml0aWNhbGl0eTsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS9FU0ZGTUVBUHJvZmlsZUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvRVNGRk1FQVByb2ZpbGVBY3RpdmF0b3IuamF2YQppbmRleCA2ZDVjNmMzLi41ZDkyMGRhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS9FU0ZGTUVBUHJvZmlsZUFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL0VTRkZNRUFQcm9maWxlQWN0aXZhdG9yLmphdmEKQEAgLTIzLDg1ICsyMyw4NSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxODMgJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGRk1FQVByb2ZpbGVBY3RpdmF0b3IKLSAgICBleHRlbmRzIEVNRlBsdWdpbgotICAgIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKKwlleHRlbmRzIEVNRlBsdWdpbgorCWltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkZNRUFQcm9maWxlQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFQcm9maWxlQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQVByb2ZpbGVBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGRk1FQVByb2ZpbGVBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZGTUVBUHJvZmlsZUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGRk1FQVByb2ZpbGVBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IEJ1bmRsZXhDb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBCdW5kbGVDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKIAotICAgICAgICAvLyBNYW51YWxseSBjcmVhdGUgdGhlIHBsdWdpbiBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzUGx1Z2luID0gbmV3IEltcGxlbWVudGF0aW9uKCk7Ci0gICAgfQorCQkvLyBNYW51YWxseSBjcmVhdGUgdGhlIHBsdWdpbiBpbXBsZW1lbnRhdGlvbgorCQlzUGx1Z2luID0gbmV3IEltcGxlbWVudGF0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBudWxsOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0gICAgfQorCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS9zZXQvRVNGRk1FQVNldC5qYXZhIGIvYW5hbHlzaXMvZm1lYS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Byb2ZpbGUvc2V0L0VTRkZNRUFTZXQuamF2YQppbmRleCBmYTRmYTliLi42MTliNjA5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvcHJvZmlsZS9zZXQvRVNGRk1FQVNldC5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9wcm9maWxlL3NldC9FU0ZGTUVBU2V0LmphdmEKQEAgLTE4LDE4ICsxOCwxOCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjkgJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGRk1FQVNldCB7Ci0gICAgLyoqIEVTRkZNRUEgcHJvZmlsZSBwYXRoLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfUEFUSCA9Ci0gICAgICAgICJwYXRobWFwOi8vRVNGRk1FQV9QUk9GSUxFL2VzZmZtZWEucHJvZmlsZS51bWwiOyAvLyROT04tTkxTLTEkCisJLyoqIEVTRkZNRUEgcHJvZmlsZSBwYXRoLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfUEFUSCA9CisJCSJwYXRobWFwOi8vRVNGRk1FQV9QUk9GSUxFL2VzZmZtZWEucHJvZmlsZS51bWwiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogRVNGRk1FQSBwcm9maWxlIFVSSS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX1VSSSA9Ci0gICAgICAgICJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGRk1FQSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogRVNGRk1FQSBwcm9maWxlIFVSSS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX1VSSSA9CisJCSJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGRk1FQSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFU0ZGTUVBU2V0KCkgewotICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCisJICovCisJcHJpdmF0ZSBFU0ZGTUVBU2V0KCkgeworCSAvLyBOb3RoaW5nIHRvIGRvCisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlbGVuZy9idWlsZC5wcm9wZXJ0aWVzIGIvYW5hbHlzaXMvZm1lYS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlbGVuZy9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDk0YmI4ODMuLjNkNDViNGYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZWxlbmcvYnVpbGQucHJvcGVydGllcworKysgYi9hbmFseXNpcy9mbWVhL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmZtZWEucmVsZW5nL2J1aWxkLnByb3BlcnRpZXMKQEAgLTEsNCArMSw0IEBACiBiaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCiAgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAogICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAorICAgICAgICAgICAgICAgZXBsLXYyMC5odG1sCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmZtZWEucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcyBiL2FuYWx5c2lzL2ZtZWEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZWxlbmcvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDAxNDQzOWEuLjJkMzMyYWUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZWxlbmcvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL2FuYWx5c2lzL2ZtZWEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZWxlbmcvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xLDE2ICsxLDE3IEBACi1mZWF0dXJlTmFtZSA9IEVTRiBGTUVBIChJbmN1YmF0aW9uKQorZmVhdHVyZU5hbWUgPSBFU0YgQ29yZSAoTWFuZGF0b3J5KSAoSW5jdWJhdGlvbikKIHByb3ZpZGVyTmFtZSA9IFBvbGFyU3lzCi1kZXNjcmlwdGlvbiA9IEZNRUEgZmVhdHVyZSBvZiBFU0YuIChJbmN1YmF0aW9uKQorZGVzY3JpcHRpb24gPSBUZWNobmljYWwgQ29yZSBmZWF0dXJlIG9mIEVTRiAoTWFuZGF0b3J5KS4gKEluY3ViYXRpb24pCiBjb3B5cmlnaHQ9XAogQ29weXJpZ2h0IChjKSAyMDE2IEFMTDRURUMgJiBDRUEgTElTVC5cblwKIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wXG5cCiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK2h0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG5cCiBcblwKIENvbnRyaWJ1dG9yczpcblwKICAgICBKb25hdGhhbiBEdW1vbnQgKEFMTDRURUMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCisgICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuXAorCUFuc2dhciBSYWRlcm1hY2hlciAoQ0VBIExJU1QpIC0gdXBncmFkZSB0byAyMDE4LTEyIGFuZCBpbXByb3ZlbWVudHNcbgogbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKIGxpY2Vuc2U9XAogRWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKQEAgLTI5LDggKzMwLDggQEAKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wXG5cCi0oIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMFxuXAorKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKIENvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlNcblwKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZWxlbmcvbGljZW5zZS5odG1sIGIvYW5hbHlzaXMvZm1lYS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlbGVuZy9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uNjM3YTE4MSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlbGVuZy9saWNlbnNlLmh0bWwKKysrIGIvYW5hbHlzaXMvZm1lYS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlbGVuZy9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDMwMCBAQAogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIDx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAyLjA8L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsKKyAgICAgICAgbWFyZ2luOiAxLjVlbSAzZW07CisgICAgICB9CisgICAgICBoMXsKKyAgICAgICAgZm9udC1zaXplOjEuNWVtOworICAgICAgfQorICAgICAgaDJ7CisgICAgICAgIGZvbnQtc2l6ZToxZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206MC41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MWVtOworICAgICAgfQorICAgICAgcCB7CisgICAgICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgICB9CisgICAgICB1bCwgb2x7CisgICAgICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDIuMDwvaDE+CisgICAgPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICAgIFBVQkxJQyBMSUNFTlNFICgmbGRxdW87QUdSRUVNRU5UJnJkcXVvOykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICAgIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCYjMDM5O1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkZWZpbml0aW9ucyI+MS4gREVGSU5JVElPTlM8L2gyPgorICAgIDxwPiZsZHF1bztDb250cmlidXRpb24mcmRxdW87IG1lYW5zOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvbnRlbnQKKyAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgICAgICAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICAgICAgICZsZHF1bztvcmlnaW5hdGVzJnJkcXVvOyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvciYjMDM5O3MgYmVoYWxmLgorICAgICAgICBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGNoYW5nZXMgb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHRoYXQKKyAgICAgICAgYXJlIG5vdCBNb2RpZmllZCBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0b3ImcmRxdW87IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9wPgorICAgIDxwPiZsZHF1bztMaWNlbnNlZCBQYXRlbnRzJnJkcXVvOyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCisgICAgICBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCisgICAgICBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztQcm9ncmFtJnJkcXVvOyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBEaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworICAgICAgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UmVjaXBpZW50JnJkcXVvOyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICBvciBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UgKGFzIGFwcGxpY2FibGUpLCBpbmNsdWRpbmcgQ29udHJpYnV0b3JzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGVyaXZhdGl2ZSBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgUHJvZ3JhbSBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztNb2RpZmllZCBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yayBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtIHRoYXQKKyAgICAgIHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZQorICAgICAgY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCisgICAgICBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgY29udGFpbnMgYW55IGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLiBNb2RpZmllZAorICAgICAgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCBjb250YWluIG9ubHkgZGVjbGFyYXRpb25zLCBpbnRlcmZhY2VzLAorICAgICAgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseSBpbiBlYWNoIGNhc2UKKyAgICAgIGluIG9yZGVyIHRvIGxpbmsgdG8sIGJpbmQgYnkgbmFtZSwgb3Igc3ViY2xhc3MgdGhlIFByb2dyYW0gb3IgTW9kaWZpZWQKKyAgICAgIFdvcmtzIHRoZXJlb2YuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEaXN0cmlidXRlJnJkcXVvOyBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQorICAgICAgaW4gYW55IG1hbm5lciB0aGF0IGVuYWJsZXMgdGhlIHRyYW5zZmVyIG9mIGEgY29weS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NvdXJjZSBDb2RlJnJkcXVvOyBtZWFucyB0aGUgZm9ybSBvZiBhIFByb2dyYW0gcHJlZmVycmVkIGZvciBtYWtpbmcKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCisgICAgICBkb2N1bWVudGF0aW9uIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTZWNvbmRhcnkgTGljZW5zZSZyZHF1bzsgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICAgIFZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CisgICAgICBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXMgaWRlbnRpZmllZCBieSB0aGUgaW5pdGlhbAorICAgICAgQ29udHJpYnV0b3IuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ3JhbnQtb2YtcmlnaHRzIj4yLiBHUkFOVCBPRiBSSUdIVFM8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAorICAgICAgICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgICBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICAgICAgICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICAgICAgICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgICAgICAgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICAgICAgICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsCisgICAgICAgIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCisgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorICAgICAgICBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkKKyAgICAgICAgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyCisgICAgICAgIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCisgICAgICAgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgICAgICAgIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorICAgICAgICBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LgorICAgICAgICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgICAgICAgIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCisgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cworICAgICAgICBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwKKyAgICAgICAgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0bworICAgICAgICBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50JiMwMzk7cworICAgICAgICByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50CisgICAgICAgIGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorICAgICAgPC9saT4KKyAgICAgIDxsaT5lKSBOb3R3aXRoc3RhbmRpbmcgdGhlIHRlcm1zIG9mIGFueSBTZWNvbmRhcnkgTGljZW5zZSwgbm8gQ29udHJpYnV0b3IKKyAgICAgICAgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbiB0aG9zZSBzZXQgZm9ydGgKKyAgICAgICAgaW4gdGhpcyBBZ3JlZW1lbnQpIGFzIGEgcmVzdWx0IG9mIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByZWNlaXB0IG9mIHRoZQorICAgICAgICBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlIChpZiBwZXJtaXR0ZWQgdW5kZXIKKyAgICAgICAgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMykuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPjMuIFJFUVVJUkVNRU5UUzwvaDI+CisgICAgPHA+My4xIElmIGEgQ29udHJpYnV0b3IgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0gaW4gYW55IGZvcm0sIHRoZW46PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSB0aGUgUHJvZ3JhbSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMgU291cmNlIENvZGUsIGluCisgICAgICAgIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDMuMiwgYW5kIHRoZSBDb250cmlidXRvciBtdXN0IGFjY29tcGFueQorICAgICAgICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICAgICAgICBpcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZCBpbmZvcm1zIFJlY2lwaWVudHMgaG93IHRvCisgICAgICAgIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICAgICAgICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsCisgICAgICAgICAgICBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paWkpIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMmIzAzOTsgcmlnaHRzIGluIHRoZQorICAgICAgICAgICAgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPml2KSByZXF1aXJlcyBhbnkgc3Vic2VxdWVudCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYW55IHBhcnR5CisgICAgICAgICAgICB0byBiZSB1bmRlciBhIGxpY2Vuc2UgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIHNlY3Rpb24gMy4KKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgb3IgaWYgdGhlIFByb2dyYW0gKGkpCisgICAgICAgIGlzIGNvbWJpbmVkIHdpdGggb3RoZXIgbWF0ZXJpYWwgaW4gYSBzZXBhcmF0ZSBmaWxlIG9yIGZpbGVzIG1hZGUgYXZhaWxhYmxlCisgICAgICAgIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGF0dGFjaGVkIHRvCisgICAgICAgIHRoZSBTb3VyY2UgQ29kZSB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiBFeGhpYml0IEEgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICAgIHRoZW4gdGhlIFByb2dyYW0gbWF5IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoCisgICAgICAgIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLAorICAgICAgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eQorICAgICAgKCZsc3F1bztub3RpY2VzJnJzcXVvOykgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mIHRoZSBQcm9ncmFtIHdoaWNoCisgICAgICB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQgdGhlaXIgb3duIGFwcHJvcHJpYXRlCisgICAgICBub3RpY2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImNvbW1lcmNpYWwtZGlzdHJpYnV0aW9uIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvaDI+CisgICAgPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKKyAgICAgIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcworICAgICAgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCisgICAgICBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkCisgICAgICBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIKKyAgICAgIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEKKyAgICAgIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJmxkcXVvO0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcmRxdW87KQorICAgICAgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgorICAgICAgKCZsZHF1bztJbmRlbW5pZmllZCBDb250cmlidXRvciZyZHF1bzspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKKyAgICAgIChjb2xsZWN0aXZlbHkgJmxkcXVvO0xvc3NlcyZyZHF1bzspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCisgICAgICBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudAorICAgICAgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbgorICAgICAgd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLgorICAgICAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcKKyAgICAgIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0bworICAgICAgcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorICAgICAgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLAorICAgICAgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQKKyAgICAgIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisgICAgPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0KKyAgICAgIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorICAgICAgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zCisgICAgICBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJiMwMzk7cyByZXNwb25zaWJpbGl0eSBhbG9uZS4KKyAgICAgIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zCisgICAgICBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCisgICAgICB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzCisgICAgICBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJ3YXJyYW50eSI+NS4gTk8gV0FSUkFOVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmbGRxdW87QVMgSVMmcmRxdW87IEJBU0lTLCBXSVRIT1VUCisgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorICAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlCisgICAgICByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZQorICAgICAgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgorICAgICAgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGlzY2xhaW1lciI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWQorICAgICAgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCisgICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAgICAgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCisgICAgICBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ2VuZXJhbCI+Ny4gR0VORVJBTDwvaDI+CisgICAgPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKKyAgICAgIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUKKyAgICAgIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZQorICAgICAgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudAorICAgICAgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorICAgIDwvcD4KKyAgICA8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgorICAgICAgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKKyAgICAgIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByaWdodHMgZ3JhbnRlZAorICAgICAgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgICAgPC9wPgorICAgIDxwPkFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KKyAgICAgIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQKKyAgICAgIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZworICAgICAgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQorICAgICAgYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQmIzAzOTtzIG9ibGlnYXRpb25zIHVuZGVyCisgICAgICB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZQorICAgICAgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKyAgICA8L3A+CisgICAgPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5CisgICAgICBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMKKyAgICAgIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodAorICAgICAgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudAorICAgICAgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcworICAgICAgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mCisgICAgICB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyAgICAgIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uCisgICAgICBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3CisgICAgICB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZQorICAgICAgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorICAgIDwvcD4KKyAgICA8cD5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKKyAgICAgIHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorICAgICAgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKKyAgICAgIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKKyAgICAgIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAorICAgICAgdG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KKyAgICAgIE5vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJleGhpYml0LWEiPkV4aGliaXQgQSAmbmRhc2g7IEZvcm0gb2YgU2Vjb25kYXJ5IExpY2Vuc2VzIE5vdGljZTwvaDI+CisgICAgPHA+JmxkcXVvO1RoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyAKKyAgICAJU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCAKKyAgICAJaW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAorICAgIAl2ZXJzaW9uKHMpLCBhbmQgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGhlcmV9LiZyZHF1bzsKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5TaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgICAgICAgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIHVuZGVyIFNlY29uZGFyeSBMaWNlbnNlcy4KKyAgICAgIDwvcD4KKyAgICAgIDxwPklmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIGZpbGUsCisgICAgICAgIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UgZmlsZSBpbiBhCisgICAgICAgIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yCisgICAgICAgIHN1Y2ggYSBub3RpY2UuCisgICAgICA8L3A+CisgICAgICA8cD5Zb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC48L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlc291cmNlcy5ncmFwaGljYWwvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2ZtZWEvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZXNvdXJjZXMuZ3JhcGhpY2FsL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlc291cmNlcy5ncmFwaGljYWwvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9mbWVhL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLmZtZWEucmVzb3VyY2VzLmdyYXBoaWNhbC9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLmZtZWEucmVzb3VyY2VzLmdyYXBoaWNhbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS9yZXNvdXJjZXMvZ3JhcGhpY2FsL0VTRkZNRUFSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2ZtZWEvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCmluZGV4IDgwODNlN2MuLjhmZDdiYTEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCkBAIC0yMiwxMDEgKzIyLDEwMSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwlleHRlbmRzIEVNRlBsdWdpbiB7CiAKLSAgICAvKiogVGhlIHBsdWctaW4gSUQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5wb2xhcnN5cy5lc2YuZm1lYS5yZXNvdXJjZXMuZ3JhcGhpY2FsIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBUaGUgcGx1Zy1pbiBJRC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLnBvbGFyc3lzLmVzZi5mbWVhLnJlc291cmNlcy5ncmFwaGljYWwiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGlzIHNpbmdsZXRvbiBhY3RpdmF0b3IuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvciBJTlNUQU5DRSA9Ci0gICAgICAgIG5ldyBFU0ZGTUVBUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhpcyBzaW5nbGV0b24gYWN0aXZhdG9yLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTRkZNRUFSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IgSU5TVEFOQ0UgPQorCQluZXcgRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcigpOwogCi0gICAgLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGRk1FQVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIEVTRkZNRUFSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBXYXJuaW5nIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIFdhcm5pbmcgc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2ZtZWEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnRhYmxlL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2ZtZWEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnRhYmxlL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvZm1lYS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvZm1lYS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvdGFibGUvRVNGRk1FQVRhYmxlQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9FU0ZGTUVBVGFibGVBY3RpdmF0b3IuamF2YQppbmRleCBlNTM3ZWVjLi4xNjU5OWJmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9FU0ZGTUVBVGFibGVBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9FU0ZGTUVBVGFibGVBY3RpdmF0b3IuamF2YQpAQCAtMjQsMTM1ICsyNCwxMzUgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIEVTRkZNRUFUYWJsZUFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luCi0gICAgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCWV4dGVuZHMgRU1GUGx1Z2luCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIFRoZSBwbHVnLWluIElELiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUiOyAvLyROT04tTkxTLTEkCisJLyoqIFRoZSBwbHVnLWluIElELiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogVGhlIFRhYmxlIFR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVFlQRSA9ICJGTUVBVGFibGUiOyAvLyROT04tTkxTLTEkCisJLyoqIFRoZSBUYWJsZSBUeXBlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1RZUEUgPSAiRk1FQVRhYmxlIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGRk1FQVRhYmxlQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkZNRUFUYWJsZUFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkZNRUFUYWJsZUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZGTUVBVGFibGVBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZGTUVBVGFibGVBY3RpdmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICovCisJcHVibGljIEVTRkZNRUFUYWJsZUFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgQnVuZGxleENvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKLSAgICAgKi8KLSAgICBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc0J1bmRsZUNvbnRleHQ7Ci0gICAgfQorCS8qKgorCSAqIEdldCBCdW5kbGV4Q29udGV4dC4KKwkgKgorCSAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAorCSAqLworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OwogCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgcGx1Z2luIGltcGxlbWVudGF0aW9uIG1hbnVhbGx5Ci0gICAgICAgIHNQbHVnaW4gPSBuZXcgSW1wbGVtZW50YXRpb24oKTsKLSAgICB9CisJCS8vIENyZWF0ZSB0aGUgcGx1Z2luIGltcGxlbWVudGF0aW9uIG1hbnVhbGx5CisJCXNQbHVnaW4gPSBuZXcgSW1wbGVtZW50YXRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBudWxsOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYW4gRXJyb3Igc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIEVycm9yIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLldBUk5JTkcsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gSW5mbyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBJbmZvIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgUExVR0lOX0lELCBJU3RhdHVzLklORk8sIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYW4gSW5mbyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBJbmZvIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgUExVR0lOX0lELCBJU3RhdHVzLklORk8sIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9tYW5hZ2VyL2F4aXMvRk1FQUF4aXNNYW5hZ2VyLmphdmEgYi9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9tYW5hZ2VyL2F4aXMvRk1FQUF4aXNNYW5hZ2VyLmphdmEKaW5kZXggNmUyYWFlMS4uMTdiMWJhMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvdGFibGUvbWFuYWdlci9heGlzL0ZNRUFBeGlzTWFuYWdlci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3RhYmxlL21hbmFnZXIvYXhpcy9GTUVBQXhpc01hbmFnZXIuamF2YQpAQCAtMjgsNzAgKzI4LDcwIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBGTUVBQXhpc01hbmFnZXIKLSAgICBleHRlbmRzIEFic3RyYWN0U3RlcmVvdHlwZWRFbGVtZW50VU1MU3luY2hyb25pemVkT25GZWF0dXJlQXhpc01hbmFnZXI8SVNGYWlsdXJlTW9kZUZNRUE+IHsKKwlleHRlbmRzIEFic3RyYWN0U3RlcmVvdHlwZWRFbGVtZW50VU1MU3luY2hyb25pemVkT25GZWF0dXJlQXhpc01hbmFnZXI8SVNGYWlsdXJlTW9kZUZNRUE+IHsKIAotICAgIC8qKgotICAgICAqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRk1FQUF4aXNNYW5hZ2VyKCkgewotICAgIH0KKwkvKioKKwkgKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIEZNRUFBeGlzTWFuYWdlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGVBeGlzRWxlbWVudChmaW5hbCBTdHJpbmcgcEVsZW1lbnRJZCkgewotICAgICAgICBJU3BlY2lhbGl6YXRpb25UeXBlIHZUeXBlID0gKElTcGVjaWFsaXphdGlvblR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgLmdldFR5cGUoRVNGRk1FQVR5cGVzU2V0LlNGQUlMVVJFTU9ERUZNRUFfVFlQRV9JRCk7Ci0gICAgICAgIHJldHVybiB2VHlwZS5nZXRJZCgpLmVxdWFscyhwRWxlbWVudElkKTsKLSAgICB9CisJLyoqCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlQXhpc0VsZW1lbnQoZmluYWwgU3RyaW5nIHBFbGVtZW50SWQpIHsKKwkJSVNwZWNpYWxpemF0aW9uVHlwZSB2VHlwZSA9IChJU3BlY2lhbGl6YXRpb25UeXBlKSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKKwkJCS5nZXRUeXBlKEVTRkZNRUFUeXBlc1NldC5TRkFJTFVSRU1PREVGTUVBX1RZUEVfSUQpOworCQlyZXR1cm4gdlR5cGUuZ2V0SWQoKS5lcXVhbHMocEVsZW1lbnRJZCk7CisJfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0U3RlcmVvdHlwZUJhc2VFbGVtZW50KGZpbmFsIElTRmFpbHVyZU1vZGVGTUVBIHBTdGVyZW90eXBlQXBwbGljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIHBTdGVyZW90eXBlQXBwbGljYXRpb24uZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgIH0KKwkvKioKKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWxlbWVudCBnZXRTdGVyZW90eXBlQmFzZUVsZW1lbnQoZmluYWwgSVNGYWlsdXJlTW9kZUZNRUEgcFN0ZXJlb3R5cGVBcHBsaWNhdGlvbikgeworCQlyZXR1cm4gcFN0ZXJlb3R5cGVBcHBsaWNhdGlvbi5nZXRCYXNlX1Byb3BlcnR5KCk7CisJfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnN0YW5jZU9mUmVxdWlyZWRTdGVyZW90eXBlQXBwbGljYXRpb24oZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIHBPYmplY3QgaW5zdGFuY2VvZiBJU0ZhaWx1cmVNb2RlRk1FQTsKLSAgICB9CisJLyoqCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnN0YW5jZU9mUmVxdWlyZWRTdGVyZW90eXBlQXBwbGljYXRpb24oZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKKwkJcmV0dXJuIHBPYmplY3QgaW5zdGFuY2VvZiBJU0ZhaWx1cmVNb2RlRk1FQTsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FsbG93ZWRBc0Jhc2VFbGVtZW50KGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHBFbGVtZW50IGluc3RhbmNlb2YgUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzQWxsb3dlZEFzQmFzZUVsZW1lbnQoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlyZXR1cm4gcEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9wZXJ0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSVNGYWlsdXJlTW9kZUZNRUEgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCBJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcyk7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJU0ZhaWx1cmVNb2RlRk1FQSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb24oZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlyZXR1cm4gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbkJhc2VQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9CYXNlX1Byb3BlcnR5KCkuZ2V0TmFtZSgpOwotICAgIH0KKwkvKioKKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbkJhc2VQcm9wZXJ0eU5hbWUoKSB7CisJCXJldHVybiBFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZhaWx1cmVNb2RlRk1FQV9CYXNlX1Byb3BlcnR5KCkuZ2V0TmFtZSgpOworCX0KIAogfQogCmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9zZXQvRVNGRk1FQVRhYmxlc1NldC5qYXZhIGIvYW5hbHlzaXMvZm1lYS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvdGFibGUvc2V0L0VTRkZNRUFUYWJsZXNTZXQuamF2YQppbmRleCBjZWE0MTkzLi5jZmYzOTZjIDEwMDY0NAotLS0gYS9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS9zZXQvRVNGRk1FQVRhYmxlc1NldC5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3RhYmxlL3NldC9FU0ZGTUVBVGFibGVzU2V0LmphdmEKQEAgLTE4LDI4ICsxOCwyOCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGRk1FQVRhYmxlc1NldCB7CiAKLSAgICAvKioKLSAgICAgKiBGTUVBIFRhYmxlIElELgotICAgICAqIE5PVEU6IFRoZSBJRCBtdXN0IGJlIHRoZSBzYW1lIGluOgotICAgICAqICAtIEZNRUFUYWJsZS5jb25maWd1cmF0aW9uCi0gICAgICogIC0gRk1FQVRhYmxlLm5hdHRhYmxlY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZNRUFfVEFCTEVfSUQgPQotICAgICAgICAiRk1FQVRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIEZNRUEgVGFibGUgSUQuCisJICogTk9URTogVGhlIElEIG11c3QgYmUgdGhlIHNhbWUgaW46CisJICogIC0gRk1FQVRhYmxlLmNvbmZpZ3VyYXRpb24KKwkgKiAgLSBGTUVBVGFibGUubmF0dGFibGVjb25maWd1cmF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1FQV9UQUJMRV9JRCA9CisJCSJGTUVBVGFibGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBGTUVBIFRhYmxlIG5hbWUuCi0gICAgICogTk9URTogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZSBpbjoKLSAgICAgKiAgLSBGTUVBVGFibGUubmF0dGFibGVjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1FQV9UQUJMRV9OQU1FID0KLSAgICAgICAgIkZNRUFUYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBGTUVBIFRhYmxlIG5hbWUuCisJICogTk9URTogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZSBpbjoKKwkgKiAgLSBGTUVBVGFibGUubmF0dGFibGVjb25maWd1cmF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1FQV9UQUJMRV9OQU1FID0KKwkJIkZNRUFUYWJsZSI7IC8vJE5PTi1OTFMtMSQKIAogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVTRkZNRUFUYWJsZXNTZXQoKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KKwkgKi8KKwlwcml2YXRlIEVTRkZNRUFUYWJsZXNTZXQoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS90ZXN0ZXIvRk1FQVRhYmxlVGVzdGVyLmphdmEgYi9hbmFseXNpcy9mbWVhL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YuZm1lYS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZm1lYS90YWJsZS90ZXN0ZXIvRk1FQVRhYmxlVGVzdGVyLmphdmEKaW5kZXggMzZmNmZmZS4uOTU2ZWEyZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvZm1lYS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmZtZWEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2ZtZWEvdGFibGUvdGVzdGVyL0ZNRUFUYWJsZVRlc3Rlci5qYXZhCisrKyBiL2FuYWx5c2lzL2ZtZWEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5mbWVhLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9mbWVhL3RhYmxlL3Rlc3Rlci9GTUVBVGFibGVUZXN0ZXIuamF2YQpAQCAtMzEsNTggKzMxLDU4IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBGTUVBVGFibGVUZXN0ZXIKLSAgICBpbXBsZW1lbnRzIElUYWJsZVRlc3RlciB7CisJaW1wbGVtZW50cyBJVGFibGVUZXN0ZXIgewogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBGTUVBVGFibGVUZXN0ZXIoKSB7Ci0gICAgfQorCS8qKgorCSAqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgRk1FQVRhYmxlVGVzdGVyKCkgeworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGlzQWxsb3dlZChmaW5hbCBPYmplY3QgcENvbnRleHQpIHsKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbnVsbDsKLSAgICAgICAgaWYgKHBDb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgRWxlbWVudCB2RWwgPSAoRWxlbWVudCkgcENvbnRleHQ7Ci0gICAgICAgICAgICBJU3BlY2lhbGl6YXRpb25UeXBlIHZUeXBlID0gKElTcGVjaWFsaXphdGlvblR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5nZXRUeXBlKEVTRkZNRUFUeXBlc1NldC5TRkFJTFVSRU1PREVGTUVBX1RZUEVfSUQpOwotICAgICAgICAgICAgaWYgKHZUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJRWxlbWVudE1hdGNoZXIgdk1hdGNoZXIgPSB2VHlwZS5nZXRNYXRjaGVyKCk7Ci0gICAgICAgICAgICAgICAgUHJvZmlsZSB2UHJvZmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0IGluc3RhbmNlb2YgUGFja2FnZSB8fCB2TWF0Y2hlci5tYXRjaGVzKHZFbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdlByb2ZpbGUgPSBVTUxVdGlsLmdldFByb2ZpbGUoSUVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRSwgdkVsKTsKLSAgICAgICAgICAgICAgICB9CisJLyoqCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgaXNBbGxvd2VkKGZpbmFsIE9iamVjdCBwQ29udGV4dCkgeworCQlJU3RhdHVzIHZTdGF0dXMgPSBudWxsOworCQlpZiAocENvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJCQlFbGVtZW50IHZFbCA9IChFbGVtZW50KSBwQ29udGV4dDsKKwkJCUlTcGVjaWFsaXphdGlvblR5cGUgdlR5cGUgPSAoSVNwZWNpYWxpemF0aW9uVHlwZSkgRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCisJCQkJLmdldFR5cGUoRVNGRk1FQVR5cGVzU2V0LlNGQUlMVVJFTU9ERUZNRUFfVFlQRV9JRCk7CisJCQlpZiAodlR5cGUgIT0gbnVsbCkgeworCQkJCUlFbGVtZW50TWF0Y2hlciB2TWF0Y2hlciA9IHZUeXBlLmdldE1hdGNoZXIoKTsKKwkJCQlQcm9maWxlIHZQcm9maWxlID0gbnVsbDsKKwkJCQlpZiAocENvbnRleHQgaW5zdGFuY2VvZiBQYWNrYWdlIHx8IHZNYXRjaGVyLm1hdGNoZXModkVsKSkgeworCQkJCQl2UHJvZmlsZSA9IFVNTFV0aWwuZ2V0UHJvZmlsZShJRVNGRk1FQVBhY2thZ2UuZUlOU1RBTkNFLCB2RWwpOworCQkJCX0KIAotICAgICAgICAgICAgICAgIGlmICh2UHJvZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2UGFja2FnZVFOID0gdlByb2ZpbGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodkVsLmdldE5lYXJlc3RQYWNrYWdlKCkuZ2V0QXBwbGllZFByb2ZpbGUodlBhY2thZ2VRTiwgdHJ1ZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdlN0YXR1cyA9IG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5PSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0ZGTUVBVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY29udGV4dCBhbGxvd2VkIHRvIGNyZWF0ZSBhIEZNRUEgVGFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdlN0YXR1cyA9IG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0ZGTUVBVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcHJvZmlsZSAiICsgdlBhY2thZ2VRTiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYXBwbGllZCBvbiB0aGUgbW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJaWYgKHZQcm9maWxlICE9IG51bGwpIHsKKwkJCQkJZmluYWwgU3RyaW5nIHZQYWNrYWdlUU4gPSB2UHJvZmlsZS5nZXRRdWFsaWZpZWROYW1lKCk7CisJCQkJCWlmICh2RWwuZ2V0TmVhcmVzdFBhY2thZ2UoKS5nZXRBcHBsaWVkUHJvZmlsZSh2UGFja2FnZVFOLCB0cnVlKSAhPSBudWxsKSB7CisJCQkJCQl2U3RhdHVzID0gbmV3IFN0YXR1cygKKwkJCQkJCQlJU3RhdHVzLk9LLAorCQkJCQkJCUVTRkZNRUFUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCisJCQkJCQkJIlRoZSBjb250ZXh0IGFsbG93ZWQgdG8gY3JlYXRlIGEgRk1FQSBUYWJsZSIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQl2U3RhdHVzID0gbmV3IFN0YXR1cygKKwkJCQkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCQkJCUVTRkZNRUFUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCisJCQkJCQkJIlRoZSBwcm9maWxlICIgKyB2UGFja2FnZVFOIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyAiIGlzIG5vdCBhcHBsaWVkIG9uIHRoZSBtb2RlbCIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBpZiAodlN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2U3RhdHVzID0gbmV3IFN0YXR1cygKLSAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgIEVTRkZNRUFUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgIlRoZSBjb250ZXh0IGlzIG5vdCBhbiBVTUwgRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTdGF0dXM7Ci0gICAgfQorCQlpZiAodlN0YXR1cyA9PSBudWxsKSB7CisJCQl2U3RhdHVzID0gbmV3IFN0YXR1cygKKwkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCUVTRkZNRUFUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCisJCQkJIlRoZSBjb250ZXh0IGlzIG5vdCBhbiBVTUwgRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHZTdGF0dXM7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmRpYWdyYW0vYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZGlhZ3JhbS9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZGlhZ3JhbS9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZGlhZ3JhbS9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmRpYWdyYW0vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9FU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kaWFncmFtL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kaWFncmFtL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1BY3RpdmF0b3IuamF2YQppbmRleCBlMmE2ZWY1Li5kNTkzNWM4IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmRpYWdyYW0vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9FU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZGlhZ3JhbS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9kaWFncmFtL0VTRkxvY2FsQW5hbHlzaXNEaWFncmFtQWN0aXZhdG9yLmphdmEKQEAgLTI0LDgzICsyNCw4MyBAQAogICovCiBwdWJsaWMgY2xhc3MgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1BY3RpdmF0b3IgZXh0ZW5kcyBFTUZQbHVnaW4gaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1BY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1BY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUFjdGl2YXRvcigpOwogCi0gICAgLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOworCS8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KKwlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEVTRkxvY2FsQW5hbHlzaXNEaWFncmFtQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgQnVuZGxleENvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKLSAgICAgKi8KLSAgICBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc0J1bmRsZUNvbnRleHQ7Ci0gICAgfQorCS8qKgorCSAqIEdldCBCdW5kbGV4Q29udGV4dC4KKwkgKgorCSAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAorCSAqLworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKIAotICAgIH0KKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICB9CisJCQkvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCisJCQlzUGx1Z2luID0gdGhpczsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZGlhZ3JhbS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9kaWFncmFtL3NldC9FU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbVNldC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kaWFncmFtL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kaWFncmFtL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vc2V0L0VTRkxvY2FsQW5hbHlzaXNEaWFncmFtU2V0LmphdmEKaW5kZXggNmRjNDVjZi4uYjcwYTFmMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kaWFncmFtL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kaWFncmFtL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vc2V0L0VTRkxvY2FsQW5hbHlzaXNEaWFncmFtU2V0LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kaWFncmFtL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kaWFncmFtL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vc2V0L0VTRkxvY2FsQW5hbHlzaXNEaWFncmFtU2V0LmphdmEKQEAgLTE4LDE5ICsxOCwxOSBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1TZXQgewogCi0gICAgLyoqCi0gICAgICogRVNGTG9jYWxBbmFseXNpcyBEaWFncmFtIG5hbWUuCi0gICAgICogTk9URTogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZSBpbjoKLSAgICAgKiAgLSBsb2NhbEFuYWx5c2lzRGlhZ3JhbS5jb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNGTE9DQUxBTkFMWVNJU19ESUFHUkFNX05BTUUgPQotICAgICAgICAiTG9jYWwgYW5hbHlzaXMgZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBFU0ZMb2NhbEFuYWx5c2lzIERpYWdyYW0gbmFtZS4KKwkgKiBOT1RFOiBUaGUgbmFtZSBtdXN0IGJlIHRoZSBzYW1lIGluOgorCSAqICAtIGxvY2FsQW5hbHlzaXNEaWFncmFtLmNvbmZpZ3VyYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0ZMT0NBTEFOQUxZU0lTX0RJQUdSQU1fTkFNRSA9CisJCSJMb2NhbCBhbmFseXNpcyBkaWFncmFtIjsgLy8kTk9OLU5MUy0xJAogCiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1TZXQoKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KKwkgKi8KKwlwcml2YXRlIEVTRkxvY2FsQW5hbHlzaXNEaWFncmFtU2V0KCkgeworCQkvLyBOb3RoaW5nIHRvIGRvCisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kaWFncmFtL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kaWFncmFtL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vdXRpbC9FU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbVV0aWwuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZGlhZ3JhbS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9kaWFncmFtL3V0aWwvRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1VdGlsLmphdmEKaW5kZXggOTlmNzI3Zi4uY2UyNjU1ZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kaWFncmFtL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kaWFncmFtL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vdXRpbC9FU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbVV0aWwuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2RpYWdyYW0vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmRpYWdyYW0vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZGlhZ3JhbS91dGlsL0VTRkxvY2FsQW5hbHlzaXNEaWFncmFtVXRpbC5qYXZhCkBAIC0yNSw0NCArMjUsNDQgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNEaWFncmFtVXRpbCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1VdGlsKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXByaXZhdGUgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1VdGlsKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBUaGUgVmlld1Byb3RvdHlwZSBvZiB0aGUgVGFibGUgYnkgaXRzIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcERpYWdyYW1OYW1lIFRoZSBEaWFncmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIFRoZSBEaWFncmFtIFZpZXdQcm90b3R5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFZpZXdQcm90b3R5cGUgZ2V0Vmlld1Byb3RvdHlwZShmaW5hbCBTdHJpbmcgcERpYWdyYW1OYW1lLCBmaW5hbCBDbGFzcyBwUm9vdEVsZW1lbnQpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxWaWV3UHJvdG90eXBlPiB2UHJvdG90eXBlcyA9IFBvbGljeUNoZWNrZXIuZ2V0Rm9yKHBSb290RWxlbWVudCkuZ2V0QWxsUHJvdG90eXBlcygpOwotICAgICAgICBWaWV3UHJvdG90eXBlIHZEaWFncmFtID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHZQb3RlbnRpYWxEaWFncmFtTmFtZSA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yPFZpZXdQcm90b3R5cGU+IHZJdGVyYXRvciA9IHZQcm90b3R5cGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlICh2RGlhZ3JhbSA9PSBudWxsICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFZpZXdQcm90b3R5cGUgdlBvdGVudGlhbFByb3RvdHlwZSA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB2UG90ZW50aWFsRGlhZ3JhbU5hbWUgPSB2UG90ZW50aWFsUHJvdG90eXBlLmdldFJlcHJlc2VudGF0aW9uS2luZCgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChwRGlhZ3JhbU5hbWUuZXF1YWxzKHZQb3RlbnRpYWxEaWFncmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB2RGlhZ3JhbSA9IHZQb3RlbnRpYWxQcm90b3R5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkvKioKKwkgKiBHZXQgVGhlIFZpZXdQcm90b3R5cGUgb2YgdGhlIFRhYmxlIGJ5IGl0cyBuYW1lLgorCSAqCisJICogQHBhcmFtIHBEaWFncmFtTmFtZSBUaGUgRGlhZ3JhbSBuYW1lCisJICogQHJldHVybiBUaGUgRGlhZ3JhbSBWaWV3UHJvdG90eXBlCisJICovCisJcHVibGljIHN0YXRpYyBWaWV3UHJvdG90eXBlIGdldFZpZXdQcm90b3R5cGUoZmluYWwgU3RyaW5nIHBEaWFncmFtTmFtZSwgZmluYWwgQ2xhc3MgcFJvb3RFbGVtZW50KSB7CisJCUNvbGxlY3Rpb248Vmlld1Byb3RvdHlwZT4gdlByb3RvdHlwZXMgPSBQb2xpY3lDaGVja2VyLmdldEZvcihwUm9vdEVsZW1lbnQpLmdldEFsbFByb3RvdHlwZXMoKTsKKwkJVmlld1Byb3RvdHlwZSB2RGlhZ3JhbSA9IG51bGw7CisJCVN0cmluZyB2UG90ZW50aWFsRGlhZ3JhbU5hbWUgPSBudWxsOworCQlJdGVyYXRvcjxWaWV3UHJvdG90eXBlPiB2SXRlcmF0b3IgPSB2UHJvdG90eXBlcy5pdGVyYXRvcigpOworCQl3aGlsZSAodkRpYWdyYW0gPT0gbnVsbCAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlWaWV3UHJvdG90eXBlIHZQb3RlbnRpYWxQcm90b3R5cGUgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJdlBvdGVudGlhbERpYWdyYW1OYW1lID0gdlBvdGVudGlhbFByb3RvdHlwZS5nZXRSZXByZXNlbnRhdGlvbktpbmQoKS5nZXROYW1lKCk7CisJCQlpZiAocERpYWdyYW1OYW1lLmVxdWFscyh2UG90ZW50aWFsRGlhZ3JhbU5hbWUpKSB7CisJCQkJdkRpYWdyYW0gPSB2UG90ZW50aWFsUHJvdG90eXBlOworCQkJfQorCQl9CiAKLSAgICAgICAgcmV0dXJuIHZEaWFncmFtOwotICAgIH0KKwkJcmV0dXJuIHZEaWFncmFtOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBEaWFncmFtTmFtZSBUaGUgRGlhZ3JhbSBOYW1lCi0gICAgICogQHBhcmFtIHBSb290RWxlbWVudCBUaGUgZWxlbWVudCB3aGVyZSBzaG91bGQgYmUgY3JlYXRlZCB0aGUgdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURpYWdyYW0oZmluYWwgU3RyaW5nIHBEaWFncmFtTmFtZSwgZmluYWwgQ2xhc3MgcFJvb3RFbGVtZW50KSB7Ci0gICAgICAgIFZpZXdQcm90b3R5cGUgdkRpYWdyYW0gPSBnZXRWaWV3UHJvdG90eXBlKHBEaWFncmFtTmFtZSwgcFJvb3RFbGVtZW50KTsKLSAgICAgICAgaWYgKHZEaWFncmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZEaWFncmFtLmluc3RhbnRpYXRlT24ocFJvb3RFbGVtZW50LCBwRGlhZ3JhbU5hbWUgKyB2RGlhZ3JhbS5nZXRWaWV3Q291bnRPbihwUm9vdEVsZW1lbnQpKTsKLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgYSB0YWJsZS4KKwkgKgorCSAqIEBwYXJhbSBwRGlhZ3JhbU5hbWUgVGhlIERpYWdyYW0gTmFtZQorCSAqIEBwYXJhbSBwUm9vdEVsZW1lbnQgVGhlIGVsZW1lbnQgd2hlcmUgc2hvdWxkIGJlIGNyZWF0ZWQgdGhlIHRhYmxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEaWFncmFtKGZpbmFsIFN0cmluZyBwRGlhZ3JhbU5hbWUsIGZpbmFsIENsYXNzIHBSb290RWxlbWVudCkgeworCQlWaWV3UHJvdG90eXBlIHZEaWFncmFtID0gZ2V0Vmlld1Byb3RvdHlwZShwRGlhZ3JhbU5hbWUsIHBSb290RWxlbWVudCk7CisJCWlmICh2RGlhZ3JhbSAhPSBudWxsKSB7CisJCQl2RGlhZ3JhbS5pbnN0YW50aWF0ZU9uKHBSb290RWxlbWVudCwgcERpYWdyYW1OYW1lICsgdkRpYWdyYW0uZ2V0Vmlld0NvdW50T24ocFJvb3RFbGVtZW50KSk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2RvYy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZG9jL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2RvYy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZG9jL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9kb2Mvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmRvYy9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZG9jL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5kb2MvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9hYm91dC5odG1sIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL0xvY2FsQW5hbHlzaXNFeGVjdXRpb25VSUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvTG9jYWxBbmFseXNpc0V4ZWN1dGlvblVJQWN0aXZhdG9yLmphdmEKaW5kZXggYjhmYmRkYi4uNjZhMjhhMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvTG9jYWxBbmFseXNpc0V4ZWN1dGlvblVJQWN0aXZhdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvTG9jYWxBbmFseXNpc0V4ZWN1dGlvblVJQWN0aXZhdG9yLmphdmEKQEAgLTI1LDEwNSArMjUsMTA1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBMb2NhbEFuYWx5c2lzRXhlY3V0aW9uVUlBY3RpdmF0b3IgZXh0ZW5kcyBFTUZQbHVnaW4gewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxBbmFseXNpc0V4ZWN1dGlvblVJQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IExvY2FsQW5hbHlzaXNFeGVjdXRpb25VSUFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsQW5hbHlzaXNFeGVjdXRpb25VSUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBMb2NhbEFuYWx5c2lzRXhlY3V0aW9uVUlBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIExvY2FsQW5hbHlzaXNFeGVjdXRpb25VSUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgTG9jYWxBbmFseXNpc0V4ZWN1dGlvblVJQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIHNQbHVnaW4uZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIHNQbHVnaW4uZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLklORk8sIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYW4gSW5mbyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBJbmZvIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOworCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCXNQbHVnaW4gPSB0aGlzOwogCi0gICAgICAgIH0KKwkJfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlci5zdGFydChwQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlzdXBlci5zdGFydChwQ29udGV4dCk7CisJCX0KKwl9CiAKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1IYW5kbGVyLmphdmEKaW5kZXggYjQ2MDQ2OS4uOGZjOWY2ZSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUhhbmRsZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZUVTRkxvY2FsQW5hbHlzaXNEaWFncmFtSGFuZGxlci5qYXZhCkBAIC0zMCwzNCArMzAsMzQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZUVTRkxvY2FsQW5hbHlzaXNEaWFncmFtSGFuZGxlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKwlleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVhdGVFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbUhhbmRsZXIoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIENyZWF0ZUVTRkxvY2FsQW5hbHlzaXNEaWFncmFtSGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNCbG9ja0xBbmFseXNpcyBjbGFzcykgYW5kIGNhbGwgdGhlIGFjdGlvbiBmb3IgY3JlYXRpbmcgYW4gRVNGTG9jYWxBbmFseXNpcyBEaWFncmFtCi0gICAgICogVGFibGUuCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IHBFdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJLyoqCisJICogR2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50IChTQmxvY2tMQW5hbHlzaXMgY2xhc3MpIGFuZCBjYWxsIHRoZSBhY3Rpb24gZm9yIGNyZWF0aW5nIGFuIEVTRkxvY2FsQW5hbHlzaXMgRGlhZ3JhbQorCSAqIFRhYmxlLgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCi0gICAgICAgIElTZWxlY3Rpb24gdlNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb24ocEV2ZW50KTsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIENsYXNzIHZTZWxlY3RlZENsYXNzID0KLSAgICAgICAgICAgIChDbGFzcykgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzc18oKSk7CisJCWZpbmFsIENsYXNzIHZTZWxlY3RlZENsYXNzID0KKwkJCShDbGFzcykgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzc18oKSk7CiAKLSAgICAgICAgaWYgKCh2U2VsZWN0ZWRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKSAhPSBudWxsKSkgewotICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1VdGlsCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpYWdyYW0oRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1TZXQuRVNGTE9DQUxBTkFMWVNJU19ESUFHUkFNX05BTUUsIHZTZWxlY3RlZENsYXNzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJCWlmICgodlNlbGVjdGVkQ2xhc3MgIT0gbnVsbCkKKwkJCSYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRDbGFzcywgSVNCbG9ja0xBbmFseXNpcy5jbGFzcykgIT0gbnVsbCkpIHsKKwkJCUVTRkxvY2FsQW5hbHlzaXNEaWFncmFtVXRpbAorCQkJCS5jcmVhdGVEaWFncmFtKEVTRkxvY2FsQW5hbHlzaXNEaWFncmFtU2V0LkVTRkxPQ0FMQU5BTFlTSVNfRElBR1JBTV9OQU1FLCB2U2VsZWN0ZWRDbGFzcyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNGZWFyZWRFdmVudEhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZlYXJlZEV2ZW50SGFuZGxlci5qYXZhCmluZGV4IDE5NzE5NmYuLjE5MDM5YTggMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZlYXJlZEV2ZW50SGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZlYXJlZEV2ZW50SGFuZGxlci5qYXZhCkBAIC0zMCwzNCArMzAsMzQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZVNGZWFyZWRFdmVudEhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlU0ZlYXJlZEV2ZW50SGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ3JlYXRlU0ZlYXJlZEV2ZW50SGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNGZWFyZWRFdmVudHNMaWJyYXJ5IG9yIFNGZWFyZWRFdmVudHNGYW1pbHkpCi0gICAgICogYW5kIGNhbGwgdGhlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGEgU0ZlYXJlZEV2ZW50c0ZhbWlseS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU0ZlYXJlZEV2ZW50c0xpYnJhcnkgb3IgU0ZlYXJlZEV2ZW50c0ZhbWlseSkKKwkgKiBhbmQgY2FsbCB0aGUgY29tbWFuZCBmb3IgY3JlYXRpbmcgYSBTRmVhcmVkRXZlbnRzRmFtaWx5LgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgRWxlbWVudCB2U2VsZWN0ZWRFbGVtZW50ID0KLSAgICAgICAgICAgIChFbGVtZW50KSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEVsZW1lbnQoKSk7CisJCWZpbmFsIEVsZW1lbnQgdlNlbGVjdGVkRWxlbWVudCA9CisJCQkoRWxlbWVudCkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbGVtZW50KCkpOwogCi0gICAgICAgIGlmICh2U2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRFbGVtZW50LCBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkuY2xhc3MpICE9IG51bGwKLSAgICAgICAgICAgICAgICB8fCBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRFbGVtZW50LCBJU0ZlYXJlZEV2ZW50c0ZhbWlseS5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNGZWFyZWRFdmVudCh2U2VsZWN0ZWRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodlNlbGVjdGVkRWxlbWVudCAhPSBudWxsKSB7CisJCQlpZiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkRWxlbWVudCwgSVNGZWFyZWRFdmVudHNMaWJyYXJ5LmNsYXNzKSAhPSBudWxsCisJCQkJfHwgVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkRWxlbWVudCwgSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MpICE9IG51bGwpIHsKKwkJCQlFU0ZMb2NhbEFuYWx5c2lzVXRpbC5jcmVhdGVTRmVhcmVkRXZlbnQodlNlbGVjdGVkRWxlbWVudCk7CisJCQl9CisJCX0KIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJCXJldHVybiBudWxsOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseUhhbmRsZXIuamF2YQppbmRleCAwN2Q1NzE3Li4zMTk2ZTM0IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHlIYW5kbGVyLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5SGFuZGxlci5qYXZhCkBAIC0zMCwzNCArMzAsMzQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHlIYW5kbGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHlIYW5kbGVyKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBDcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5SGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNGZWFyZWRFdmVudHNMaWJyYXJ5IG9yIFNGZWFyZWRFdmVudHNGYW1pbHkpCi0gICAgICogYW5kIGNhbGwgdGhlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGEgU0ZlYXJlZEV2ZW50c0ZhbWlseS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU0ZlYXJlZEV2ZW50c0xpYnJhcnkgb3IgU0ZlYXJlZEV2ZW50c0ZhbWlseSkKKwkgKiBhbmQgY2FsbCB0aGUgY29tbWFuZCBmb3IgY3JlYXRpbmcgYSBTRmVhcmVkRXZlbnRzRmFtaWx5LgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgRWxlbWVudCB2U2VsZWN0ZWRFbGVtZW50ID0KLSAgICAgICAgICAgIChFbGVtZW50KSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEVsZW1lbnQoKSk7CisJCWZpbmFsIEVsZW1lbnQgdlNlbGVjdGVkRWxlbWVudCA9CisJCQkoRWxlbWVudCkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbGVtZW50KCkpOwogCi0gICAgICAgIGlmICh2U2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRFbGVtZW50LCBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkuY2xhc3MpICE9IG51bGwKLSAgICAgICAgICAgICAgICB8fCBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRFbGVtZW50LCBJU0ZlYXJlZEV2ZW50c0ZhbWlseS5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkodlNlbGVjdGVkRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHZTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZEVsZW1lbnQsIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcykgIT0gbnVsbAorCQkJCXx8IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZEVsZW1lbnQsIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzKSAhPSBudWxsKSB7CisJCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSh2U2VsZWN0ZWRFbGVtZW50KTsKKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJcmV0dXJuIG51bGw7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnlIYW5kbGVyLmphdmEKaW5kZXggOTMzODU3OS4uOTY0NWY0ZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeUhhbmRsZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5SGFuZGxlci5qYXZhCkBAIC0yOSwzNCArMjksMzQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5SGFuZGxlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKwlleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeUhhbmRsZXIoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIENyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5SGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNMb2NhbEFuYWx5c2lzIHBhY2thZ2UpIGFuZCBjYWxsIHRoZSBjb21tYW5kIGZvciBjcmVhdGluZyBhIFNGZWFyZWRFdmVudHNMaWJyYXJ5LgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CisJLyoqCisJICogR2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50IChTTG9jYWxBbmFseXNpcyBwYWNrYWdlKSBhbmQgY2FsbCB0aGUgY29tbWFuZCBmb3IgY3JlYXRpbmcgYSBTRmVhcmVkRXZlbnRzTGlicmFyeS4KKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIFBhY2thZ2UgdlNlbGVjdGVkUGFja2FnZSA9Ci0gICAgICAgICAgICAoUGFja2FnZSkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlKCkpOworCQlmaW5hbCBQYWNrYWdlIHZTZWxlY3RlZFBhY2thZ2UgPQorCQkJKFBhY2thZ2UpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZSgpKTsKIAotICAgICAgICBpZiAoKHZTZWxlY3RlZFBhY2thZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRQYWNrYWdlLCBJU0xvY2FsQW5hbHlzaXMuY2xhc3MpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBJU0xvY2FsQW5hbHlzaXMgdkxvY2FsQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgIChJU0xvY2FsQW5hbHlzaXMpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZFBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodkxvY2FsQW5hbHlzaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkodlNlbGVjdGVkUGFja2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCQlpZiAoKHZTZWxlY3RlZFBhY2thZ2UgIT0gbnVsbCkKKwkJCSYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRQYWNrYWdlLCBJU0xvY2FsQW5hbHlzaXMuY2xhc3MpICE9IG51bGwpKSB7CisJCQlJU0xvY2FsQW5hbHlzaXMgdkxvY2FsQW5hbHlzaXMgPQorCQkJCShJU0xvY2FsQW5hbHlzaXMpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZFBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7CisJCQlpZiAodkxvY2FsQW5hbHlzaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSA9PSBudWxsKSB7CisJCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkodlNlbGVjdGVkUGFja2FnZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTU3lzdGVtRXZlbnRUeXBlRnJvbVRhYmxlSGFuZGxlci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTU3lzdGVtRXZlbnRUeXBlRnJvbVRhYmxlSGFuZGxlci5qYXZhCmluZGV4IDBkNDkyNjQuLjhlMDQ1NzYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1N5c3RlbUV2ZW50VHlwZUZyb21UYWJsZUhhbmRsZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNTeXN0ZW1FdmVudFR5cGVGcm9tVGFibGVIYW5kbGVyLmphdmEKQEAgLTI2LDQwICsyNiw0MCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgQ3JlYXRlU1N5c3RlbUV2ZW50VHlwZUZyb21UYWJsZUhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0VW1sTmF0dGFibGVDcmVhdGVDb21tYW5kSGFuZGxlcgotICAgIGltcGxlbWVudHMgSUhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RVbWxOYXR0YWJsZUNyZWF0ZUNvbW1hbmRIYW5kbGVyCisJaW1wbGVtZW50cyBJSGFuZGxlciB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVhdGVTU3lzdGVtRXZlbnRUeXBlRnJvbVRhYmxlSGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ3JlYXRlU1N5c3RlbUV2ZW50VHlwZUZyb21UYWJsZUhhbmRsZXIoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC5zZXJ2aWNlLmNyZWF0aW9uLmhhbmRsZXIuQ3JlYXRlSGFuZGxlciNnZXRFbGVtZW50VHlwZVRvQ3JlYXRlKCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBJRWxlbWVudFR5cGUgdGhpcyBoYW5kbGVyIGlzIHN1cHBvc2VkIHRvIGNyZWF0ZQotICAgICAqCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZVRvQ3JlYXRlKCkgewotICAgICAgICByZXR1cm4gKElIaW50ZWRUeXBlKSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgIC5nZXRUeXBlKEVTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5TU1lTVEVNRVZFTlRUWVBFX1RZUEVfSUQpOwotICAgIH0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMudW1sLnNlcnZpY2UuY3JlYXRpb24uaGFuZGxlci5DcmVhdGVIYW5kbGVyI2dldEVsZW1lbnRUeXBlVG9DcmVhdGUoKS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIElFbGVtZW50VHlwZSB0aGlzIGhhbmRsZXIgaXMgc3VwcG9zZWQgdG8gY3JlYXRlCisJICoKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlVG9DcmVhdGUoKSB7CisJCXJldHVybiAoSUhpbnRlZFR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQorCQkJLmdldFR5cGUoRVNGTG9jYWxBbmFseXNpc1R5cGVzU2V0LlNTWVNURU1FVkVOVFRZUEVfVFlQRV9JRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IGlmIHRoaXMgaGFuZGxlciBpcyBjdXJyZW50bHkgYWN0aXZlIGFuZCB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS4gQWRkaXRpb25hbGx5LCB2ZXJpZnkgaWYgdGhpcyB0YWJsZSBjYW4KLSAgICAgKiBhZGQgdGhpcyB0eXBlIG9mIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMudW1sLnNlcnZpY2UudHlwZXMuaGFuZGxlcnMuQWJzdHJhY3RDcmVhdGVDb21tYW5kSGFuZGxlciNzZXRFbmFibGVkKGphdmEubGFuZy5PYmplY3QpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEV2YWx1YXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChmaW5hbCBPYmplY3QgcEV2YWx1YXRpb25Db250ZXh0KSB7Ci0gICAgICAgIElOYXR0YWJsZU1vZGVsTWFuYWdlciB2VGFibGVNYW5hZ2VyID0KLSAgICAgICAgICAgIElOYXR0YWJsZU1vZGVsTWFuYWdlclV0aWxzLmdldFRhYmxlTWFuYWdlckZyb21Xb3JrYmVuY2hQYXJ0KGdldEFjdGl2ZVdvcmtiZW5jaFBhcnQoKSk7Ci0gICAgICAgIGJvb2xlYW4gdklzRW5hYmxlZCA9IHZUYWJsZU1hbmFnZXIuY2FuQ3JlYXRlUm93RWxlbWVudChnZXRFbGVtZW50VHlwZVRvQ3JlYXRlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIHNldEJhc2VFbmFibGVkKHZJc0VuYWJsZWQpOwotICAgIH0KKwkvKioKKwkgKiBWZXJpZnkgaWYgdGhpcyBoYW5kbGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgYW5kIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLiBBZGRpdGlvbmFsbHksIHZlcmlmeSBpZiB0aGlzIHRhYmxlIGNhbgorCSAqIGFkZCB0aGlzIHR5cGUgb2YgZWxlbWVudC4KKwkgKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy51bWwuc2VydmljZS50eXBlcy5oYW5kbGVycy5BYnN0cmFjdENyZWF0ZUNvbW1hbmRIYW5kbGVyI3NldEVuYWJsZWQoamF2YS5sYW5nLk9iamVjdCkKKwkgKgorCSAqIEBwYXJhbSBwRXZhbHVhdGlvbkNvbnRleHQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGZpbmFsIE9iamVjdCBwRXZhbHVhdGlvbkNvbnRleHQpIHsKKwkJSU5hdHRhYmxlTW9kZWxNYW5hZ2VyIHZUYWJsZU1hbmFnZXIgPQorCQkJSU5hdHRhYmxlTW9kZWxNYW5hZ2VyVXRpbHMuZ2V0VGFibGVNYW5hZ2VyRnJvbVdvcmtiZW5jaFBhcnQoZ2V0QWN0aXZlV29ya2JlbmNoUGFydCgpKTsKKwkJYm9vbGVhbiB2SXNFbmFibGVkID0gdlRhYmxlTWFuYWdlci5jYW5DcmVhdGVSb3dFbGVtZW50KGdldEVsZW1lbnRUeXBlVG9DcmVhdGUoKS5nZXRJZCgpKTsKKwkJc2V0QmFzZUVuYWJsZWQodklzRW5hYmxlZCk7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1N5c3RlbUV2ZW50VHlwZUhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1N5c3RlbUV2ZW50VHlwZUhhbmRsZXIuamF2YQppbmRleCBhMTc3MmQ5Li45ZGQwMmRiIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNTeXN0ZW1FdmVudFR5cGVIYW5kbGVyLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTU3lzdGVtRXZlbnRUeXBlSGFuZGxlci5qYXZhCkBAIC0yOSwzMCArMjksMzAgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZVNTeXN0ZW1FdmVudFR5cGVIYW5kbGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZVNTeXN0ZW1FdmVudFR5cGVIYW5kbGVyKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBDcmVhdGVTU3lzdGVtRXZlbnRUeXBlSGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNTeXRlbUV2ZW50c0xpYnJhcnkgcGFja2FnZSkgYW5kIGNhbGwgdGhlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGEgU1N5dGVtRXZlbnRUeXBlLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CisJLyoqCisJICogR2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50IChTU3l0ZW1FdmVudHNMaWJyYXJ5IHBhY2thZ2UpIGFuZCBjYWxsIHRoZSBjb21tYW5kIGZvciBjcmVhdGluZyBhIFNTeXRlbUV2ZW50VHlwZS4KKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIFBhY2thZ2UgdlNlbGVjdGVkUGFja2FnZSA9Ci0gICAgICAgICAgICAoUGFja2FnZSkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlKCkpOworCQlmaW5hbCBQYWNrYWdlIHZTZWxlY3RlZFBhY2thZ2UgPQorCQkJKFBhY2thZ2UpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZSgpKTsKIAotICAgICAgICBpZiAoKHZTZWxlY3RlZFBhY2thZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRQYWNrYWdlLCBJU1N5c3RlbUV2ZW50c0xpYnJhcnkuY2xhc3MpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVXRpbC5jcmVhdGVTU3lzdGVtRXZlbnRUeXBlKHZTZWxlY3RlZFBhY2thZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJaWYgKCh2U2VsZWN0ZWRQYWNrYWdlICE9IG51bGwpCisJCQkmJiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkUGFja2FnZSwgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmNsYXNzKSAhPSBudWxsKSkgeworCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU1N5c3RlbUV2ZW50VHlwZSh2U2VsZWN0ZWRQYWNrYWdlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5SGFuZGxlci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeUhhbmRsZXIuamF2YQppbmRleCBiZTFkN2RlLi5lYjY2Zjk1IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5SGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnlIYW5kbGVyLmphdmEKQEAgLTMxLDQ2ICszMSw0NiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgQ3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnlIYW5kbGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5SGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnlIYW5kbGVyKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU0xvY2FsQW5hbHlzaXMgcGFja2FnZSkgYW5kIGNhbGwgdGhlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGEgU1N5dGVtRXZlbnRzbGlicmFyeS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU0xvY2FsQW5hbHlzaXMgcGFja2FnZSkgYW5kIGNhbGwgdGhlIGNvbW1hbmQgZm9yIGNyZWF0aW5nIGEgU1N5dGVtRXZlbnRzbGlicmFyeS4KKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIFBhY2thZ2UgdlNlbGVjdGVkUGFja2FnZSA9Ci0gICAgICAgICAgICAoUGFja2FnZSkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlKCkpOworCQlmaW5hbCBQYWNrYWdlIHZTZWxlY3RlZFBhY2thZ2UgPQorCQkJKFBhY2thZ2UpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZSgpKTsKIAotICAgICAgICBpZiAoKHZTZWxlY3RlZFBhY2thZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRQYWNrYWdlLCBJU0xvY2FsQW5hbHlzaXMuY2xhc3MpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBJU0xvY2FsQW5hbHlzaXMgdkxvY2FsQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgIChJU0xvY2FsQW5hbHlzaXMpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZFBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7CisJCWlmICgodlNlbGVjdGVkUGFja2FnZSAhPSBudWxsKQorCQkJJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZFBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcykgIT0gbnVsbCkpIHsKKwkJCUlTTG9jYWxBbmFseXNpcyB2TG9jYWxBbmFseXNpcyA9CisJCQkJKElTTG9jYWxBbmFseXNpcykgVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkUGFja2FnZSwgSVNMb2NhbEFuYWx5c2lzLmNsYXNzKTsKIAotICAgICAgICAgICAgaWYgKHZMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KHZTZWxlY3RlZFBhY2thZ2UpOwotICAgICAgICAgICAgIC8vIFJldHJpZXZlICdTeXN0ZW1FdmVudHNMaWJyYXJ5JyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgUGFja2FnZSB2U3lzdGVtRXZlbnRzTGlicmFyeVBhY2thZ2UgPSB2TG9jYWxBbmFseXNpcy5nZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpLmdldEJhc2VfUGFja2FnZSgpOworCQkJaWYgKHZMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgPT0gbnVsbCkgeworCQkJCUVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KHZTZWxlY3RlZFBhY2thZ2UpOworCQkJIC8vIFJldHJpZXZlICdTeXN0ZW1FdmVudHNMaWJyYXJ5JyBwYWNrYWdlCisJCQkJUGFja2FnZSB2U3lzdGVtRXZlbnRzTGlicmFyeVBhY2thZ2UgPSB2TG9jYWxBbmFseXNpcy5nZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpLmdldEJhc2VfUGFja2FnZSgpOwogCi0gICAgICAgICAgICAgICAgaWYgKHZTeXN0ZW1FdmVudHNMaWJyYXJ5UGFja2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBTeXN0ZW1FdmVudHNMaWJyYXJ5IHRhYmxlCi0gICAgICAgICAgICAgICAgICAgIEVTRlRhYmxlc1V0aWwuY3JlYXRlVGFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVGFibGVzU2V0LlNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UQUJMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgdlN5c3RlbUV2ZW50c0xpYnJhcnlQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisJCQkJaWYgKHZTeXN0ZW1FdmVudHNMaWJyYXJ5UGFja2FnZSAhPSBudWxsKSB7CisJCQkJCS8vIENyZWF0ZSBTeXN0ZW1FdmVudHNMaWJyYXJ5IHRhYmxlCisJCQkJCUVTRlRhYmxlc1V0aWwuY3JlYXRlVGFibGUoCisJCQkJCQlFU0ZMb2NhbEFuYWx5c2lzVGFibGVzU2V0LlNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX0lELAorCQkJCQkJRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UQUJMRV9OQU1FLAorCQkJCQkJdlN5c3RlbUV2ZW50c0xpYnJhcnlQYWNrYWdlKTsKKwkJCQl9CisJCQl9CiAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlSGFuZGxlci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlSGFuZGxlci5qYXZhCmluZGV4IDIzNjg0MGIuLjI4M2E5ZTcgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZUhhbmRsZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5VGFibGVIYW5kbGVyLmphdmEKQEAgLTMwLDM2ICszMCwzNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgQ3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZUhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZUhhbmRsZXIoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIENyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5VGFibGVIYW5kbGVyKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU1N5dGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlKSBhbmQgY2FsbCB0aGUgYWN0aW9uIGZvciBjcmVhdGluZyBhIFNTeXRlbUV2ZW50c0xpYnJhcnkKLSAgICAgKiBUYWJsZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkvKioKKwkgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFNTeXRlbUV2ZW50c0xpYnJhcnkgcGFja2FnZSkgYW5kIGNhbGwgdGhlIGFjdGlvbiBmb3IgY3JlYXRpbmcgYSBTU3l0ZW1FdmVudHNMaWJyYXJ5CisJICogVGFibGUuCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IHBFdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgUGFja2FnZSB2U2VsZWN0ZWRQYWNrYWdlID0KLSAgICAgICAgICAgIChQYWNrYWdlKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2UoKSk7CisJCWZpbmFsIFBhY2thZ2UgdlNlbGVjdGVkUGFja2FnZSA9CisJCQkoUGFja2FnZSkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlKCkpOwogCi0gICAgICAgIGlmICgodlNlbGVjdGVkUGFja2FnZSAhPSBudWxsKQotICAgICAgICAgICAgJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZFBhY2thZ2UsIElTU3lzdGVtRXZlbnRzTGlicmFyeS5jbGFzcykgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIEVTRlRhYmxlc1V0aWwuY3JlYXRlVGFibGUoCi0gICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UQUJMRV9JRCwKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVGFibGVzU2V0LlNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX05BTUUsCi0gICAgICAgICAgICAgICAgdlNlbGVjdGVkUGFja2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCQlpZiAoKHZTZWxlY3RlZFBhY2thZ2UgIT0gbnVsbCkKKwkJCSYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRQYWNrYWdlLCBJU1N5c3RlbUV2ZW50c0xpYnJhcnkuY2xhc3MpICE9IG51bGwpKSB7CisJCQlFU0ZUYWJsZXNVdGlsLmNyZWF0ZVRhYmxlKAorCQkJCUVTRkxvY2FsQW5hbHlzaXNUYWJsZXNTZXQuU1NZU1RFTUVWRU5UU0xJQlJBUllfVEFCTEVfSUQsCisJCQkJRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UQUJMRV9OQU1FLAorCQkJCXZTZWxlY3RlZFBhY2thZ2UpOworCQl9CisJCXJldHVybiBudWxsOworCX0KIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vdWkvaGFuZGxlci9TdGFydE5ld0xvY2FsQW5hbHlzaXNIYW5kbGVyLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1N0YXJ0TmV3TG9jYWxBbmFseXNpc0hhbmRsZXIuamF2YQppbmRleCA2MTM3OGNlLi5jYmI0OGEyIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1N0YXJ0TmV3TG9jYWxBbmFseXNpc0hhbmRsZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1N0YXJ0TmV3TG9jYWxBbmFseXNpc0hhbmRsZXIuamF2YQpAQCAtMzMsNDYgKzMzLDQ2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTdGFydE5ld0xvY2FsQW5hbHlzaXNIYW5kbGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFN0YXJ0TmV3TG9jYWxBbmFseXNpc0hhbmRsZXIoKSB7IH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBTdGFydE5ld0xvY2FsQW5hbHlzaXNIYW5kbGVyKCkgeyB9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgYW5kIHNldHVwIGEgbmV3IExvY2FsIEFuYWx5c2lzLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CisJLyoqCisJICogR2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50IGFuZCBzZXR1cCBhIG5ldyBMb2NhbCBBbmFseXNpcy4KKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIENsYXNzIHZTZWxlY3RlZENsYXNzID0KLSAgICAgICAgICAgIChDbGFzcykgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzc18oKSk7CisJCWZpbmFsIENsYXNzIHZTZWxlY3RlZENsYXNzID0KKwkJCShDbGFzcykgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzc18oKSk7CiAKLSAgICAgICAgaWYgKHZTZWxlY3RlZENsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCWlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRDbGFzcywgSVNCbG9jay5jbGFzcykgPT0gbnVsbCkgewotICAgICAgICAgICAgIAlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgICAgICAJYm9vbGVhbiBhcHBseSA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCAiQ2Fubm90IGV4ZWN1dGUiLCAiSW4gb3JkZXIgdG8gZXhlY3V0ZSB0aGlzIGNvbW1hbmQsIHBsZWFzZSBhcHBseSB0aGUgc3RlcmVvdHlwZSBTQmxvY2sgdG8gdGhlIGNsYXNzLiBTaG91bGQgdGhlIHRvb2wgYXBwbHkgRVNGIHN0ZXJlb3R5cGVzIG9uIHRoZSB3aG9sZSBtb2RlbD8iKTsKLSAgICAJCQlpZiAoYXBwbHkpIHsKLSAgICAJCQkJaWYgKHZTZWxlY3RlZENsYXNzLmdldE1vZGVsKCkgIT0gbnVsbCkgewotICAgIAkJCQkJQXBwbHlFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c0Fubm90YXRpb24uYXBwbHlBbm5vdGF0aW9uT25VTUxNb2RlbCh2U2VsZWN0ZWRDbGFzcy5nZXRNb2RlbCgpKTsKLSAgICAJCQkJfQotICAgIAkJCQllbHNlIHsKLSAgICAJCQkJCS8vIGVycm9yIG1lc3NhZ2UKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCWlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRDbGFzcywgSVNCbG9jay5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAJCU5ld0xvY2FsQW5hbHlzaXNTZXR1cC5zZXR1cChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRDbGFzcywgSVNCbG9jay5jbGFzcykpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworCQlpZiAodlNlbGVjdGVkQ2xhc3MgIT0gbnVsbCkgeworCQkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBJU0Jsb2NrLmNsYXNzKSA9PSBudWxsKSB7CisJCQkgCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJCQlib29sZWFuIGFwcGx5ID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oc2hlbGwsICJDYW5ub3QgZXhlY3V0ZSIsICJJbiBvcmRlciB0byBleGVjdXRlIHRoaXMgY29tbWFuZCwgcGxlYXNlIGFwcGx5IHRoZSBzdGVyZW90eXBlIFNCbG9jayB0byB0aGUgY2xhc3MuIFNob3VsZCB0aGUgdG9vbCBhcHBseSBFU0Ygc3RlcmVvdHlwZXMgb24gdGhlIHdob2xlIG1vZGVsPyIpOworCQkJCWlmIChhcHBseSkgeworCQkJCQlpZiAodlNlbGVjdGVkQ2xhc3MuZ2V0TW9kZWwoKSAhPSBudWxsKSB7CisJCQkJCQlBcHBseUVTRkFyY2hpdGVjdHVyZUNvbmNlcHRzQW5ub3RhdGlvbi5hcHBseUFubm90YXRpb25PblVNTE1vZGVsKHZTZWxlY3RlZENsYXNzLmdldE1vZGVsKCkpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLy8gZXJyb3IgbWVzc2FnZQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBJU0Jsb2NrLmNsYXNzKSAhPSBudWxsKSB7CisJCQkJTmV3TG9jYWxBbmFseXNpc1NldHVwLnNldHVwKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBJU0Jsb2NrLmNsYXNzKSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CiAgICAKIAkJfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJCXJldHVybiBudWxsOworCX0KIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi9hYm91dC5odG1sIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24vYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL0xvY2FsQW5hbHlzaXNFeGVjdXRpb25BY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL0xvY2FsQW5hbHlzaXNFeGVjdXRpb25BY3RpdmF0b3IuamF2YQppbmRleCAyMmI1MGFkLi5kOWJkNWI4IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMuZXhlY3V0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL2V4ZWN1dGlvbi9Mb2NhbEFuYWx5c2lzRXhlY3V0aW9uQWN0aXZhdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vTG9jYWxBbmFseXNpc0V4ZWN1dGlvbkFjdGl2YXRvci5qYXZhCkBAIC0yMyw4MyArMjMsODMgQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQW5hbHlzaXNFeGVjdXRpb25BY3RpdmF0b3IgZXh0ZW5kcyBFTUZQbHVnaW4gaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxBbmFseXNpc0V4ZWN1dGlvbkFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBMb2NhbEFuYWx5c2lzRXhlY3V0aW9uQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9jYWxBbmFseXNpc0V4ZWN1dGlvbkFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBMb2NhbEFuYWx5c2lzRXhlY3V0aW9uQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYWxBbmFseXNpc0V4ZWN1dGlvbkFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgTG9jYWxBbmFseXNpc0V4ZWN1dGlvbkFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgQnVuZGxleENvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKLSAgICAgKi8KLSAgICBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc0J1bmRsZUNvbnRleHQ7Ci0gICAgfQorCS8qKgorCSAqIEdldCBCdW5kbGV4Q29udGV4dC4KKwkgKgorCSAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAorCSAqLworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKIAotICAgIH0KKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICB9CisJCQkvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCisJCQlzUGx1Z2luID0gdGhpczsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5leGVjdXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvZXhlY3V0aW9uL3NldHVwL05ld0xvY2FsQW5hbHlzaXNTZXR1cC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vc2V0dXAvTmV3TG9jYWxBbmFseXNpc1NldHVwLmphdmEKaW5kZXggZDAwMDRiMi4uMWIzMjI5ZSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vc2V0dXAvTmV3TG9jYWxBbmFseXNpc1NldHVwLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLmV4ZWN1dGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9leGVjdXRpb24vc2V0dXAvTmV3TG9jYWxBbmFseXNpc1NldHVwLmphdmEKQEAgLTM1LDc0ICszNSw3NCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTmV3TG9jYWxBbmFseXNpc1NldHVwIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3JyLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgTmV3TG9jYWxBbmFseXNpc1NldHVwKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KKwkgKi8KKwlwcml2YXRlIE5ld0xvY2FsQW5hbHlzaXNTZXR1cCgpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBTZXR1cCBvZiBhIG5ldyBMb2NhbCBBbmFseXNpcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwU0Jsb2NrIFRoZSBTQmxvY2sgdG8gYmUgYW5hbHlzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoZmluYWwgSVNCbG9jayBwU0Jsb2NrKSB7CisJLyoqCisJICogU2V0dXAgb2YgYSBuZXcgTG9jYWwgQW5hbHlzaXMuCisJICoKKwkgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHRvIGJlIGFuYWx5c2VkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKGZpbmFsIElTQmxvY2sgcFNCbG9jaykgewogCi0gICAgICAgIE1vZGVsIHZFU0ZNb2RlbCA9IE1vZGVsVXRpbC5nZXRXb3JraW5nTW9kZWwoKTsKLSAgICAgICAgaWYgKHZFU0ZNb2RlbCAhPSBudWxsKSB7CisJCU1vZGVsIHZFU0ZNb2RlbCA9IE1vZGVsVXRpbC5nZXRXb3JraW5nTW9kZWwoKTsKKwkJaWYgKHZFU0ZNb2RlbCAhPSBudWxsKSB7CiAKLSAgICAgICAgCS8vIGFzc3VyZSB0aGF0IG1vZGVsIGlzIHdyaXRhYmxlCi0gICAgICAgIAlSZWFkT25seU1hbmFnZXIuZ2V0UmVhZE9ubHlIYW5kbGVyKFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHZFU0ZNb2RlbCkpLm1ha2VXcml0YWJsZShSZWFkT25seUF4aXMuYW55QXhpcygpLCBwU0Jsb2NrLmdldEJhc2VfQ2xhc3MoKSk7CisJCQkvLyBhc3N1cmUgdGhhdCBtb2RlbCBpcyB3cml0YWJsZQorCQkJUmVhZE9ubHlNYW5hZ2VyLmdldFJlYWRPbmx5SGFuZGxlcihUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbih2RVNGTW9kZWwpKS5tYWtlV3JpdGFibGUoUmVhZE9ubHlBeGlzLmFueUF4aXMoKSwgcFNCbG9jay5nZXRCYXNlX0NsYXNzKCkpOwogCi0gICAgICAgICAgICAvLyBSZXRyaWV2ZSAnU1NhZmV0eUFydGlmYWN0cycgcGFja2FnZQotICAgICAgICAgICAgSVNTYWZldHlBcnRpZmFjdHMgdlNTYWZldHlBcnRpZmFjdHMgPSBFU0ZTYWZldHlDb25jZXB0c1V0aWwuZ2V0U1NhZmV0eUFydGlmYWN0cyh2RVNGTW9kZWwpOworCQkJLy8gUmV0cmlldmUgJ1NTYWZldHlBcnRpZmFjdHMnIHBhY2thZ2UKKwkJCUlTU2FmZXR5QXJ0aWZhY3RzIHZTU2FmZXR5QXJ0aWZhY3RzID0gRVNGU2FmZXR5Q29uY2VwdHNVdGlsLmdldFNTYWZldHlBcnRpZmFjdHModkVTRk1vZGVsKTsKIAotICAgICAgICAgICAgaWYgKHZTU2FmZXR5QXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCWlmICh2U1NhZmV0eUFydGlmYWN0cyAhPSBudWxsKSB7CiAKLSAgICAgICAgICAgIAkvLyBSZXRyaWV2ZSAnU0xvY2FsQW5hbHlzaXMnCi0gICAgICAgICAgICAgICAgSVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9Ci0gICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNVdGlsLmdldFNMb2NhbEFuYWx5c2lzKHZTU2FmZXR5QXJ0aWZhY3RzLmdldEJhc2VfUGFja2FnZSgpKTsKKwkJCQkvLyBSZXRyaWV2ZSAnU0xvY2FsQW5hbHlzaXMnCisJCQkJSVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9CisJCQkJCUVTRkxvY2FsQW5hbHlzaXNVdGlsLmdldFNMb2NhbEFuYWx5c2lzKHZTU2FmZXR5QXJ0aWZhY3RzLmdldEJhc2VfUGFja2FnZSgpKTsKIAotICAgICAgICAgICAgICAgIGlmICh2U0xvY2FsQW5hbHlzaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoRVNGTG9jYWxBbmFseXNpc1V0aWwuZ2V0U0Jsb2NrTEFuYWx5c2lzQnlTQmxvY2sodlNMb2NhbEFuYWx5c2lzLCBwU0Jsb2NrKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgU0Jsb2NrTEFuYWx5c2lzIGluICdTTG9jYWxBbmFseXNpcycKLSAgICAgICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNCbG9ja0xBbmFseXNpcyh2U0xvY2FsQW5hbHlzaXMuZ2V0QmFzZV9QYWNrYWdlKCksIHBTQmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVXRpbC5nZXRTQmxvY2tMQW5hbHlzaXNCeVNCbG9jayh2U0xvY2FsQW5hbHlzaXMsIHBTQmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIEVTRkxvY2FsQW5hbHlzaXMgZGlhZ3JhbQotICAgICAgICAgICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1VdGlsLmNyZWF0ZURpYWdyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc0RpYWdyYW1TZXQuRVNGTE9DQUxBTkFMWVNJU19ESUFHUkFNX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdlNCbG9ja0xBbmFseXNpcy5nZXRCYXNlX0NsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJaWYgKHZTTG9jYWxBbmFseXNpcyAhPSBudWxsKSB7CisJCQkJCWlmIChFU0ZMb2NhbEFuYWx5c2lzVXRpbC5nZXRTQmxvY2tMQW5hbHlzaXNCeVNCbG9jayh2U0xvY2FsQW5hbHlzaXMsIHBTQmxvY2spID09IG51bGwpIHsKKwkJCQkJCS8vIENyZWF0ZSBTQmxvY2tMQW5hbHlzaXMgaW4gJ1NMb2NhbEFuYWx5c2lzJworCQkJCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKHZTTG9jYWxBbmFseXNpcy5nZXRCYXNlX1BhY2thZ2UoKSwgcFNCbG9jayk7CisJCQkJCQlJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPQorCQkJCQkJCUVTRkxvY2FsQW5hbHlzaXNVdGlsLmdldFNCbG9ja0xBbmFseXNpc0J5U0Jsb2NrKHZTTG9jYWxBbmFseXNpcywgcFNCbG9jayk7CisJCQkJCQkvLyBDcmVhdGUgRVNGTG9jYWxBbmFseXNpcyBkaWFncmFtCisJCQkJCQlFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbVV0aWwuY3JlYXRlRGlhZ3JhbSgKKwkJCQkJCQlFU0ZMb2NhbEFuYWx5c2lzRGlhZ3JhbVNldC5FU0ZMT0NBTEFOQUxZU0lTX0RJQUdSQU1fTkFNRSwKKwkJCQkJCQl2U0Jsb2NrTEFuYWx5c2lzLmdldEJhc2VfQ2xhc3MoKSk7CisJCQkJCX0KIAotICAgICAgICAgICAgICAgICAgICBpZiAodlNMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkodlNMb2NhbEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAodlNMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgPT0gbnVsbCkgeworCQkJCQkJY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkodlNMb2NhbEFuYWx5c2lzKTsKKwkJCQkJfQogCi0gICAgICAgICAgICAgICAgICAgIGlmICh2U0xvY2FsQW5hbHlzaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVXRpbC5jcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeSh2U0xvY2FsQW5hbHlzaXMuZ2V0QmFzZV9QYWNrYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCQkJCQlpZiAodlNMb2NhbEFuYWx5c2lzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgPT0gbnVsbCkgeworCQkJCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkodlNMb2NhbEFuYWx5c2lzLmdldEJhc2VfUGFja2FnZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgU1N5c3RlbUV2ZW50c0xpYnJhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNMb2NhbEFuYWx5c2lzIFRoZSBTTG9jYWxBbmFseXNpcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkoZmluYWwgSVNMb2NhbEFuYWx5c2lzIHBTTG9jYWxBbmFseXNpcykgewotICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVXRpbC5jcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeShwU0xvY2FsQW5hbHlzaXMuZ2V0QmFzZV9QYWNrYWdlKCkpOwotICAgICAgICBpZiAocFNMb2NhbEFuYWx5c2lzICE9IG51bGwpIHsKLSAgICAgICAgICAgIElTU3lzdGVtRXZlbnRzTGlicmFyeSB2U1N5c3RlbUV2ZW50c0xpYnJhcnkgPSBwU0xvY2FsQW5hbHlzaXMuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgICAgIGlmICh2U1N5c3RlbUV2ZW50c0xpYnJhcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVTRlRhYmxlc1V0aWwuY3JlYXRlVGFibGUoCi0gICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNUYWJsZXNTZXQuU1NZU1RFTUVWRU5UU0xJQlJBUllfVEFCTEVfSUQsCi0gICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNUYWJsZXNTZXQuU1NZU1RFTUVWRU5UU0xJQlJBUllfVEFCTEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgdlNTeXN0ZW1FdmVudHNMaWJyYXJ5LmdldEJhc2VfUGFja2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIFNTeXN0ZW1FdmVudHNMaWJyYXJ5LgorCSAqCisJICogQHBhcmFtIHBTTG9jYWxBbmFseXNpcyBUaGUgU0xvY2FsQW5hbHlzaXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KGZpbmFsIElTTG9jYWxBbmFseXNpcyBwU0xvY2FsQW5hbHlzaXMpIHsKKwkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkocFNMb2NhbEFuYWx5c2lzLmdldEJhc2VfUGFja2FnZSgpKTsKKwkJaWYgKHBTTG9jYWxBbmFseXNpcyAhPSBudWxsKSB7CisJCQlJU1N5c3RlbUV2ZW50c0xpYnJhcnkgdlNTeXN0ZW1FdmVudHNMaWJyYXJ5ID0gcFNMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJCQlpZiAodlNTeXN0ZW1FdmVudHNMaWJyYXJ5ICE9IG51bGwpIHsKKwkJCQlFU0ZUYWJsZXNVdGlsLmNyZWF0ZVRhYmxlKAorCQkJCQlFU0ZMb2NhbEFuYWx5c2lzVGFibGVzU2V0LlNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX0lELAorCQkJCQlFU0ZMb2NhbEFuYWx5c2lzVGFibGVzU2V0LlNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX05BTUUsCisJCQkJCXZTU3lzdGVtRXZlbnRzTGlicmFyeS5nZXRCYXNlX1BhY2thZ2UoKSk7CisJCQl9CisJCX0KKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5tZXRhbW9kZWwvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5tZXRhbW9kZWwvYWJvdXQuaHRtbAppbmRleCBkMzVkNWFlLi43NzhlMWJhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMubWV0YW1vZGVsL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLm1ldGFtb2RlbC9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMubWV0YW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL21ldGFtb2RlbC9FU0ZMb2NhbEFuYWx5c2lzTWV0YW1vZGVsQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMubWV0YW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL21ldGFtb2RlbC9FU0ZMb2NhbEFuYWx5c2lzTWV0YW1vZGVsQWN0aXZhdG9yLmphdmEKaW5kZXggMTk0YjZjNC4uMzM5NTQ1ZiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLm1ldGFtb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9tZXRhbW9kZWwvRVNGTG9jYWxBbmFseXNpc01ldGFtb2RlbEFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5tZXRhbW9kZWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvbWV0YW1vZGVsL0VTRkxvY2FsQW5hbHlzaXNNZXRhbW9kZWxBY3RpdmF0b3IuamF2YQpAQCAtMjEsNTIgKzIxLDUyIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OSAkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZMb2NhbEFuYWx5c2lzTWV0YW1vZGVsQWN0aXZhdG9yCi0gICAgZXh0ZW5kcyBFTUZQbHVnaW4geworCWV4dGVuZHMgRU1GUGx1Z2luIHsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkxvY2FsQW5hbHlzaXNNZXRhbW9kZWxBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGTG9jYWxBbmFseXNpc01ldGFtb2RlbEFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkxvY2FsQW5hbHlzaXNNZXRhbW9kZWxBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGTG9jYWxBbmFseXNpc01ldGFtb2RlbEFjdGl2YXRvcigpOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGTG9jYWxBbmFseXNpc01ldGFtb2RlbEFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGTG9jYWxBbmFseXNpc01ldGFtb2RlbEFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICB9CisJCQkvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCisJCQlzUGx1Z2luID0gdGhpczsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUuc2VydmljZS50eXBlcy9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL0VTRkxvY2FsQW5hbHlzaXNTZXJ2aWNlVHlwZXNBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9FU0ZMb2NhbEFuYWx5c2lzU2VydmljZVR5cGVzQWN0aXZhdG9yLmphdmEKaW5kZXggNjE5NDYzYy4uNTI2NTgzOSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL0VTRkxvY2FsQW5hbHlzaXNTZXJ2aWNlVHlwZXNBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3NlcnZpY2UvdHlwZXMvRVNGTG9jYWxBbmFseXNpc1NlcnZpY2VUeXBlc0FjdGl2YXRvci5qYXZhCkBAIC0yNCw4MyArMjQsODMgQEAKICAqLwogcHVibGljIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNTZXJ2aWNlVHlwZXNBY3RpdmF0b3IgZXh0ZW5kcyBFTUZQbHVnaW4gaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc1NlcnZpY2VUeXBlc0FjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZMb2NhbEFuYWx5c2lzU2VydmljZVR5cGVzQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc1NlcnZpY2VUeXBlc0FjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZMb2NhbEFuYWx5c2lzU2VydmljZVR5cGVzQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1NlcnZpY2VUeXBlc0FjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1NlcnZpY2VUeXBlc0FjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgQnVuZGxleENvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKLSAgICAgKi8KLSAgICBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc0J1bmRsZUNvbnRleHQ7Ci0gICAgfQorCS8qKgorCSAqIEdldCBCdW5kbGV4Q29udGV4dC4KKwkgKgorCSAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAorCSAqLworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKIAotICAgIH0KKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICB9CisJCQkvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCisJCQlzUGx1Z2luID0gdGhpczsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9hZHZpY2UvQWZ0ZXJDb25maWd1cmVDb21tYW5kRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2FkdmljZS9BZnRlckNvbmZpZ3VyZUNvbW1hbmRFZGl0SGVscGVyQWR2aWNlLmphdmEKaW5kZXggNTFkYzhiNi4uZjhjYTdmMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2FkdmljZS9BZnRlckNvbmZpZ3VyZUNvbW1hbmRFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2FkdmljZS9BZnRlckNvbmZpZ3VyZUNvbW1hbmRFZGl0SGVscGVyQWR2aWNlLmphdmEKQEAgLTIyLDMxICsyMiwzMSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQWZ0ZXJDb25maWd1cmVDb21tYW5kRWRpdEhlbHBlckFkdmljZQotICAgIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKKwlleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7CiAKLSAgICAvKiogUGFyYW1ldGVyIGlkIHVzZWQgdG8gcGFzcyB0aGUgY29tbWFuZCBmb3Igc2V0dGluZyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfQ09ORklHVVJFX0NPTU1BTkQgPSAiQUZURVJfQ09ORklHVVJFX0NPTU1BTkRfRk9SX1NTWVNURU1FVkVOVFRZUEUiOyAvLyROT04tTkxTLTEkCisJLyoqIFBhcmFtZXRlciBpZCB1c2VkIHRvIHBhc3MgdGhlIGNvbW1hbmQgZm9yIHNldHRpbmcgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX0NPTkZJR1VSRV9DT01NQU5EID0gIkFGVEVSX0NPTkZJR1VSRV9DT01NQU5EX0ZPUl9TU1lTVEVNRVZFTlRUWVBFIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWZ0ZXJDb25maWd1cmVDb21tYW5kRWRpdEhlbHBlckFkdmljZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQWZ0ZXJDb25maWd1cmVDb21tYW5kRWRpdEhlbHBlckFkdmljZSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElDb21tYW5kIGdldEFmdGVyQ29uZmlndXJlQ29tbWFuZChmaW5hbCBDb25maWd1cmVSZXF1ZXN0IHBSZXF1ZXN0KSB7Ci0gICAgICAgIE9iamVjdCB2UGFyYW1ldGVyID0gcFJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFGVEVSX0NPTkZJR1VSRV9DT01NQU5EKTsKLSAgICAgICAgSUNvbW1hbmQgdkFmdGVyQ29uZmlndXJlQ29tbWFuZCA9ICBudWxsOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0QWZ0ZXJDb25maWd1cmVDb21tYW5kKGZpbmFsIENvbmZpZ3VyZVJlcXVlc3QgcFJlcXVlc3QpIHsKKwkJT2JqZWN0IHZQYXJhbWV0ZXIgPSBwUmVxdWVzdC5nZXRQYXJhbWV0ZXIoQUZURVJfQ09ORklHVVJFX0NPTU1BTkQpOworCQlJQ29tbWFuZCB2QWZ0ZXJDb25maWd1cmVDb21tYW5kID0gIG51bGw7CiAKLSAgICAgICAgaWYgKHZQYXJhbWV0ZXIgaW5zdGFuY2VvZiBJQ29tbWFuZCkgewotICAgICAgICAgICAgdkFmdGVyQ29uZmlndXJlQ29tbWFuZCA9IChJQ29tbWFuZCkgdlBhcmFtZXRlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZBZnRlckNvbmZpZ3VyZUNvbW1hbmQgPSBzdXBlci5nZXRBZnRlckNvbmZpZ3VyZUNvbW1hbmQocFJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2QWZ0ZXJDb25maWd1cmVDb21tYW5kOwotICAgIH0KKwkJaWYgKHZQYXJhbWV0ZXIgaW5zdGFuY2VvZiBJQ29tbWFuZCkgeworCQkJdkFmdGVyQ29uZmlndXJlQ29tbWFuZCA9IChJQ29tbWFuZCkgdlBhcmFtZXRlcjsKKwkJfSBlbHNlIHsKKwkJCXZBZnRlckNvbmZpZ3VyZUNvbW1hbmQgPSBzdXBlci5nZXRBZnRlckNvbmZpZ3VyZUNvbW1hbmQocFJlcXVlc3QpOworCQl9CisJCXJldHVybiB2QWZ0ZXJDb25maWd1cmVDb21tYW5kOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9hZHZpY2UvQ3JlYXRlT3JTZWxlY3RTU3lzdGVtRXZlbnRUeXBlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2FkdmljZS9DcmVhdGVPclNlbGVjdFNTeXN0ZW1FdmVudFR5cGVFZGl0SGVscGVyQWR2aWNlLmphdmEKaW5kZXggZTkyZDZhNS4uMzJkNzdmMyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2FkdmljZS9DcmVhdGVPclNlbGVjdFNTeXN0ZW1FdmVudFR5cGVFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2FkdmljZS9DcmVhdGVPclNlbGVjdFNTeXN0ZW1FdmVudFR5cGVFZGl0SGVscGVyQWR2aWNlLmphdmEKQEAgLTQzLDkwICs0Myw5MCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ3JlYXRlT3JTZWxlY3RTU3lzdGVtRXZlbnRUeXBlRWRpdEhlbHBlckFkdmljZQotICAgIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKKwlleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7CiAKLSAgICAvKiogU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlIG5hbWUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNRVZFTlRTTElCUkFSWV9QQUNLQUdFX05BTUUgPSAiU3lzdGVtRXZlbnRzTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlIG5hbWUuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNRVZFTlRTTElCUkFSWV9QQUNLQUdFX05BTUUgPSAiU3lzdGVtRXZlbnRzTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBDcmVhdGUgU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlIGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TWVNURU1FVkVOVFNMSUJSQVJZX1BBQ0tBR0VfTEFCRUwgPSAiQ3JlYXRlIFN5c3RlbUV2ZW50c0xpYnJhcnkgcGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogQ3JlYXRlIFN5c3RlbUV2ZW50c0xpYnJhcnkgcGFja2FnZSBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1lTVEVNRVZFTlRTTElCUkFSWV9QQUNLQUdFX0xBQkVMID0gIkNyZWF0ZSBTeXN0ZW1FdmVudHNMaWJyYXJ5IHBhY2thZ2UiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVhdGVPclNlbGVjdFNTeXN0ZW1FdmVudFR5cGVFZGl0SGVscGVyQWR2aWNlKCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIENyZWF0ZU9yU2VsZWN0U1N5c3RlbUV2ZW50VHlwZUVkaXRIZWxwZXJBZHZpY2UoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8KKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElDb21tYW5kIGdldEJlZm9yZUNvbmZpZ3VyZUNvbW1hbmQoZmluYWwgQ29uZmlndXJlUmVxdWVzdCBwUmVxdWVzdCkgewotICAgICAgICBjb25maWd1cmVSZXF1ZXN0KHBSZXF1ZXN0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJlZm9yZUNvbmZpZ3VyZUNvbW1hbmQocFJlcXVlc3QpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElDb21tYW5kIGdldEJlZm9yZUNvbmZpZ3VyZUNvbW1hbmQoZmluYWwgQ29uZmlndXJlUmVxdWVzdCBwUmVxdWVzdCkgeworCQljb25maWd1cmVSZXF1ZXN0KHBSZXF1ZXN0KTsKKwkJcmV0dXJuIHN1cGVyLmdldEJlZm9yZUNvbmZpZ3VyZUNvbW1hbmQocFJlcXVlc3QpOworCX0KIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBwUmVxdWVzdCBDb25maWd1cmVSZXF1ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWVzdChmaW5hbCBDb25maWd1cmVSZXF1ZXN0IHBSZXF1ZXN0KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdk5ld1BhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkvKioKKwkgKiBAcGFyYW0gcFJlcXVlc3QgQ29uZmlndXJlUmVxdWVzdAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoZmluYWwgQ29uZmlndXJlUmVxdWVzdCBwUmVxdWVzdCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHZOZXdQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CiAKLSAgICAgICAgSUNvbW1hbmQgdkNvbmZpZ3VyZUNvbW1hbmQgPSBudWxsOworCQlJQ29tbWFuZCB2Q29uZmlndXJlQ29tbWFuZCA9IG51bGw7CiAKLSAgICAgICAgU2hlbGwgdlNoZWxsID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgUHJvcGVydHkgdlByb3BlcnR5ID0gKFByb3BlcnR5KSBwUmVxdWVzdC5nZXRFbGVtZW50VG9Db25maWd1cmUoKTsKLSAgICAgICAgQ2xhc3MgdkNsYXNzT3duZXIgPSAoQ2xhc3MpIHZQcm9wZXJ0eS5nZXRPd25lcigpOwotICAgICAgICBQYWNrYWdlIHZQYWNrYWdlID0gdkNsYXNzT3duZXIuZ2V0TmVhcmVzdFBhY2thZ2UoKTsKKwkJU2hlbGwgdlNoZWxsID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJUHJvcGVydHkgdlByb3BlcnR5ID0gKFByb3BlcnR5KSBwUmVxdWVzdC5nZXRFbGVtZW50VG9Db25maWd1cmUoKTsKKwkJQ2xhc3MgdkNsYXNzT3duZXIgPSAoQ2xhc3MpIHZQcm9wZXJ0eS5nZXRPd25lcigpOworCQlQYWNrYWdlIHZQYWNrYWdlID0gdkNsYXNzT3duZXIuZ2V0TmVhcmVzdFBhY2thZ2UoKTsKIAotICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2UGFja2FnZSwgSVNMb2NhbEFuYWx5c2lzLmNsYXNzKTsKKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7CiAKLSAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgUGFja2FnZSB2VGFyZ2V0ID0gZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlQYWNrYWdlKChJU0xvY2FsQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOworCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQlQYWNrYWdlIHZUYXJnZXQgPSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeVBhY2thZ2UoKElTTG9jYWxBbmFseXNpcykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7CiAKLSAgICAgICAgICAgIENyZWF0ZU9yU2VsZWN0VHlwZURpYWxvZyB2RGlhbG9nID0gbmV3IENyZWF0ZU9yU2VsZWN0U1N5c3RlbUV2ZW50VHlwZURpYWxvZyh2U2hlbGwsIHZUYXJnZXQpOworCQkJQ3JlYXRlT3JTZWxlY3RUeXBlRGlhbG9nIHZEaWFsb2cgPSBuZXcgQ3JlYXRlT3JTZWxlY3RTU3lzdGVtRXZlbnRUeXBlRGlhbG9nKHZTaGVsbCwgdlRhcmdldCk7CiAKLSAgICAgICAgICAgIHZEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgaWYgKHZEaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgeworCQkJdkRpYWxvZy5vcGVuKCk7CisJCQlpZiAodkRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7CiAKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ29tbWFuZCB2VHlwZUNyZWF0aW9uQ29tbWFuZCA9IHZEaWFsb2cuZ2V0TmV3VHlwZUNyZWF0ZUNvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHZTU3lzdGVtRXZlbnRUeXBlID0gKFR5cGUpIHZEaWFsb2cuZ2V0RXhpc3RpbmdUeXBlKCk7CisJCQkJZmluYWwgSUNvbW1hbmQgdlR5cGVDcmVhdGlvbkNvbW1hbmQgPSB2RGlhbG9nLmdldE5ld1R5cGVDcmVhdGVDb21tYW5kKCk7CisJCQkJZmluYWwgVHlwZSB2U1N5c3RlbUV2ZW50VHlwZSA9IChUeXBlKSB2RGlhbG9nLmdldEV4aXN0aW5nVHlwZSgpOwogCi0gICAgICAgICAgICAgICAgLy8gQWJvcnQgaWYgdHlwZSBjcmVhdGlvbiBjb21tYW5kIGV4aXN0cyBidXQgaXMgbm90IGV4ZWN1dGFibGUKLSAgICAgICAgICAgICAgICBpZiAoKHZUeXBlQ3JlYXRpb25Db21tYW5kICE9IG51bGwpICYmICghdlR5cGVDcmVhdGlvbkNvbW1hbmQuY2FuRXhlY3V0ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB2Q29uZmlndXJlQ29tbWFuZCA9IFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdkNvbmZpZ3VyZUNvbW1hbmQgPSBDb21wb3NpdGVDb21tYW5kLmNvbXBvc2UodkNvbmZpZ3VyZUNvbW1hbmQsIHZUeXBlQ3JlYXRpb25Db21tYW5kKTsKLSAgICAgICAgICAgICAgICB9CisJCQkJLy8gQWJvcnQgaWYgdHlwZSBjcmVhdGlvbiBjb21tYW5kIGV4aXN0cyBidXQgaXMgbm90IGV4ZWN1dGFibGUKKwkJCQlpZiAoKHZUeXBlQ3JlYXRpb25Db21tYW5kICE9IG51bGwpICYmICghdlR5cGVDcmVhdGlvbkNvbW1hbmQuY2FuRXhlY3V0ZSgpKSkgeworCQkJCQl2Q29uZmlndXJlQ29tbWFuZCA9IFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7CisJCQkJfSBlbHNlIHsKKwkJCQkJdkNvbmZpZ3VyZUNvbW1hbmQgPSBDb21wb3NpdGVDb21tYW5kLmNvbXBvc2UodkNvbmZpZ3VyZUNvbW1hbmQsIHZUeXBlQ3JlYXRpb25Db21tYW5kKTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbmZpZ3VyZSBjb21tYW5kIHRoYXQgd2lsbCBzZXQgdGhlIGNvbnN0cmFpbnQgcHJvcGVydHkgdHlwZQotICAgICAgICAgICAgICAgIElDb21tYW5kIHZTZXRUeXBlQ29tbWFuZCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmVTU3lzdGVtRXZlbnRDb21tYW5kKHBSZXF1ZXN0LCB2U1N5c3RlbUV2ZW50VHlwZSwgdlR5cGVDcmVhdGlvbkNvbW1hbmQpOwotICAgICAgICAgICAgICAgIHZDb25maWd1cmVDb21tYW5kID0gQ29tcG9zaXRlQ29tbWFuZC5jb21wb3NlKHZDb25maWd1cmVDb21tYW5kLCB2U2V0VHlwZUNvbW1hbmQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIkNyZWF0aW9uIGNhbmNlbGxlZCBieSB1c2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KKwkJCQkvLyBDcmVhdGUgdGhlIGNvbmZpZ3VyZSBjb21tYW5kIHRoYXQgd2lsbCBzZXQgdGhlIGNvbnN0cmFpbnQgcHJvcGVydHkgdHlwZQorCQkJCUlDb21tYW5kIHZTZXRUeXBlQ29tbWFuZCA9CisJCQkJCW5ldyBDb25maWd1cmVTU3lzdGVtRXZlbnRDb21tYW5kKHBSZXF1ZXN0LCB2U1N5c3RlbUV2ZW50VHlwZSwgdlR5cGVDcmVhdGlvbkNvbW1hbmQpOworCQkJCXZDb25maWd1cmVDb21tYW5kID0gQ29tcG9zaXRlQ29tbWFuZC5jb21wb3NlKHZDb25maWd1cmVDb21tYW5kLCB2U2V0VHlwZUNvbW1hbmQpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIkNyZWF0aW9uIGNhbmNlbGxlZCBieSB1c2VyIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KIAotICAgICAgICAgICAgdk5ld1BhcmFtZXRlcnMucHV0KEFmdGVyQ29uZmlndXJlQ29tbWFuZEVkaXRIZWxwZXJBZHZpY2UuQUZURVJfQ09ORklHVVJFX0NPTU1BTkQsIHZDb25maWd1cmVDb21tYW5kKTsKLSAgICAgICAgICAgIHBSZXF1ZXN0LmFkZFBhcmFtZXRlcnModk5ld1BhcmFtZXRlcnMpOwotICAgICAgICB9Ci0gICAgfQorCQkJdk5ld1BhcmFtZXRlcnMucHV0KEFmdGVyQ29uZmlndXJlQ29tbWFuZEVkaXRIZWxwZXJBZHZpY2UuQUZURVJfQ09ORklHVVJFX0NPTU1BTkQsIHZDb25maWd1cmVDb21tYW5kKTsKKwkJCXBSZXF1ZXN0LmFkZFBhcmFtZXRlcnModk5ld1BhcmFtZXRlcnMpOworCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgU1N5c3RlbUV2ZW50c0xpYnJhcnkgcGFja2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTG9jYWxBbmFseXNpcyBUaGUgU0xvY2FsQW5hbHlzaXMKLSAgICAgKiBAcmV0dXJuIFRoZSBTU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSBQYWNrYWdlIGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5UGFja2FnZShmaW5hbCBJU0xvY2FsQW5hbHlzaXMgcExvY2FsQW5hbHlzaXMpIHsKLSAgICAgICAgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHZTU3lzdGVtRXZlbnRzTGlicmFyeSA9IHBMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJLyoqCisJICogUmV0cmlldmUgU1N5c3RlbUV2ZW50c0xpYnJhcnkgcGFja2FnZS4KKwkgKgorCSAqIEBwYXJhbSBwTG9jYWxBbmFseXNpcyBUaGUgU0xvY2FsQW5hbHlzaXMKKwkgKiBAcmV0dXJuIFRoZSBTU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlCisJICovCisJcHJpdmF0ZSBQYWNrYWdlIGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5UGFja2FnZShmaW5hbCBJU0xvY2FsQW5hbHlzaXMgcExvY2FsQW5hbHlzaXMpIHsKKwkJSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHZTU3lzdGVtRXZlbnRzTGlicmFyeSA9IHBMb2NhbEFuYWx5c2lzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAgICAgaWYgKHZTU3lzdGVtRXZlbnRzTGlicmFyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVXRpbC5jcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeShwTG9jYWxBbmFseXNpcy5nZXRCYXNlX1BhY2thZ2UoKSk7Ci0gICAgICAgICAgICB2U1N5c3RlbUV2ZW50c0xpYnJhcnkgPSBwTG9jYWxBbmFseXNpcy5nZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOwotICAgICAgICB9CisJCWlmICh2U1N5c3RlbUV2ZW50c0xpYnJhcnkgPT0gbnVsbCkgeworCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkocExvY2FsQW5hbHlzaXMuZ2V0QmFzZV9QYWNrYWdlKCkpOworCQkJdlNTeXN0ZW1FdmVudHNMaWJyYXJ5ID0gcExvY2FsQW5hbHlzaXMuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKKwkJfQogCi0gICAgICAgIHJldHVybiB2U1N5c3RlbUV2ZW50c0xpYnJhcnkuZ2V0QmFzZV9QYWNrYWdlKCk7Ci0gICAgfQorCQlyZXR1cm4gdlNTeXN0ZW1FdmVudHNMaWJyYXJ5LmdldEJhc2VfUGFja2FnZSgpOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9jb21tYW5kL0NvbmZpZ3VyZVNTeXN0ZW1FdmVudENvbW1hbmQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9jb21tYW5kL0NvbmZpZ3VyZVNTeXN0ZW1FdmVudENvbW1hbmQuamF2YQppbmRleCA1NGY4ZTE1Li4yZjI2NjI1IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3NlcnZpY2UvdHlwZXMvY29tbWFuZC9Db25maWd1cmVTU3lzdGVtRXZlbnRDb21tYW5kLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2NvbW1hbmQvQ29uZmlndXJlU1N5c3RlbUV2ZW50Q29tbWFuZC5qYXZhCkBAIC0yOCw0NSArMjgsNDUgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENvbmZpZ3VyZVNTeXN0ZW1FdmVudENvbW1hbmQKLSAgICBleHRlbmRzIENvbmZpZ3VyZUVsZW1lbnRDb21tYW5kIHsKKwlleHRlbmRzIENvbmZpZ3VyZUVsZW1lbnRDb21tYW5kIHsKIAotICAgIC8qKiBUeXBlIG9mIFNTeXN0ZW1FdmVudC4gKi8KLSAgICBwcml2YXRlIFR5cGUgbVNTeXN0ZW1FdmVudFR5cGU7CisJLyoqIFR5cGUgb2YgU1N5c3RlbUV2ZW50LiAqLworCXByaXZhdGUgVHlwZSBtU1N5c3RlbUV2ZW50VHlwZTsKIAotICAgIC8qKiBDb21tYW5kIG9mIHR5cGUgY3JlYXRpb24uICovCi0gICAgcHJpdmF0ZSBJQ29tbWFuZCBtVHlwZUNyZWF0aW9uQ29tbWFuZDsKKwkvKiogQ29tbWFuZCBvZiB0eXBlIGNyZWF0aW9uLiAqLworCXByaXZhdGUgSUNvbW1hbmQgbVR5cGVDcmVhdGlvbkNvbW1hbmQ7CiAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwUmVxdWVzdCBjb25maWd1cmF0aW9uIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcFNTeXN0ZW1FdmVudFR5cGUgdGhlIGZlYXR1cmluZyB0eXBlIG9mIHRoZSBTU3lzdGVtRXZlbnQKLSAgICAgKiBAcGFyYW0gcFR5cGVDcmVhdGlvbkNvbW1hbmQgaWYgbmVlZGVkIGNyZWF0ZSB0aGUgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmVTU3lzdGVtRXZlbnRDb21tYW5kKAotICAgICAgICBmaW5hbCBDb25maWd1cmVSZXF1ZXN0IHBSZXF1ZXN0LAotICAgICAgICBmaW5hbCBUeXBlIHBTU3lzdGVtRXZlbnRUeXBlLAotICAgICAgICBmaW5hbCBJQ29tbWFuZCBwVHlwZUNyZWF0aW9uQ29tbWFuZCkgewotICAgICAgICBzdXBlcihwUmVxdWVzdCk7Ci0gICAgICAgIHRoaXMubVNTeXN0ZW1FdmVudFR5cGUgPSBwU1N5c3RlbUV2ZW50VHlwZTsKLSAgICAgICAgdGhpcy5tVHlwZUNyZWF0aW9uQ29tbWFuZCA9IHBUeXBlQ3JlYXRpb25Db21tYW5kOwotICAgIH0KKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBwUmVxdWVzdCBjb25maWd1cmF0aW9uIHJlcXVlc3QKKwkgKiBAcGFyYW0gcFNTeXN0ZW1FdmVudFR5cGUgdGhlIGZlYXR1cmluZyB0eXBlIG9mIHRoZSBTU3lzdGVtRXZlbnQKKwkgKiBAcGFyYW0gcFR5cGVDcmVhdGlvbkNvbW1hbmQgaWYgbmVlZGVkIGNyZWF0ZSB0aGUgdHlwZQorCSAqLworCXB1YmxpYyBDb25maWd1cmVTU3lzdGVtRXZlbnRDb21tYW5kKAorCQlmaW5hbCBDb25maWd1cmVSZXF1ZXN0IHBSZXF1ZXN0LAorCQlmaW5hbCBUeXBlIHBTU3lzdGVtRXZlbnRUeXBlLAorCQlmaW5hbCBJQ29tbWFuZCBwVHlwZUNyZWF0aW9uQ29tbWFuZCkgeworCQlzdXBlcihwUmVxdWVzdCk7CisJCXRoaXMubVNTeXN0ZW1FdmVudFR5cGUgPSBwU1N5c3RlbUV2ZW50VHlwZTsKKwkJdGhpcy5tVHlwZUNyZWF0aW9uQ29tbWFuZCA9IHBUeXBlQ3JlYXRpb25Db21tYW5kOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KGZpbmFsIElQcm9ncmVzc01vbml0b3IgcE1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgcEluZm8pCi0gICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KGZpbmFsIElQcm9ncmVzc01vbml0b3IgcE1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgcEluZm8pCisJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCi0gICAgICAgIFByb3BlcnR5IHZTU3lzdGVtRXZlbnQgPSAoUHJvcGVydHkpIGdldEVsZW1lbnRUb0VkaXQoKTsKLSAgICAgICAgaWYgKG1TU3lzdGVtRXZlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZTU3lzdGVtRXZlbnQuc2V0VHlwZShtU1N5c3RlbUV2ZW50VHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUeXBlIHZOZXdUeXBlID0gKFR5cGUpIEdNRkNvbW1hbmRVdGlscy5nZXRDb21tYW5kRU9iamVjdFJlc3VsdChtVHlwZUNyZWF0aW9uQ29tbWFuZCk7Ci0gICAgICAgICAgICB2U1N5c3RlbUV2ZW50LnNldFR5cGUodk5ld1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCh2U1N5c3RlbUV2ZW50KTsKLSAgICB9CisJCVByb3BlcnR5IHZTU3lzdGVtRXZlbnQgPSAoUHJvcGVydHkpIGdldEVsZW1lbnRUb0VkaXQoKTsKKwkJaWYgKG1TU3lzdGVtRXZlbnRUeXBlICE9IG51bGwpIHsKKwkJCXZTU3lzdGVtRXZlbnQuc2V0VHlwZShtU1N5c3RlbUV2ZW50VHlwZSk7CisJCX0gZWxzZSB7CisJCQlUeXBlIHZOZXdUeXBlID0gKFR5cGUpIEdNRkNvbW1hbmRVdGlscy5nZXRDb21tYW5kRU9iamVjdFJlc3VsdChtVHlwZUNyZWF0aW9uQ29tbWFuZCk7CisJCQl2U1N5c3RlbUV2ZW50LnNldFR5cGUodk5ld1R5cGUpOworCQl9CisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCh2U1N5c3RlbUV2ZW50KTsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9kaWFsb2cvQ3JlYXRlT3JTZWxlY3RTU3lzdGVtRXZlbnRUeXBlRGlhbG9nLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3NlcnZpY2UvdHlwZXMvZGlhbG9nL0NyZWF0ZU9yU2VsZWN0U1N5c3RlbUV2ZW50VHlwZURpYWxvZy5qYXZhCmluZGV4IDc4YjYxODQuLjRkYThlNTQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9kaWFsb2cvQ3JlYXRlT3JTZWxlY3RTU3lzdGVtRXZlbnRUeXBlRGlhbG9nLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL2RpYWxvZy9DcmVhdGVPclNlbGVjdFNTeXN0ZW1FdmVudFR5cGVEaWFsb2cuamF2YQpAQCAtMjYsMjYgKzI2LDI2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBDcmVhdGVPclNlbGVjdFNTeXN0ZW1FdmVudFR5cGVEaWFsb2cKLSAgICBleHRlbmRzIENyZWF0ZU9yU2VsZWN0VHlwZURpYWxvZyB7CisJZXh0ZW5kcyBDcmVhdGVPclNlbGVjdFR5cGVEaWFsb2cgewogCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIGluaXRpYWxpc2Ugb2YgdGhlIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwU2hlbGwgVGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSBwT3duZXIgVGhlIGFjdGl2aXR5IHRoYXQgb3ducyB0aGUgYWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIENyZWF0ZU9yU2VsZWN0U1N5c3RlbUV2ZW50VHlwZURpYWxvZygKLSAgICAgICAgZmluYWwgU2hlbGwgcFNoZWxsLAotICAgICAgICBmaW5hbCBOYW1lZEVsZW1lbnQgcE93bmVyKSB7Ci0gICAgICAgIHN1cGVyKAotICAgICAgICAgICAgcFNoZWxsLAotICAgICAgICAgICAgcE93bmVyLAotICAgICAgICAgICAgRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoRVNGTG9jYWxBbmFseXNpc1R5cGVzU2V0LlNTWVNURU1FVkVOVFRZUEVfVFlQRV9JRCksCi0gICAgICAgICAgICBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlZEVsZW1lbnRfVHlwZSgpLAotICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudFR5cGUoKSwKLSAgICAgICAgICAgIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKEVTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UWVBFX0lEKSwKLSAgICAgICAgICAgIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VfUGFja2FnZWRFbGVtZW50KCksCi0gICAgICAgICAgICBudWxsKTsKLSAgICB9CisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIGluaXRpYWxpc2Ugb2YgdGhlIGRpYWxvZy4KKwkgKgorCSAqIEBwYXJhbSBwU2hlbGwgVGhlIHBhcmVudCBzaGVsbAorCSAqIEBwYXJhbSBwT3duZXIgVGhlIGFjdGl2aXR5IHRoYXQgb3ducyB0aGUgYWN0aW9uCisJICovCisJcHVibGljIENyZWF0ZU9yU2VsZWN0U1N5c3RlbUV2ZW50VHlwZURpYWxvZygKKwkJZmluYWwgU2hlbGwgcFNoZWxsLAorCQlmaW5hbCBOYW1lZEVsZW1lbnQgcE93bmVyKSB7CisJCXN1cGVyKAorCQkJcFNoZWxsLAorCQkJcE93bmVyLAorCQkJRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoRVNGTG9jYWxBbmFseXNpc1R5cGVzU2V0LlNTWVNURU1FVkVOVFRZUEVfVFlQRV9JRCksCisJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlZEVsZW1lbnRfVHlwZSgpLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudFR5cGUoKSwKKwkJCUVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKEVTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UWVBFX0lEKSwKKwkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VfUGFja2FnZWRFbGVtZW50KCksCisJCQludWxsKTsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9zZXQvRVNGTG9jYWxBbmFseXNpc1R5cGVzU2V0LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3NlcnZpY2UvdHlwZXMvc2V0L0VTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5qYXZhCmluZGV4IDg0NTI3ZWUuLjQ3Yjc3ZGMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2VydmljZS90eXBlcy9zZXQvRVNGTG9jYWxBbmFseXNpc1R5cGVzU2V0LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL3NldC9FU0ZMb2NhbEFuYWx5c2lzVHlwZXNTZXQuamF2YQpAQCAtMTgsMTggKzE4LDE4IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBFU0ZMb2NhbEFuYWx5c2lzVHlwZXNTZXQgewogCi0gICAgLyoqIFNwZWNpYWxpemVkIFR5cGVzIElEIG9mIFNTeXN0ZW1FdmVudHNsaWJyYXJ5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTWVNURU1FVkVOVFNMSUJSQVJZX1RZUEVfSUQgPQotICAgICAgICAib3JnLnBvbGFyc3lzLmVzZi5FU0ZMb2NhbEFuYWx5c2lzLlNTeXN0ZW1FdmVudHNMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBTcGVjaWFsaXplZCBUeXBlcyBJRCBvZiBTU3lzdGVtRXZlbnRzbGlicmFyeS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU1lTVEVNRVZFTlRTTElCUkFSWV9UWVBFX0lEID0KKwkJIm9yZy5wb2xhcnN5cy5lc2YuRVNGTG9jYWxBbmFseXNpcy5TU3lzdGVtRXZlbnRzTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBTcGVjaWFsaXplZCBUeXBlcyBJRCBvZiBTU3lzdGVtRXZlbnRUeXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTWVNURU1FVkVOVFRZUEVfVFlQRV9JRCA9Ci0gICAgICAgICJvcmcucG9sYXJzeXMuZXNmLkVTRkxvY2FsQW5hbHlzaXMuU1N5c3RlbUV2ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogU3BlY2lhbGl6ZWQgVHlwZXMgSUQgb2YgU1N5c3RlbUV2ZW50VHlwZS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU1lTVEVNRVZFTlRUWVBFX1RZUEVfSUQgPQorCQkib3JnLnBvbGFyc3lzLmVzZi5FU0ZMb2NhbEFuYWx5c2lzLlNTeXN0ZW1FdmVudFR5cGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGTG9jYWxBbmFseXNpc1R5cGVzU2V0KCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCisJICovCisJcHJpdmF0ZSBFU0ZMb2NhbEFuYWx5c2lzVHlwZXNTZXQoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudG9vbHMvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS50b29scy9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS50b29scy9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS50b29scy9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS90b29scy9FU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS90b29scy9FU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yLmphdmEKaW5kZXggNDhjZTI0Ny4uNjFhZjU0MiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdG9vbHMvRVNGTG9jYWxBbmFseXNpc1Byb2ZpbGVUb29sc0FjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS50b29scy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3Rvb2xzL0VTRkxvY2FsQW5hbHlzaXNQcm9maWxlVG9vbHNBY3RpdmF0b3IuamF2YQpAQCAtMjMsODMgKzIzLDgzIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yIGV4dGVuZHMgRU1GUGx1Z2luIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNQcm9maWxlVG9vbHNBY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNQcm9maWxlVG9vbHNBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVRvb2xzQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBCdW5kbGV4Q29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OwogCi0gICAgfQorCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdG9vbHMvdXRpbC9FU0ZMb2NhbEFuYWx5c2lzVXRpbC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdG9vbHMvdXRpbC9FU0ZMb2NhbEFuYWx5c2lzVXRpbC5qYXZhCmluZGV4IDJlOTBiN2MuLjlkODhiNTQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS50b29scy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3Rvb2xzL3V0aWwvRVNGTG9jYWxBbmFseXNpc1V0aWwuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS90b29scy91dGlsL0VTRkxvY2FsQW5hbHlzaXNVdGlsLmphdmEKQEAgLTQ3LDM5NSArNDcsMzk1IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBFU0ZMb2NhbEFuYWx5c2lzVXRpbCB7CiAKLSAgICAvKiogU0ZlYXJlZEV2ZW50c0xpYnJhcnkgcGFja2FnZSBuYW1lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNGRUFSRURFVkVOVFNMSUJSQVJZX1BBQ0tBR0VfTkFNRSA9ICJGZWFyZWRFdmVudHNMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBTRmVhcmVkRXZlbnRzTGlicmFyeSBwYWNrYWdlIG5hbWUuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0ZFQVJFREVWRU5UU0xJQlJBUllfUEFDS0FHRV9OQU1FID0gIkZlYXJlZEV2ZW50c0xpYnJhcnkiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQ3JlYXRlIFNGZWFyZWRFdmVudHNMaWJyYXJ5IGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TRkVBUkVERVZFTlRTTElCUkFSWV9MQUJFTCA9ICJDcmVhdGUgU0ZlYXJlZEV2ZW50c0xpYnJhcnkiOyAvLyROT04tTkxTLTEkCisJLyoqIENyZWF0ZSBTRmVhcmVkRXZlbnRzTGlicmFyeSBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU0ZFQVJFREVWRU5UU0xJQlJBUllfTEFCRUwgPSAiQ3JlYXRlIFNGZWFyZWRFdmVudHNMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIENyZWF0ZSBTRmVhcmVkRXZlbnRzRmFtaWx5IGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TRkVBUkVERVZFTlRTRkFNSUxZX0xBQkVMID0gIkNyZWF0ZSBTRmVhcmVkRXZlbnRzRmFtaWx5IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgU0ZlYXJlZEV2ZW50c0ZhbWlseSBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU0ZFQVJFREVWRU5UU0ZBTUlMWV9MQUJFTCA9ICJDcmVhdGUgU0ZlYXJlZEV2ZW50c0ZhbWlseSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBDcmVhdGUgU0ZlYXJlZEV2ZW50IGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TRkVBUkVERVZFTlRfTEFCRUwgPSAiQ3JlYXRlIFNGZWFyZWRFdmVudCI7IC8vJE5PTi1OTFMtMSQKKwkvKiogQ3JlYXRlIFNGZWFyZWRFdmVudCBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU0ZFQVJFREVWRU5UX0xBQkVMID0gIkNyZWF0ZSBTRmVhcmVkRXZlbnQiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogU1N5c3RlbUV2ZW50c0xpYnJhcnkgcGFja2FnZSBuYW1lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTWVNURU1FVkVOVFNMSUJSQVJZX1BBQ0tBR0VfTkFNRSA9ICJTeXN0ZW1FdmVudHNMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBTU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlIG5hbWUuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NZU1RFTUVWRU5UU0xJQlJBUllfUEFDS0FHRV9OQU1FID0gIlN5c3RlbUV2ZW50c0xpYnJhcnkiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQ3JlYXRlIFNTeXN0ZW1FdmVudHNMaWJyYXJ5IGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TU1lTVEVNRVZFTlRTTElCUkFSWV9MQUJFTCA9ICJDcmVhdGUgU1N5c3RlbUV2ZW50c0xpYnJhcnkiOyAvLyROT04tTkxTLTEkCisJLyoqIENyZWF0ZSBTU3lzdGVtRXZlbnRzTGlicmFyeSBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1NZU1RFTUVWRU5UU0xJQlJBUllfTEFCRUwgPSAiQ3JlYXRlIFNTeXN0ZW1FdmVudHNMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIENyZWF0ZSBTU3lzdGVtRXZlbnRUeXBlIGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TU1lTVEVNRVZFTlRUWVBFX0xBQkVMID0gIkNyZWF0ZSBTU3lzdGVtRXZlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgU1N5c3RlbUV2ZW50VHlwZSBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1NZU1RFTUVWRU5UVFlQRV9MQUJFTCA9ICJDcmVhdGUgU1N5c3RlbUV2ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBTTG9jYWxBbmFseXNpcyBwYWNrYWdlIG5hbWUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xPQ0FMQU5BTFlTSVNfUEFDS0FHRV9OQU1FID0gIkxvY2FsQW5hbHlzaXMiOyAvLyROT04tTkxTLTEkCisJLyoqIFNMb2NhbEFuYWx5c2lzIHBhY2thZ2UgbmFtZS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTE9DQUxBTkFMWVNJU19QQUNLQUdFX05BTUUgPSAiTG9jYWxBbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBBcHBseSBFU0ZMb2NhbEFuYWx5c2lzIHByb2ZpbGUgbGFiZWwuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTFlfRVNGTE9DQUxBTkFMWVNJU19QUk9GSUxFX0xBQkVMID0gIkFwcGx5IEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogQXBwbHkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlIGxhYmVsLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX0VTRkxPQ0FMQU5BTFlTSVNfUFJPRklMRV9MQUJFTCA9ICJBcHBseSBFU0ZMb2NhbEFuYWx5c2lzIHByb2ZpbGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogQ3JlYXRlIFNMb2NhbEFuYWx5c2lzIGxhYmVsLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TTE9DQUxBTkFMWVNJU19MQUJFTCA9ICJDcmVhdGUgU0xvY2FsQW5hbHlzaXMiOyAvLyROT04tTkxTLTEkCisJLyoqIENyZWF0ZSBTTG9jYWxBbmFseXNpcyBsYWJlbC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU0xPQ0FMQU5BTFlTSVNfTEFCRUwgPSAiQ3JlYXRlIFNMb2NhbEFuYWx5c2lzIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIENyZWF0ZSBTQmxvY2tfTEEgbGFiZWwuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1NCTE9DS19MQV9MQUJFTCA9ICJDcmVhdGUgU0Jsb2NrX0xBIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgU0Jsb2NrX0xBIGxhYmVsLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TQkxPQ0tfTEFfTEFCRUwgPSAiQ3JlYXRlIFNCbG9ja19MQSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFU0ZMb2NhbEFuYWx5c2lzVXRpbCgpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwcml2YXRlIEVTRkxvY2FsQW5hbHlzaXNVdGlsKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgU3lzdGVtIEV2ZW50cyBMaWJyYXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBTTG9jYWxBbmFseXNpc1BhY2thZ2UgVGhlIExvY2FsQW5hbHlzaXMgcGFja2FnZSB3aGVyZSB0aGUgbGlicmFyeSBtdXN0IGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkoZmluYWwgUGFja2FnZSBwU0xvY2FsQW5hbHlzaXNQYWNrYWdlKSB7Ci0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFNMb2NhbEFuYWx5c2lzUGFja2FnZSk7CisJLyoqCisJICogQ3JlYXRlIHRoZSBTeXN0ZW0gRXZlbnRzIExpYnJhcnkuCisJICoKKwkgKiBAcGFyYW0gcFNMb2NhbEFuYWx5c2lzUGFja2FnZSBUaGUgTG9jYWxBbmFseXNpcyBwYWNrYWdlIHdoZXJlIHRoZSBsaWJyYXJ5IG11c3QgYmUgY3JlYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeShmaW5hbCBQYWNrYWdlIHBTTG9jYWxBbmFseXNpc1BhY2thZ2UpIHsKKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwU0xvY2FsQW5hbHlzaXNQYWNrYWdlKTsKIAotICAgICAgICBSZWNvcmRpbmdDb21tYW5kIHZDcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSA9Ci0gICAgICAgICAgICBuZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBDUkVBVEVfU1NZU1RFTUVWRU5UU0xJQlJBUllfTEFCRUwpIHsKKwkJUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkgPQorCQkJbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NTWVNURU1FVkVOVFNMSUJSQVJZX0xBQkVMKSB7CiAKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgb2JqZWN0ICdTeXN0ZW1FdmVudHNMaWJyYXJ5JyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgdlN5c3RlbUV2ZW50c0xpYnJhcnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNMb2NhbEFuYWx5c2lzUGFja2FnZS5jcmVhdGVOZXN0ZWRQYWNrYWdlKFNTWVNURU1FVkVOVFNMSUJSQVJZX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5ICdTU3lzdGVtRXZlbnRzTGlicmFyeScgc3RlcmVvdHlwZSBvbiAnU3lzdGVtRXZlbnRzTGlicmFyeScgcGFja2FnZQotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U3lzdGVtRXZlbnRzTGlicmFyeSkuYXBwbHlTdGVyZW90eXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgdlN5c3RlbUV2ZW50c0xpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7CisJCQkJCS8vIENyZWF0ZSB0aGUgb2JqZWN0ICdTeXN0ZW1FdmVudHNMaWJyYXJ5JyBwYWNrYWdlCisJCQkJCVBhY2thZ2UgdlN5c3RlbUV2ZW50c0xpYnJhcnkgPQorCQkJCQkJcFNMb2NhbEFuYWx5c2lzUGFja2FnZS5jcmVhdGVOZXN0ZWRQYWNrYWdlKFNTWVNURU1FVkVOVFNMSUJSQVJZX1BBQ0tBR0VfTkFNRSk7CisJCQkJCS8vIEFwcGx5ICdTU3lzdGVtRXZlbnRzTGlicmFyeScgc3RlcmVvdHlwZSBvbiAnU3lzdGVtRXZlbnRzTGlicmFyeScgcGFja2FnZQorCQkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U3lzdGVtRXZlbnRzTGlicmFyeSkuYXBwbHlTdGVyZW90eXBlKAorCQkJCQkJdlN5c3RlbUV2ZW50c0xpYnJhcnksCisJCQkJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSk7CisJCQkJfQorCQkJfTsKIAotICAgICAgICAvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKLSAgICAgICAgaWYgKHZDcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeS5jYW5FeGVjdXRlKCkpIHsKLSAgICAgICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZAotICAgICAgICAgICAgdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmNhbkV4ZWN1dGUoKSkgeworCQkJLy8gRXhlY3V0ZSBjb21tYW5kCisJCQl2RG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodkNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KTsKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgU0ZlYXJlZEV2ZW50c0xpYnJhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNMb2NhbEFuYWx5c2lzUGFja2FnZSBUaGUgTG9jYWxBbmFseXNpcyBwYWNrYWdlIHdoZXJlIHRoZSBsaWJyYXJ5IG11c3QgYmUgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeShmaW5hbCBQYWNrYWdlIHBTTG9jYWxBbmFseXNpc1BhY2thZ2UpIHsKLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwU0xvY2FsQW5hbHlzaXNQYWNrYWdlKTsKKwkvKioKKwkgKiBDcmVhdGUgdGhlIFNGZWFyZWRFdmVudHNMaWJyYXJ5LgorCSAqCisJICogQHBhcmFtIHBTTG9jYWxBbmFseXNpc1BhY2thZ2UgVGhlIExvY2FsQW5hbHlzaXMgcGFja2FnZSB3aGVyZSB0aGUgbGlicmFyeSBtdXN0IGJlIGNyZWF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkoZmluYWwgUGFja2FnZSBwU0xvY2FsQW5hbHlzaXNQYWNrYWdlKSB7CisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFNMb2NhbEFuYWx5c2lzUGFja2FnZSk7CiAKLSAgICAgICAgUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkgPQotICAgICAgICAgICAgbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NGRUFSRURFVkVOVFNMSUJSQVJZX0xBQkVMKSB7CisJCVJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5ID0KKwkJCW5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9TRkVBUkVERVZFTlRTTElCUkFSWV9MQUJFTCkgewogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG9iamVjdCAnRmVhcmVkRXZlbnRzTGlicmFyeScgcGFja2FnZQotICAgICAgICAgICAgICAgICAgICBQYWNrYWdlIHZGZWFyZWRFdmVudHNMaWJyYXJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTTG9jYWxBbmFseXNpc1BhY2thZ2UuY3JlYXRlTmVzdGVkUGFja2FnZShTRkVBUkVERVZFTlRTTElCUkFSWV9QQUNLQUdFX05BTUUpOwotICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSAnU0ZlYXJlZEV2ZW50c0xpYnJhcnknIHN0ZXJlb3R5cGUgb24gJ0ZlYXJlZEV2ZW50c0xpYnJhcnknIHBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodkZlYXJlZEV2ZW50c0xpYnJhcnkpLmFwcGx5U3RlcmVvdHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHZGZWFyZWRFdmVudHNMaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCQkvLyBDcmVhdGUgdGhlIG9iamVjdCAnRmVhcmVkRXZlbnRzTGlicmFyeScgcGFja2FnZQorCQkJCQlQYWNrYWdlIHZGZWFyZWRFdmVudHNMaWJyYXJ5ID0KKwkJCQkJCXBTTG9jYWxBbmFseXNpc1BhY2thZ2UuY3JlYXRlTmVzdGVkUGFja2FnZShTRkVBUkVERVZFTlRTTElCUkFSWV9QQUNLQUdFX05BTUUpOworCQkJCQkvLyBBcHBseSAnU0ZlYXJlZEV2ZW50c0xpYnJhcnknIHN0ZXJlb3R5cGUgb24gJ0ZlYXJlZEV2ZW50c0xpYnJhcnknIHBhY2thZ2UKKwkJCQkJVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodkZlYXJlZEV2ZW50c0xpYnJhcnkpLmFwcGx5U3RlcmVvdHlwZSgKKwkJCQkJCXZGZWFyZWRFdmVudHNMaWJyYXJ5LAorCQkJCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkpOworCQkJCX0KKwkJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2Q3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkpOwotICAgICAgICB9Ci0gICAgfQorCQkvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKKwkJaWYgKHZDcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeS5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeSk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgU1N5c3RlbUV2ZW50VHlwZSBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHBTU3lzdGVtRXZlbnRzTGlicmFyeSBUaGUgU1N5c3RlbUV2ZW50c0xpYnJhcnkgcGFja2FnZSB3aGVyZSB0aGUgU3lzdGVtRXZlbnRUeXBlcyBtdXN0IGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU1N5c3RlbUV2ZW50VHlwZShmaW5hbCBQYWNrYWdlIHBTU3lzdGVtRXZlbnRzTGlicmFyeSkgeworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBTU3lzdGVtRXZlbnRUeXBlIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcFNTeXN0ZW1FdmVudHNMaWJyYXJ5IFRoZSBTU3lzdGVtRXZlbnRzTGlicmFyeSBwYWNrYWdlIHdoZXJlIHRoZSBTeXN0ZW1FdmVudFR5cGVzIG11c3QgYmUgY3JlYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlKGZpbmFsIFBhY2thZ2UgcFNTeXN0ZW1FdmVudHNMaWJyYXJ5KSB7CiAKLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwU1N5c3RlbUV2ZW50c0xpYnJhcnkpOworCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBTU3lzdGVtRXZlbnRzTGlicmFyeSk7CiAKLSAgICAgICAgUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU1N5c3RlbUV2ZW50VHlwZSA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9TU1lTVEVNRVZFTlRUWVBFX0xBQkVMKSB7CisJCVJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZVNTeXN0ZW1FdmVudFR5cGUgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBDUkVBVEVfU1NZU1RFTUVWRU5UVFlQRV9MQUJFTCkgewogCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdk5hbWUgPSBTU3lzdGVtRXZlbnRUeXBlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArIHBTU3lzdGVtRXZlbnRzTGlicmFyeS5nZXRPd25lZEVsZW1lbnRzKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTU3lzdGVtRXZlbnRUeXBlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBDbGFzcyB2U1N5c3RlbUV2ZW50VHlwZSA9IHBTU3lzdGVtRXZlbnRzTGlicmFyeS5jcmVhdGVPd25lZENsYXNzKHZOYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgLy8gQXBwbHkgJ1NTeXN0ZW1FdmVudFR5cGUnIHN0ZXJlb3R5cGUgb24gdGhlIGNyZWF0ZWQgY2xhc3MKLSAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U1N5c3RlbUV2ZW50VHlwZSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGx5U3RlcmVvdHlwZSh2U1N5c3RlbUV2ZW50VHlwZSwgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudFR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKKwkJCQlTdHJpbmcgdk5hbWUgPSBTU3lzdGVtRXZlbnRUeXBlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArIHBTU3lzdGVtRXZlbnRzTGlicmFyeS5nZXRPd25lZEVsZW1lbnRzKCkuc2l6ZSgpOworCQkJCS8vIENyZWF0ZSBhIG5ldyBTU3lzdGVtRXZlbnRUeXBlIGVsZW1lbnQKKwkJCQlDbGFzcyB2U1N5c3RlbUV2ZW50VHlwZSA9IHBTU3lzdGVtRXZlbnRzTGlicmFyeS5jcmVhdGVPd25lZENsYXNzKHZOYW1lLCBmYWxzZSk7CisJCQkJLy8gQXBwbHkgJ1NTeXN0ZW1FdmVudFR5cGUnIHN0ZXJlb3R5cGUgb24gdGhlIGNyZWF0ZWQgY2xhc3MKKwkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U1N5c3RlbUV2ZW50VHlwZSkKKwkJCQkJLmFwcGx5U3RlcmVvdHlwZSh2U1N5c3RlbUV2ZW50VHlwZSwgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudFR5cGUoKSk7CisJCQl9CisJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2Q3JlYXRlU1N5c3RlbUV2ZW50VHlwZS5jYW5FeGVjdXRlKCkpIHsKLSAgICAgICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZAotICAgICAgICAgICAgdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVTU3lzdGVtRXZlbnRUeXBlKTsKLSAgICAgICAgfQotICAgIH0KKwkJLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCisJCWlmICh2Q3JlYXRlU1N5c3RlbUV2ZW50VHlwZS5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVTU3lzdGVtRXZlbnRUeXBlKTsKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBjcmVhdGVTRmVhcmVkRXZlbnQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwUGFyZW50RWxlbWVudCBUaGUgU0ZlYXJlZEV2ZW50c0xpYnJhcnkvU0ZlYXJlZEV2ZW50c0ZhbWlseSBlbGVtZW50IChVTUwpIHdoZXJlIHRoZSBTRmVhcmVkRXZlbnQKLSAgICAgKiBtdXN0IGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU0ZlYXJlZEV2ZW50KGZpbmFsIEVsZW1lbnQgcFBhcmVudEVsZW1lbnQpIHsKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgY3JlYXRlU0ZlYXJlZEV2ZW50IGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcFBhcmVudEVsZW1lbnQgVGhlIFNGZWFyZWRFdmVudHNMaWJyYXJ5L1NGZWFyZWRFdmVudHNGYW1pbHkgZWxlbWVudCAoVU1MKSB3aGVyZSB0aGUgU0ZlYXJlZEV2ZW50CisJICogbXVzdCBiZSBjcmVhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNGZWFyZWRFdmVudChmaW5hbCBFbGVtZW50IHBQYXJlbnRFbGVtZW50KSB7CiAKLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwUGFyZW50RWxlbWVudCk7CisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFBhcmVudEVsZW1lbnQpOwogCi0gICAgICAgIFJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZVNGZWFyZWRFdmVudCA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9TRkVBUkVERVZFTlRfTEFCRUwpIHsKKwkJUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU0ZlYXJlZEV2ZW50ID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NGRUFSRURFVkVOVF9MQUJFTCkgewogCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdk5hbWUgPSBTRmVhcmVkRXZlbnQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgcFBhcmVudEVsZW1lbnQuZ2V0T3duZWRFbGVtZW50cygpLnNpemUoKTsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU0ZlYXJlZEV2ZW50IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBDbGFzcyB2U0ZlYXJlZEV2ZW50Q2xhc3MgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzcygpOwotICAgICAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRDbGFzcy5zZXROYW1lKHZOYW1lKTsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCVN0cmluZyB2TmFtZSA9IFNGZWFyZWRFdmVudC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyBwUGFyZW50RWxlbWVudC5nZXRPd25lZEVsZW1lbnRzKCkuc2l6ZSgpOworCQkJCS8vIENyZWF0ZSBhIG5ldyBTRmVhcmVkRXZlbnQgZWxlbWVudAorCQkJCUNsYXNzIHZTRmVhcmVkRXZlbnRDbGFzcyA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzKCk7CisJCQkJdlNGZWFyZWRFdmVudENsYXNzLnNldE5hbWUodk5hbWUpOwogCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGFja2FnZSkgewotICAgICAgICAgICAgICAgICAgICAoKFBhY2thZ2UpIHBQYXJlbnRFbGVtZW50KS5nZXRQYWNrYWdlZEVsZW1lbnRzKCkuYWRkKHZTRmVhcmVkRXZlbnRDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ2xhc3MpIHBQYXJlbnRFbGVtZW50KS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLmFkZCh2U0ZlYXJlZEV2ZW50Q2xhc3MpOwotICAgICAgICAgICAgICAgIH0KKwkJCQlpZiAocFBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQYWNrYWdlKSB7CisJCQkJCSgoUGFja2FnZSkgcFBhcmVudEVsZW1lbnQpLmdldFBhY2thZ2VkRWxlbWVudHMoKS5hZGQodlNGZWFyZWRFdmVudENsYXNzKTsKKwkJCQl9IGVsc2UgaWYgKHBQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKKwkJCQkJKChDbGFzcykgcFBhcmVudEVsZW1lbnQpLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuYWRkKHZTRmVhcmVkRXZlbnRDbGFzcyk7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgaWYgKHZTRmVhcmVkRXZlbnRDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5ICdTRmVhcmVkRXZlbnQnIHN0ZXJlb3R5cGUgb24gdGhlIGNyZWF0ZWQgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodlNGZWFyZWRFdmVudENsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5U3RlcmVvdHlwZSh2U0ZlYXJlZEV2ZW50Q2xhc3MsIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OworCQkJCWlmICh2U0ZlYXJlZEV2ZW50Q2xhc3MgIT0gbnVsbCkgeworCQkJCQkvLyBBcHBseSAnU0ZlYXJlZEV2ZW50JyBzdGVyZW90eXBlIG9uIHRoZSBjcmVhdGVkIGNsYXNzCisJCQkJCVVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKHZTRmVhcmVkRXZlbnRDbGFzcykKKwkJCQkJCS5hcHBseVN0ZXJlb3R5cGUodlNGZWFyZWRFdmVudENsYXNzLCBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50KCkpOworCQkJCX0KKwkJCX0KKwkJfTsKIAotICAgICAgICAvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKLSAgICAgICAgaWYgKHZDcmVhdGVTRmVhcmVkRXZlbnQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0ZlYXJlZEV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KKwkJLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCisJCWlmICh2Q3JlYXRlU0ZlYXJlZEV2ZW50LmNhbkV4ZWN1dGUoKSkgeworCQkJLy8gRXhlY3V0ZSBjb21tYW5kCisJCQl2RG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodkNyZWF0ZVNGZWFyZWRFdmVudCk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgY3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHBQYXJlbnRFbGVtZW50IFRoZSBTRmVhcmVkRXZlbnRzTGlicmFyeS9TRmVhcmVkRXZlbnRzRmFtaWx5IGVsZW1lbnQgKFVNTCkgd2hlcmUgdGhlIFNGZWFyZWRFdmVudHNGYW1pbHkKLSAgICAgKiBtdXN0IGJlIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseShmaW5hbCBFbGVtZW50IHBQYXJlbnRFbGVtZW50KSB7CisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBwUGFyZW50RWxlbWVudCBUaGUgU0ZlYXJlZEV2ZW50c0xpYnJhcnkvU0ZlYXJlZEV2ZW50c0ZhbWlseSBlbGVtZW50IChVTUwpIHdoZXJlIHRoZSBTRmVhcmVkRXZlbnRzRmFtaWx5CisJICogbXVzdCBiZSBjcmVhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkoZmluYWwgRWxlbWVudCBwUGFyZW50RWxlbWVudCkgewogCi0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFBhcmVudEVsZW1lbnQpOworCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBQYXJlbnRFbGVtZW50KTsKIAotICAgICAgICBSZWNvcmRpbmdDb21tYW5kIHZDcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5ID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NGRUFSRURFVkVOVFNGQU1JTFlfTEFCRUwpIHsKKwkJUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9TRkVBUkVERVZFTlRTRkFNSUxZX0xBQkVMKSB7CiAKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB2TmFtZSA9IFNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgcFBhcmVudEVsZW1lbnQuZ2V0T3duZWRFbGVtZW50cygpLnNpemUoKTsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU0ZlYXJlZEV2ZW50c0ZhbWlseSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdlNGZWFyZWRFdmVudHNGYW1pbHlDbGFzcyA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNGYW1pbHlDbGFzcy5zZXROYW1lKHZOYW1lKTsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCVN0cmluZyB2TmFtZSA9IFNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgcFBhcmVudEVsZW1lbnQuZ2V0T3duZWRFbGVtZW50cygpLnNpemUoKTsKKwkJCQkvLyBDcmVhdGUgYSBuZXcgU0ZlYXJlZEV2ZW50c0ZhbWlseSBlbGVtZW50CisJCQkJQ2xhc3MgdlNGZWFyZWRFdmVudHNGYW1pbHlDbGFzcyA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzKCk7CisJCQkJdlNGZWFyZWRFdmVudHNGYW1pbHlDbGFzcy5zZXROYW1lKHZOYW1lKTsKIAotICAgICAgICAgICAgICAgIGlmIChwUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhY2thZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgKChQYWNrYWdlKSBwUGFyZW50RWxlbWVudCkuZ2V0UGFja2FnZWRFbGVtZW50cygpLmFkZCh2U0ZlYXJlZEV2ZW50c0ZhbWlseUNsYXNzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgKChDbGFzcykgcFBhcmVudEVsZW1lbnQpLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuYWRkKHZTRmVhcmVkRXZlbnRzRmFtaWx5Q2xhc3MpOwotICAgICAgICAgICAgICAgIH0KKwkJCQlpZiAocFBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQYWNrYWdlKSB7CisJCQkJCSgoUGFja2FnZSkgcFBhcmVudEVsZW1lbnQpLmdldFBhY2thZ2VkRWxlbWVudHMoKS5hZGQodlNGZWFyZWRFdmVudHNGYW1pbHlDbGFzcyk7CisJCQkJfSBlbHNlIGlmIChwUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7CisJCQkJCSgoQ2xhc3MpIHBQYXJlbnRFbGVtZW50KS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLmFkZCh2U0ZlYXJlZEV2ZW50c0ZhbWlseUNsYXNzKTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICBpZiAodlNGZWFyZWRFdmVudHNGYW1pbHlDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5ICdTRmVhcmVkRXZlbnRzRmFtaWx5JyBzdGVyZW90eXBlIG9uIHRoZSBjcmVhdGVkIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIFVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKHZTRmVhcmVkRXZlbnRzRmFtaWx5Q2xhc3MpLmFwcGx5U3RlcmVvdHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRzRmFtaWx5Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07CisJCQkJaWYgKHZTRmVhcmVkRXZlbnRzRmFtaWx5Q2xhc3MgIT0gbnVsbCkgeworCQkJCQkvLyBBcHBseSAnU0ZlYXJlZEV2ZW50c0ZhbWlseScgc3RlcmVvdHlwZSBvbiB0aGUgY3JlYXRlZCBjbGFzcworCQkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U0ZlYXJlZEV2ZW50c0ZhbWlseUNsYXNzKS5hcHBseVN0ZXJlb3R5cGUoCisJCQkJCQl2U0ZlYXJlZEV2ZW50c0ZhbWlseUNsYXNzLAorCQkJCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHkoKSk7CisJCQkJfQorCQkJfQorCQl9OwogCi0gICAgICAgIC8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAotICAgICAgICBpZiAodkNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkuY2FuRXhlY3V0ZSgpKSB7CisJCQkvLyBFeGVjdXRlIGNvbW1hbmQKKwkJCXZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgU0xvY2FsQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNhZmV0eUFydGlmYWN0cyBUaGUgU2FmZXR5QXJ0aWZhY3RzIHBhY2thZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU0xvY2FsQW5hbHlzaXMoZmluYWwgUGFja2FnZSBwU2FmZXR5QXJ0aWZhY3RzKSB7Ci0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFNhZmV0eUFydGlmYWN0cyk7CisJLyoqCisJICogQ3JlYXRlIFNMb2NhbEFuYWx5c2lzLgorCSAqCisJICogQHBhcmFtIHBTYWZldHlBcnRpZmFjdHMgVGhlIFNhZmV0eUFydGlmYWN0cyBwYWNrYWdlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKGZpbmFsIFBhY2thZ2UgcFNhZmV0eUFydGlmYWN0cykgeworCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBTYWZldHlBcnRpZmFjdHMpOwogCi0gICAgICAgIFJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZUxvY2FsQW5hbHlzaXNQYWNrYWdlID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NMT0NBTEFOQUxZU0lTX0xBQkVMKSB7CisJCVJlY29yZGluZ0NvbW1hbmQgdkNyZWF0ZUxvY2FsQW5hbHlzaXNQYWNrYWdlID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NMT0NBTEFOQUxZU0lTX0xBQkVMKSB7CiAKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgb2JqZWN0ICdMb2NhbEFuYWx5c2lzJyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgUGFja2FnZSB2TG9jYWxBbmFseXNpcyA9IHBTYWZldHlBcnRpZmFjdHMuY3JlYXRlTmVzdGVkUGFja2FnZShTTE9DQUxBTkFMWVNJU19QQUNLQUdFX05BTUUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBhbmQgYXBwbHkgKGlmIG5lY2Vzc2FyeSkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlCi0gICAgICAgICAgICAgICAgaWYgKHZMb2NhbEFuYWx5c2lzLmdldEFwcGxpZWRQcm9maWxlKEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVOU19QUkVGSVgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1V0aWwuYXBwbHlFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZSh2TG9jYWxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQXBwbHkgJ1NMb2NhbEFuYWx5c2lzJyBzdGVyZW90eXBlIG9uICdMb2NhbEFuYWx5c2lzJyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodkxvY2FsQW5hbHlzaXMpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseVN0ZXJlb3R5cGUodkxvY2FsQW5hbHlzaXMsIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCS8vIENyZWF0ZSB0aGUgb2JqZWN0ICdMb2NhbEFuYWx5c2lzJyBwYWNrYWdlCisJCQkJUGFja2FnZSB2TG9jYWxBbmFseXNpcyA9IHBTYWZldHlBcnRpZmFjdHMuY3JlYXRlTmVzdGVkUGFja2FnZShTTE9DQUxBTkFMWVNJU19QQUNLQUdFX05BTUUpOworCQkJCQorCQkJCS8vIFZlcmlmeSBhbmQgYXBwbHkgKGlmIG5lY2Vzc2FyeSkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlCisJCQkJaWYgKHZMb2NhbEFuYWx5c2lzLmdldEFwcGxpZWRQcm9maWxlKEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVOU19QUkVGSVgpID09IG51bGwpIHsKKwkJCQkJRVNGTG9jYWxBbmFseXNpc1V0aWwuYXBwbHlFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZSh2TG9jYWxBbmFseXNpcyk7CisJCQkJfQorCQkJICAgCisJCQkJLy8gQXBwbHkgJ1NMb2NhbEFuYWx5c2lzJyBzdGVyZW90eXBlIG9uICdMb2NhbEFuYWx5c2lzJyBwYWNrYWdlCisJCQkJVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodkxvY2FsQW5hbHlzaXMpCisJCQkJCS5hcHBseVN0ZXJlb3R5cGUodkxvY2FsQW5hbHlzaXMsIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpcygpKTsKKwkJCX0KKwkJfTsKIAotICAgICAgICAvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKLSAgICAgICAgaWYgKHZDcmVhdGVMb2NhbEFuYWx5c2lzUGFja2FnZS5jYW5FeGVjdXRlKCkpIHsKLSAgICAgICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZAotICAgICAgICAgICAgdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVMb2NhbEFuYWx5c2lzUGFja2FnZSk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkNyZWF0ZUxvY2FsQW5hbHlzaXNQYWNrYWdlLmNhbkV4ZWN1dGUoKSkgeworCQkJLy8gRXhlY3V0ZSBjb21tYW5kCisJCQl2RG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodkNyZWF0ZUxvY2FsQW5hbHlzaXNQYWNrYWdlKTsKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBTQmxvY2tMQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNMb2NhbEFuYWx5c2lzUGFja2FnZSBUaGUgTG9jYWxBbmFseXNpcyBwYWNrYWdlCi0gICAgICogQHBhcmFtIHBTQmxvY2sgVGhlIFNCbG9jayB0byBiZSBsb2NhbCBhbmFseXplZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTQmxvY2tMQW5hbHlzaXMoZmluYWwgUGFja2FnZSBwU0xvY2FsQW5hbHlzaXNQYWNrYWdlLCBmaW5hbCBJU0Jsb2NrIHBTQmxvY2spIHsKLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwU0xvY2FsQW5hbHlzaXNQYWNrYWdlKTsKLSAgICAgICAgUmVjb3JkaW5nQ29tbWFuZCB2Q3JlYXRlU0Jsb2NrTEEgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBDUkVBVEVfU0JMT0NLX0xBX0xBQkVMKSB7CisJLyoqCisJICogQ3JlYXRlIFNCbG9ja0xBbmFseXNpcy4KKwkgKgorCSAqIEBwYXJhbSBwU0xvY2FsQW5hbHlzaXNQYWNrYWdlIFRoZSBMb2NhbEFuYWx5c2lzIHBhY2thZ2UKKwkgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHRvIGJlIGxvY2FsIGFuYWx5emVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNCbG9ja0xBbmFseXNpcyhmaW5hbCBQYWNrYWdlIHBTTG9jYWxBbmFseXNpc1BhY2thZ2UsIGZpbmFsIElTQmxvY2sgcFNCbG9jaykgeworCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBTTG9jYWxBbmFseXNpc1BhY2thZ2UpOworCQlSZWNvcmRpbmdDb21tYW5kIHZDcmVhdGVTQmxvY2tMQSA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIENSRUFURV9TQkxPQ0tfTEFfTEFCRUwpIHsKIAotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBvYmplY3QgJ0NsYXNzJyBvZiBTQmxvY2sgZm9yIExvY2FsIEFuYWx5c2lzCi0gICAgICAgICAgICAgICAgQ2xhc3MgdlNCbG9ja0xBID0gcFNMb2NhbEFuYWx5c2lzUGFja2FnZS5jcmVhdGVPd25lZENsYXNzKHBTQmxvY2suZ2V0TmFtZSgpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyBBcHBseSAnU0Jsb2NrTEFuYWx5c2lzJyBzdGVyZW90eXBlIG9uICdTQmxvY2tMQScKLSAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U0Jsb2NrTEEpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseVN0ZXJlb3R5cGUodlNCbG9ja0xBLCBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzKCkpOworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBvYmplY3QgJ0NsYXNzJyBvZiBTQmxvY2sgZm9yIExvY2FsIEFuYWx5c2lzCisJCQkJQ2xhc3MgdlNCbG9ja0xBID0gcFNMb2NhbEFuYWx5c2lzUGFja2FnZS5jcmVhdGVPd25lZENsYXNzKHBTQmxvY2suZ2V0TmFtZSgpLCB0cnVlKTsKKwkJCQkvLyBBcHBseSAnU0Jsb2NrTEFuYWx5c2lzJyBzdGVyZW90eXBlIG9uICdTQmxvY2tMQScKKwkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U0Jsb2NrTEEpCisJCQkJCS5hcHBseVN0ZXJlb3R5cGUodlNCbG9ja0xBLCBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzKCkpOwogCi0gICAgICAgICAgICAgICAgSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0KLSAgICAgICAgICAgICAgICAgICAgKElTQmxvY2tMQW5hbHlzaXMpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTQmxvY2tMQSwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7CisJCQkJSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0KKwkJCQkJKElTQmxvY2tMQW5hbHlzaXMpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTQmxvY2tMQSwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICAvLyBMaW5rICdTQmxvY2tMQW5hbHlzaXMndG8gJ1NCbG9jaycKLSAgICAgICAgICAgICAgICB2U0Jsb2NrTEFuYWx5c2lzLnNldFNCbG9jayhwU0Jsb2NrKTsKKwkJCQkvLyBMaW5rICdTQmxvY2tMQW5hbHlzaXMndG8gJ1NCbG9jaycKKwkJCQl2U0Jsb2NrTEFuYWx5c2lzLnNldFNCbG9jayhwU0Jsb2NrKTsKIAotICAgICAgICAgICAgICAgIC8vIExpbmsgJ1NCbG9jaycgdG8gJ1NCbG9ja0xBbmFseXNpcycKLSAgICAgICAgICAgICAgICBwU0Jsb2NrLmdldFNTYWZldHlDb25jZXB0c0xpc3QoKS5hZGQodlNCbG9ja0xBbmFseXNpcyk7CisJCQkJLy8gTGluayAnU0Jsb2NrJyB0byAnU0Jsb2NrTEFuYWx5c2lzJworCQkJCXBTQmxvY2suZ2V0U1NhZmV0eUNvbmNlcHRzTGlzdCgpLmFkZCh2U0Jsb2NrTEFuYWx5c2lzKTsKIAotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcG9ydHMgZm9yIFNCbG9ja0xBCi0gICAgICAgICAgICAgICAgZm9yIChJU1BvcnQgdlNQb3J0IDogcFNCbG9jay5nZXRPd25lZFNQb3J0c0xpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICBQb3J0IHZQb3J0TEEgPSB2U0Jsb2NrTEEuY3JlYXRlT3duZWRQb3J0KHZTUG9ydC5nZXROYW1lKCksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSAnU1BvcnRMQW5hbHlzaXMnIHN0ZXJlb3R5cGUgb24gJ1NCbG9ja0xBJwotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2UG9ydExBKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5U3RlcmVvdHlwZSh2UG9ydExBLCBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1BvcnRMQW5hbHlzaXMoKSk7CisJCQkJLy8gQ3JlYXRlIHRoZSBwb3J0cyBmb3IgU0Jsb2NrTEEKKwkJCQlmb3IgKElTUG9ydCB2U1BvcnQgOiBwU0Jsb2NrLmdldE93bmVkU1BvcnRzTGlzdCgpKSB7CisJCQkJCVBvcnQgdlBvcnRMQSA9IHZTQmxvY2tMQS5jcmVhdGVPd25lZFBvcnQodlNQb3J0LmdldE5hbWUoKSwgbnVsbCk7CisJCQkJCS8vIEFwcGx5ICdTUG9ydExBbmFseXNpcycgc3RlcmVvdHlwZSBvbiAnU0Jsb2NrTEEnCisJCQkJCVVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKHZQb3J0TEEpCisJCQkJCQkuYXBwbHlTdGVyZW90eXBlKHZQb3J0TEEsIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTUG9ydExBbmFseXNpcygpKTsKIAotICAgICAgICAgICAgICAgICAgICBJU1BvcnRMQW5hbHlzaXMgdlNQb3J0TEFuYWx5c2lzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChJU1BvcnRMQW5hbHlzaXMpIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZQb3J0TEEsIElTUG9ydExBbmFseXNpcy5jbGFzcyk7CisJCQkJCUlTUG9ydExBbmFseXNpcyB2U1BvcnRMQW5hbHlzaXMgPQorCQkJCQkJKElTUG9ydExBbmFseXNpcykgVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlBvcnRMQSwgSVNQb3J0TEFuYWx5c2lzLmNsYXNzKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBMaW5rICdTUG9ydExBbmFseXNpcycgdG8gJ1NQb3J0JwotICAgICAgICAgICAgICAgICAgICB2U1BvcnRMQW5hbHlzaXMuc2V0U1BvcnQodlNQb3J0KTsKKwkJCQkJLy8gTGluayAnU1BvcnRMQW5hbHlzaXMnIHRvICdTUG9ydCcKKwkJCQkJdlNQb3J0TEFuYWx5c2lzLnNldFNQb3J0KHZTUG9ydCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gTGluayAnU1BvcnQnIHRvICdTUG9ydExBbmFseXNpcycKLSAgICAgICAgICAgICAgICAgICAgdlNQb3J0LmdldFNTYWZldHlDb25jZXB0c0xpc3QoKS5hZGQodlNQb3J0TEFuYWx5c2lzKTsKKwkJCQkJLy8gTGluayAnU1BvcnQnIHRvICdTUG9ydExBbmFseXNpcycKKwkJCQkJdlNQb3J0LmdldFNTYWZldHlDb25jZXB0c0xpc3QoKS5hZGQodlNQb3J0TEFuYWx5c2lzKTsKIAotICAgICAgICAgICAgICAgICAgICBTRGlyZWN0aW9uIHZTRGlyZWN0aW9uID0gdlNQb3J0LmdldFNEaXJlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgdlNQb3J0TEFuYWx5c2lzLnNldFNEaXJlY3Rpb25MQW5hbHlzaXMoU0RpcmVjdGlvbkxBbmFseXNpcy5nZXQodlNEaXJlY3Rpb24uZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKwkJCQkJU0RpcmVjdGlvbiB2U0RpcmVjdGlvbiA9IHZTUG9ydC5nZXRTRGlyZWN0aW9uKCk7CisJCQkJCXZTUG9ydExBbmFseXNpcy5zZXRTRGlyZWN0aW9uTEFuYWx5c2lzKFNEaXJlY3Rpb25MQW5hbHlzaXMuZ2V0KHZTRGlyZWN0aW9uLmdldFZhbHVlKCkpKTsKKwkJCQl9CisJCQl9CisJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2Q3JlYXRlU0Jsb2NrTEEuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2Q3JlYXRlU0Jsb2NrTEEpOwotICAgICAgICB9Ci0gICAgfQorCQkvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKKwkJaWYgKHZDcmVhdGVTQmxvY2tMQS5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZDcmVhdGVTQmxvY2tMQSk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBBcHBseSBFU0ZMb2NhbEFuYWx5c2lzIHByb2ZpbGUgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1vZGVsIFRoZSBtb2RlbCB0YXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZShmaW5hbCBQYWNrYWdlIHBNb2RlbCkgewotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBNb2RlbCk7CisJLyoqCisJICogQXBwbHkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlIHRvIHRoZSBnaXZlbiBtb2RlbCBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIHBNb2RlbCBUaGUgbW9kZWwgdGFyZ2V0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5RVNGTG9jYWxBbmFseXNpc1Byb2ZpbGUoZmluYWwgUGFja2FnZSBwTW9kZWwpIHsKKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwTW9kZWwpOwogCi0gICAgICAgIFJlY29yZGluZ0NvbW1hbmQgdkFwcGx5TEFQcm9maWxlQ21kID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQVBQTFlfRVNGTE9DQUxBTkFMWVNJU19QUk9GSUxFX0xBQkVMKSB7CisJCVJlY29yZGluZ0NvbW1hbmQgdkFwcGx5TEFQcm9maWxlQ21kID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQVBQTFlfRVNGTE9DQUxBTkFMWVNJU19QUk9GSUxFX0xBQkVMKSB7CiAKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZSBhbmQgYXBwbHkgaXQKLSAgICAgICAgICAgICAgICBQcm9maWxlIHZFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZSA9IChQcm9maWxlKSBQYWNrYWdlVXRpbAotICAgICAgICAgICAgICAgICAgICAubG9hZFBhY2thZ2UoVVJJLmNyZWF0ZVVSSShFU0ZMb2NhbEFuYWx5c2lzU2V0LlBST0ZJTEVfUEFUSCksIHBNb2RlbC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCS8vIFJldHJpZXZlIEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZSBhbmQgYXBwbHkgaXQKKwkJCQlQcm9maWxlIHZFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZSA9IChQcm9maWxlKSBQYWNrYWdlVXRpbAorCQkJCQkubG9hZFBhY2thZ2UoVVJJLmNyZWF0ZVVSSShFU0ZMb2NhbEFuYWx5c2lzU2V0LlBST0ZJTEVfUEFUSCksIHBNb2RlbC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKIAotICAgICAgICAgICAgICAgIGlmICh2RVNGTG9jYWxBbmFseXNpc1Byb2ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQYWNrYWdlVXRpbC5hcHBseVByb2ZpbGUocE1vZGVsLCB2RVNGTG9jYWxBbmFseXNpc1Byb2ZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKwkJCQlpZiAodkVTRkxvY2FsQW5hbHlzaXNQcm9maWxlICE9IG51bGwpIHsKKwkJCQkJUGFja2FnZVV0aWwuYXBwbHlQcm9maWxlKHBNb2RlbCwgdkVTRkxvY2FsQW5hbHlzaXNQcm9maWxlLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2QXBwbHlMQVByb2ZpbGVDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2QXBwbHlMQVByb2ZpbGVDbWQpOwotICAgICAgICB9Ci0gICAgfQorCQkvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKKwkJaWYgKHZBcHBseUxBUHJvZmlsZUNtZC5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZBcHBseUxBUHJvZmlsZUNtZCk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgU0xvY2FsQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFNhZmV0eUFydGlmYWN0cyBUaGUgU2FmZXR5QXJ0aWZhY3RzIHBhY2thZ2UKLSAgICAgKiBAcmV0dXJuIFRoZSBTTG9jYWxBbmFseXNpcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVNMb2NhbEFuYWx5c2lzIGdldFNMb2NhbEFuYWx5c2lzKGZpbmFsIFBhY2thZ2UgcFNhZmV0eUFydGlmYWN0cykgewotICAgICAgICBJU0xvY2FsQW5hbHlzaXMgdlNMb2NhbEFuYWx5c2lzID0gRVNGTG9jYWxBbmFseXNpc1V0aWwucmV0cmlldmVTTG9jYWxBbmFseXNpcyhwU2FmZXR5QXJ0aWZhY3RzKTsKKwkvKioKKwkgKiBHZXQgU0xvY2FsQW5hbHlzaXMuCisJICoKKwkgKiBAcGFyYW0gcFNhZmV0eUFydGlmYWN0cyBUaGUgU2FmZXR5QXJ0aWZhY3RzIHBhY2thZ2UKKwkgKiBAcmV0dXJuIFRoZSBTTG9jYWxBbmFseXNpcworCSAqLworCXB1YmxpYyBzdGF0aWMgSVNMb2NhbEFuYWx5c2lzIGdldFNMb2NhbEFuYWx5c2lzKGZpbmFsIFBhY2thZ2UgcFNhZmV0eUFydGlmYWN0cykgeworCQlJU0xvY2FsQW5hbHlzaXMgdlNMb2NhbEFuYWx5c2lzID0gRVNGTG9jYWxBbmFseXNpc1V0aWwucmV0cmlldmVTTG9jYWxBbmFseXNpcyhwU2FmZXR5QXJ0aWZhY3RzKTsKIAotICAgICAgICBpZiAodlNMb2NhbEFuYWx5c2lzID09IG51bGwpIHsKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNMb2NhbEFuYWx5c2lzKHBTYWZldHlBcnRpZmFjdHMpOwotICAgICAgICAgICAgdlNMb2NhbEFuYWx5c2lzID0gcmV0cmlldmVTTG9jYWxBbmFseXNpcyhwU2FmZXR5QXJ0aWZhY3RzKTsKLSAgICAgICAgfQorCQlpZiAodlNMb2NhbEFuYWx5c2lzID09IG51bGwpIHsKKwkJCUVTRkxvY2FsQW5hbHlzaXNVdGlsLmNyZWF0ZVNMb2NhbEFuYWx5c2lzKHBTYWZldHlBcnRpZmFjdHMpOworCQkJdlNMb2NhbEFuYWx5c2lzID0gcmV0cmlldmVTTG9jYWxBbmFseXNpcyhwU2FmZXR5QXJ0aWZhY3RzKTsKKwkJfQogCi0gICAgICAgIHJldHVybiB2U0xvY2FsQW5hbHlzaXM7Ci0gICAgfQorCQlyZXR1cm4gdlNMb2NhbEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIFNMb2NhbEFuYWx5c2lzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBTYWZldHlBcnRpZmFjdHMgVGhlIFNhZmV0eUFydGlmYWN0cyBwYWNrYWdlCi0gICAgICogQHJldHVybiBUaGUgU0xvY2FsQW5hbHlzaXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJU0xvY2FsQW5hbHlzaXMgcmV0cmlldmVTTG9jYWxBbmFseXNpcyhmaW5hbCBQYWNrYWdlIHBTYWZldHlBcnRpZmFjdHMpIHsKLSAgICAgICAgSVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9IG51bGw7Ci0gICAgICAgIEJvb2xlYW4gdkZvdW5kID0gZmFsc2U7Ci0gICAgICAgIExpc3Q8UGFja2FnZT4gdlBhY2thZ2VzTGlzdCA9IHBTYWZldHlBcnRpZmFjdHMuZ2V0TmVzdGVkUGFja2FnZXMoKTsKLSAgICAgICAgSXRlcmF0b3I8UGFja2FnZT4gdkl0ZXJhdG9yID0gdlBhY2thZ2VzTGlzdC5pdGVyYXRvcigpOworCS8qKgorCSAqIFJldHJpZXZlIFNMb2NhbEFuYWx5c2lzLgorCSAqCisJICogQHBhcmFtIHBTYWZldHlBcnRpZmFjdHMgVGhlIFNhZmV0eUFydGlmYWN0cyBwYWNrYWdlCisJICogQHJldHVybiBUaGUgU0xvY2FsQW5hbHlzaXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJU0xvY2FsQW5hbHlzaXMgcmV0cmlldmVTTG9jYWxBbmFseXNpcyhmaW5hbCBQYWNrYWdlIHBTYWZldHlBcnRpZmFjdHMpIHsKKwkJSVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9IG51bGw7CisJCUJvb2xlYW4gdkZvdW5kID0gZmFsc2U7CisJCUxpc3Q8UGFja2FnZT4gdlBhY2thZ2VzTGlzdCA9IHBTYWZldHlBcnRpZmFjdHMuZ2V0TmVzdGVkUGFja2FnZXMoKTsKKwkJSXRlcmF0b3I8UGFja2FnZT4gdkl0ZXJhdG9yID0gdlBhY2thZ2VzTGlzdC5pdGVyYXRvcigpOwogCi0gICAgICAgIHdoaWxlICh2SXRlcmF0b3IuaGFzTmV4dCgpICYmICF2Rm91bmQpIHsKLSAgICAgICAgICAgIFBhY2thZ2UgdlBhY2thZ2UgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB2U0xvY2FsQW5hbHlzaXMgPSAoSVNMb2NhbEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCXdoaWxlICh2SXRlcmF0b3IuaGFzTmV4dCgpICYmICF2Rm91bmQpIHsKKwkJCVBhY2thZ2UgdlBhY2thZ2UgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlBhY2thZ2UsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7CisJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJdkZvdW5kID0gdHJ1ZTsKKwkJCQl2U0xvY2FsQW5hbHlzaXMgPSAoSVNMb2NhbEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJfQorCQl9CiAKLSAgICAgICAgcmV0dXJuIHZTTG9jYWxBbmFseXNpczsKLSAgICB9CisJCXJldHVybiB2U0xvY2FsQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBMb2NhbCBBbmFseXNpcyBvZiBhIFNCbG9jayAoU0Jsb2NrTEFuYWx5c2lzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwU0xvY2FsQW5hbHlzaXMgVGhlIFNMb2NhbEFuYWx5c2lzCi0gICAgICogQHBhcmFtIHBTQmxvY2sgVGhlIFNCbG9jayB3aGljaCBpcyBhbmFseXplZCBieSBTQmxvY2tMQW5hbHlzaXMKLSAgICAgKiBAcmV0dXJuIFRoZSBTQmxvY2tMQW5hbHlzaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzQnlTQmxvY2soCi0gICAgICAgIGZpbmFsIElTTG9jYWxBbmFseXNpcyBwU0xvY2FsQW5hbHlzaXMsCi0gICAgICAgIGZpbmFsIElTQmxvY2sgcFNCbG9jaykgewotICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPSBudWxsOwotICAgICAgICBMaXN0PElTQmxvY2tMQW5hbHlzaXM+IHZTQmxvY2tzTEFuYWx5c2lzTGlzdCA9IHBTTG9jYWxBbmFseXNpcy5nZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpOwotICAgICAgICBJdGVyYXRvcjxJU0Jsb2NrTEFuYWx5c2lzPiB2SXRlcmF0b3IgPSB2U0Jsb2Nrc0xBbmFseXNpc0xpc3QuaXRlcmF0b3IoKTsKKwkvKioKKwkgKiBHZXQgdGhlIExvY2FsIEFuYWx5c2lzIG9mIGEgU0Jsb2NrIChTQmxvY2tMQW5hbHlzaXMpLgorCSAqCisJICogQHBhcmFtIHBTTG9jYWxBbmFseXNpcyBUaGUgU0xvY2FsQW5hbHlzaXMKKwkgKiBAcGFyYW0gcFNCbG9jayBUaGUgU0Jsb2NrIHdoaWNoIGlzIGFuYWx5emVkIGJ5IFNCbG9ja0xBbmFseXNpcworCSAqIEByZXR1cm4gVGhlIFNCbG9ja0xBbmFseXNpcworCSAqLworCXB1YmxpYyBzdGF0aWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXNCeVNCbG9jaygKKwkJZmluYWwgSVNMb2NhbEFuYWx5c2lzIHBTTG9jYWxBbmFseXNpcywKKwkJZmluYWwgSVNCbG9jayBwU0Jsb2NrKSB7CisJCUlTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA9IG51bGw7CisJCUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4gdlNCbG9ja3NMQW5hbHlzaXNMaXN0ID0gcFNMb2NhbEFuYWx5c2lzLmdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCk7CisJCUl0ZXJhdG9yPElTQmxvY2tMQW5hbHlzaXM+IHZJdGVyYXRvciA9IHZTQmxvY2tzTEFuYWx5c2lzTGlzdC5pdGVyYXRvcigpOwogCi0gICAgICAgIHdoaWxlICh2U0Jsb2NrTEFuYWx5c2lzID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgdlNCbG9ja0xBbmFseXNpcyA9IHZJdGVyYXRvci5uZXh0KCk7CisJCXdoaWxlICh2U0Jsb2NrTEFuYWx5c2lzID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJdlNCbG9ja0xBbmFseXNpcyA9IHZJdGVyYXRvci5uZXh0KCk7CiAKLSAgICAgICAgICAgIGlmICghdlNCbG9ja0xBbmFseXNpcy5nZXRTQmxvY2soKS5lcXVhbHMocFNCbG9jaykpIHsKLSAgICAgICAgICAgICAgICB2U0Jsb2NrTEFuYWx5c2lzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlNCbG9ja0xBbmFseXNpczsKLSAgICB9CisJCQlpZiAoIXZTQmxvY2tMQW5hbHlzaXMuZ2V0U0Jsb2NrKCkuZXF1YWxzKHBTQmxvY2spKSB7CisJCQkJdlNCbG9ja0xBbmFseXNpcyA9IG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vRVNGTG9jYWxBbmFseXNpc1Byb2ZpbGVWYWxpZGF0aW9uQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vRVNGTG9jYWxBbmFseXNpc1Byb2ZpbGVWYWxpZGF0aW9uQWN0aXZhdG9yLmphdmEKaW5kZXggOWRkNmFhZS4uNjJkNDM0MSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL0VTRkxvY2FsQW5hbHlzaXNQcm9maWxlVmFsaWRhdGlvbkFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9FU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVZhbGlkYXRpb25BY3RpdmF0b3IuamF2YQpAQCAtMjMsODcgKzIzLDg3IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVZhbGlkYXRpb25BY3RpdmF0b3IKLSAgICBleHRlbmRzIEVNRlBsdWdpbgotICAgIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKKwlleHRlbmRzIEVNRlBsdWdpbgorCWltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkxvY2FsQW5hbHlzaXNQcm9maWxlVmFsaWRhdGlvbkFjdGl2YXRvciBJTlNUQU5DRSA9Ci0gICAgICAgIG5ldyBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVZhbGlkYXRpb25BY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVZhbGlkYXRpb25BY3RpdmF0b3IgSU5TVEFOQ0UgPQorCQluZXcgRVNGTG9jYWxBbmFseXNpc1Byb2ZpbGVWYWxpZGF0aW9uQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1Byb2ZpbGVWYWxpZGF0aW9uQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZMb2NhbEFuYWx5c2lzUHJvZmlsZVZhbGlkYXRpb25BY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IEJ1bmRsZXhDb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBCdW5kbGVDb250ZXh0Ci0gICAgICovCi0gICAgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHNCdW5kbGVDb250ZXh0OwotICAgIH0KKwkvKioKKwkgKiBHZXQgQnVuZGxleENvbnRleHQuCisJICoKKwkgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKKwkgKi8KKwlzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgeworCQlyZXR1cm4gc0J1bmRsZUNvbnRleHQ7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CiAKLSAgICB9CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBudWxsOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVuZHNNb2RlbENvbnN0cmFpbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRW5kc01vZGVsQ29uc3RyYWludC5qYXZhCmluZGV4IGQ0NTVmMzAuLmFkOTNlNWUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRW5kc01vZGVsQ29uc3RyYWludC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRW5kc01vZGVsQ29uc3RyYWludC5qYXZhCkBAIC00Miw4NCArNDIsODQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FbmRzTW9kZWxDb25zdHJhaW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CisJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRW5kc01vZGVsQ29uc3RyYWludCgpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVuZHNNb2RlbENvbnN0cmFpbnQoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBwQ29udGV4dCkgewotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBpZiAocENvbnRleHQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbikgewotICAgICAgICAgICAgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gPSAoSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pIHBDb250ZXh0LmdldFRhcmdldCgpOwotICAgICAgICAgICAgQ29ubmVjdG9yIHZDb25uZWN0b3IgPSB2U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5nZXRCYXNlX0Nvbm5lY3RvcigpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgcENvbnRleHQpIHsKKwkJSVN0YXR1cyB2U3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJaWYgKHBDb250ZXh0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pIHsKKwkJCUlTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uIHZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uID0gKElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKSBwQ29udGV4dC5nZXRUYXJnZXQoKTsKKwkJCUNvbm5lY3RvciB2Q29ubmVjdG9yID0gdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uZ2V0QmFzZV9Db25uZWN0b3IoKTsKIAotICAgICAgICAgICAgYm9vbGVhbiB2SGFzRW5kU0ZhaWx1cmVNb2RlT3duZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gdkhhc0VuZFNGYWlsdXJlTW9kZSA9IGZhbHNlOworCQkJYm9vbGVhbiB2SGFzRW5kU0ZhaWx1cmVNb2RlT3duZXIgPSBmYWxzZTsKKwkJCWJvb2xlYW4gdkhhc0VuZFNGYWlsdXJlTW9kZSA9IGZhbHNlOwogCi0gICAgICAgICAgICBpZiAodkNvbm5lY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8Q29ubmVjdG9yRW5kPiB2SXRlcmF0b3IgPSB2Q29ubmVjdG9yLmdldEVuZHMoKS5pdGVyYXRvcigpOworCQkJaWYgKHZDb25uZWN0b3IgIT0gbnVsbCkgeworCQkJCUl0ZXJhdG9yPENvbm5lY3RvckVuZD4gdkl0ZXJhdG9yID0gdkNvbm5lY3Rvci5nZXRFbmRzKCkuaXRlcmF0b3IoKTsKIAotICAgICAgICAgICAgICAgIHdoaWxlICh2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbm5lY3RvckVuZCB2Q29ubmVjdG9yRW5kID0gKENvbm5lY3RvckVuZCkgdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIodkNvbm5lY3RvckVuZC5nZXRSb2xlKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZIYXNFbmRTRmFpbHVyZU1vZGVPd25lciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTRmFpbHVyZU1vZGVMQW5hbHlzaXModkNvbm5lY3RvckVuZC5nZXRSb2xlKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZIYXNFbmRTRmFpbHVyZU1vZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCQkJCXdoaWxlICh2SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCUNvbm5lY3RvckVuZCB2Q29ubmVjdG9yRW5kID0gKENvbm5lY3RvckVuZCkgdkl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJaWYgKGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIodkNvbm5lY3RvckVuZC5nZXRSb2xlKCkpICE9IG51bGwpIHsKKwkJCQkJCXZIYXNFbmRTRmFpbHVyZU1vZGVPd25lciA9IHRydWU7CisJCQkJCX0gZWxzZSBpZiAoZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTRmFpbHVyZU1vZGVMQW5hbHlzaXModkNvbm5lY3RvckVuZC5nZXRSb2xlKCkpICE9IG51bGwpIHsKKwkJCQkJCXZIYXNFbmRTRmFpbHVyZU1vZGUgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQogCi0gICAgICAgICAgICBpZiAodkhhc0VuZFNGYWlsdXJlTW9kZU93bmVyICYmIHZIYXNFbmRTRmFpbHVyZU1vZGUpIHsKLSAgICAgICAgICAgICAgICB2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlRmFpbHVyZVN0YXR1cyhwQ29udGV4dC5nZXRUYXJnZXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTdGF0dXM7Ci0gICAgfQorCQkJaWYgKHZIYXNFbmRTRmFpbHVyZU1vZGVPd25lciAmJiB2SGFzRW5kU0ZhaWx1cmVNb2RlKSB7CisJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKKwkJCX0gZWxzZSB7CisJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOworCQkJfQorCQl9CisJCXJldHVybiB2U3RhdHVzOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTRmFpbHVyZU1vZGVPd25lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgewotICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOworCS8qKgorCSAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTRmFpbHVyZU1vZGVPd25lci4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCisJICovCisJcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOwogCi0gICAgICAgIEl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXI+PiB2SXRlcmF0b3IgPQotICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1NldC5TRkFJTFVSRU1PREVTT1dORVJfTElTVC5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyPj4gdkl0ZXJhdG9yID0KKwkJCUVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU09XTkVSX0xJU1QuaXRlcmF0b3IoKTsKIAotICAgICAgICB3aGlsZSAoKHZTdGVyZW90eXBlQXBwbGljYXRpb24gPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcj4gdlNGYWlsdXJlTW9kZU93bmVyID0gdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgdlNGYWlsdXJlTW9kZU93bmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICB9CisJCXdoaWxlICgodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyPiB2U0ZhaWx1cmVNb2RlT3duZXIgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U0ZhaWx1cmVNb2RlT3duZXIpOworCQl9CisJCXJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTRmFpbHVyZU1vZGVMQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEVsZW1lbnQgVGhlIFVNTCBFbGVtZW50Ci0gICAgICogQHJldHVybiBUaGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgRU9iamVjdCBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNGYWlsdXJlTW9kZUxBbmFseXNpcyhmaW5hbCBFbGVtZW50IHBFbGVtZW50KSB7Ci0gICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IG51bGw7CisJLyoqCisJICogR2V0IHRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uIG9mIFNGYWlsdXJlTW9kZUxBbmFseXNpcy4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCisJICovCisJcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlTEFuYWx5c2lzKGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKIAotICAgICAgICBJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVC5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IHZJdGVyYXRvciA9CisJCQlFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVC5pdGVyYXRvcigpOwogCi0gICAgICAgIHdoaWxlICgodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlNGYWlsdXJlTW9kZSA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIHZTRmFpbHVyZU1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgIH0KKwkJd2hpbGUgKCh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwpICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2RlID0gdkl0ZXJhdG9yLm5leHQoKTsKKwkJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgdlNGYWlsdXJlTW9kZSk7CisJCX0KKwkJcmV0dXJuIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FbmRzU2l6ZU1vZGVsQ29uc3RyYWludC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FbmRzU2l6ZU1vZGVsQ29uc3RyYWludC5qYXZhCmluZGV4IGZlZTY3MDIuLjY1NWVkYWIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRW5kc1NpemVNb2RlbENvbnN0cmFpbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVuZHNTaXplTW9kZWxDb25zdHJhaW50LmphdmEKQEAgLTI2LDMyICsyNiwzMiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVuZHNTaXplTW9kZWxDb25zdHJhaW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CisJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRW5kc1NpemVNb2RlbENvbnN0cmFpbnQoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FbmRzU2l6ZU1vZGVsQ29uc3RyYWludCgpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIGlmIChwQ29udGV4dC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKSB7Ci0gICAgICAgICAgICBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiB2U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiA9IChJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbikgcENvbnRleHQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBDb25uZWN0b3IgdkNvbm5lY3RvciA9IHZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmdldEJhc2VfQ29ubmVjdG9yKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBwQ29udGV4dCkgeworCQlJU3RhdHVzIHZTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOworCQlpZiAocENvbnRleHQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbikgeworCQkJSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gPSAoSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pIHBDb250ZXh0LmdldFRhcmdldCgpOworCQkJQ29ubmVjdG9yIHZDb25uZWN0b3IgPSB2U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5nZXRCYXNlX0Nvbm5lY3RvcigpOwogCi0gICAgICAgICAgICBpZiAodkNvbm5lY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZDb25uZWN0b3IuZ2V0RW5kcygpLnNpemUoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlN0YXR1czsKLSAgICB9CisJCQlpZiAodkNvbm5lY3RvciAhPSBudWxsKSB7CisJCQkJaWYgKHZDb25uZWN0b3IuZ2V0RW5kcygpLnNpemUoKSA9PSAyKSB7CisJCQkJCXZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdlN0YXR1czsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU0ZhaWx1cmVNb2RlTEFuYWx5c2lzT3duZXJNb2RlbENvbnN0cmFpbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRmFpbHVyZU1vZGVMQW5hbHlzaXNPd25lck1vZGVsQ29uc3RyYWludC5qYXZhCmluZGV4IDM3NTcxNTguLjg1ODA4YjIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRmFpbHVyZU1vZGVMQW5hbHlzaXNPd25lck1vZGVsQ29uc3RyYWludC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TRmFpbHVyZU1vZGVMQW5hbHlzaXNPd25lck1vZGVsQ29uc3RyYWludC5qYXZhCkBAIC0zMCw0MSArMzAsNDEgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIFNGYWlsdXJlTW9kZUxBbmFseXNpc093bmVyTW9kZWxDb25zdHJhaW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CisJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTRmFpbHVyZU1vZGVMQW5hbHlzaXNPd25lck1vZGVsQ29uc3RyYWludCgpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU0ZhaWx1cmVNb2RlTEFuYWx5c2lzT3duZXJNb2RlbENvbnN0cmFpbnQoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBwQ29udGV4dCkgewotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBFT2JqZWN0IHZUYXJnZXQgPSBwQ29udGV4dC5nZXRUYXJnZXQoKTsKLSAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgdk93bmVyID0gbnVsbDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IHBDb250ZXh0KSB7CisJCUlTdGF0dXMgdlN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CisJCUVPYmplY3QgdlRhcmdldCA9IHBDb250ZXh0LmdldFRhcmdldCgpOworCQlJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB2T3duZXIgPSBudWxsOwogCi0gICAgICAgIGlmICh2VGFyZ2V0IGluc3RhbmNlb2YgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB7Ci0gICAgICAgICAgICBpZiAodlRhcmdldCBpbnN0YW5jZW9mIElTQWJzZW50RmFpbHVyZU1vZGUpIHsKLSAgICAgICAgICAgICAgICBJU0Fic2VudEZhaWx1cmVNb2RlIHZTQWJzZW50RmFpbHVyZU1vZGUgPSAoSVNBYnNlbnRGYWlsdXJlTW9kZSkgdlRhcmdldDsKLSAgICAgICAgICAgICAgICB2T3duZXIgPSB2U0Fic2VudEZhaWx1cmVNb2RlLmdldE93bmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZUYXJnZXQgaW5zdGFuY2VvZiBJU1VudGltZWx5RmFpbHVyZU1vZGUpIHsKLSAgICAgICAgICAgICAgICBJU1VudGltZWx5RmFpbHVyZU1vZGUgdlNVbHRpbWVseUZhaWx1cmVNb2RlID0gKElTVW50aW1lbHlGYWlsdXJlTW9kZSkgdlRhcmdldDsKLSAgICAgICAgICAgICAgICB2T3duZXIgPSB2U1VsdGltZWx5RmFpbHVyZU1vZGUuZ2V0T3duZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodlRhcmdldCBpbnN0YW5jZW9mIElTRXJyb25lb3VzRmFpbHVyZU1vZGUpIHsKLSAgICAgICAgICAgICAgICBJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIHZTRXJyb25lb3VzRmFpbHVyZU1vZGUgPSAoSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSkgdlRhcmdldDsKLSAgICAgICAgICAgICAgICB2T3duZXIgPSB2U0Vycm9uZW91c0ZhaWx1cmVNb2RlLmdldE93bmVyKCk7Ci0gICAgICAgICAgICB9CisJCWlmICh2VGFyZ2V0IGluc3RhbmNlb2YgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB7CisJCQlpZiAodlRhcmdldCBpbnN0YW5jZW9mIElTQWJzZW50RmFpbHVyZU1vZGUpIHsKKwkJCQlJU0Fic2VudEZhaWx1cmVNb2RlIHZTQWJzZW50RmFpbHVyZU1vZGUgPSAoSVNBYnNlbnRGYWlsdXJlTW9kZSkgdlRhcmdldDsKKwkJCQl2T3duZXIgPSB2U0Fic2VudEZhaWx1cmVNb2RlLmdldE93bmVyKCk7CisJCQl9IGVsc2UgaWYgKHZUYXJnZXQgaW5zdGFuY2VvZiBJU1VudGltZWx5RmFpbHVyZU1vZGUpIHsKKwkJCQlJU1VudGltZWx5RmFpbHVyZU1vZGUgdlNVbHRpbWVseUZhaWx1cmVNb2RlID0gKElTVW50aW1lbHlGYWlsdXJlTW9kZSkgdlRhcmdldDsKKwkJCQl2T3duZXIgPSB2U1VsdGltZWx5RmFpbHVyZU1vZGUuZ2V0T3duZXIoKTsKKwkJCX0gZWxzZSBpZiAodlRhcmdldCBpbnN0YW5jZW9mIElTRXJyb25lb3VzRmFpbHVyZU1vZGUpIHsKKwkJCQlJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIHZTRXJyb25lb3VzRmFpbHVyZU1vZGUgPSAoSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSkgdlRhcmdldDsKKwkJCQl2T3duZXIgPSB2U0Vycm9uZW91c0ZhaWx1cmVNb2RlLmdldE93bmVyKCk7CisJCQl9CiAKLSAgICAgICAgICAgIGlmICh2T3duZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVGYWlsdXJlU3RhdHVzKHBDb250ZXh0LmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlN0YXR1czsKLSAgICB9CisJCQlpZiAodk93bmVyICE9IG51bGwpIHsKKwkJCQl2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlU3VjY2Vzc1N0YXR1cygpOworCQkJfSBlbHNlIHsKKwkJCQl2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlRmFpbHVyZVN0YXR1cyhwQ29udGV4dC5nZXRUYXJnZXQoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTdGF0dXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NQb3J0TEFuYWx5c2lzRGlyZWN0aW9uTW9kZWxDb25zdHJhaW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU1BvcnRMQW5hbHlzaXNEaXJlY3Rpb25Nb2RlbENvbnN0cmFpbnQuamF2YQppbmRleCBlNGMxM2ExLi5lNDcyZmJlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU1BvcnRMQW5hbHlzaXNEaXJlY3Rpb25Nb2RlbENvbnN0cmFpbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU1BvcnRMQW5hbHlzaXNEaXJlY3Rpb25Nb2RlbENvbnN0cmFpbnQuamF2YQpAQCAtMjUsMjkgKzI1LDI5IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBTUG9ydExBbmFseXNpc0RpcmVjdGlvbk1vZGVsQ29uc3RyYWludAotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgeworCWV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU1BvcnRMQW5hbHlzaXNEaXJlY3Rpb25Nb2RlbENvbnN0cmFpbnQoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFNQb3J0TEFuYWx5c2lzRGlyZWN0aW9uTW9kZWxDb25zdHJhaW50KCkgeworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgcENvbnRleHQpIHsKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgaWYgKHBDb250ZXh0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgSVNQb3J0TEFuYWx5c2lzKSB7Ci0gICAgICAgICAgICBJU1BvcnRMQW5hbHlzaXMgdlNQb3J0TEFuYWx5c2lzID0gKElTUG9ydExBbmFseXNpcykgcENvbnRleHQuZ2V0VGFyZ2V0KCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBwQ29udGV4dCkgeworCQlJU3RhdHVzIHZTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOworCQlpZiAocENvbnRleHQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU1BvcnRMQW5hbHlzaXMpIHsKKwkJCUlTUG9ydExBbmFseXNpcyB2U1BvcnRMQW5hbHlzaXMgPSAoSVNQb3J0TEFuYWx5c2lzKSBwQ29udGV4dC5nZXRUYXJnZXQoKTsKIAotICAgICAgICAgICAgaWYgKHZTUG9ydExBbmFseXNpcy5nZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkuZ2V0VmFsdWUoKSAhPSBTRGlyZWN0aW9uTEFuYWx5c2lzLlVOREVGSU5FRF9WQUxVRSkgewotICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVGYWlsdXJlU3RhdHVzKHBDb250ZXh0LmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlN0YXR1czsKLSAgICB9CisJCQlpZiAodlNQb3J0TEFuYWx5c2lzLmdldFNEaXJlY3Rpb25MQW5hbHlzaXMoKS5nZXRWYWx1ZSgpICE9IFNEaXJlY3Rpb25MQW5hbHlzaXMuVU5ERUZJTkVEX1ZBTFVFKSB7CisJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKKwkJCX0gZWxzZSB7CisJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOworCQkJfQorCQl9CisJCXJldHVybiB2U3RhdHVzOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TUHJvcGFnYXRpb25MaW5rQ2xpZW50U3VwcGxpZXJNb2RlbENvbnN0cmFpbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TUHJvcGFnYXRpb25MaW5rQ2xpZW50U3VwcGxpZXJNb2RlbENvbnN0cmFpbnQuamF2YQppbmRleCA1MTZkNzgwLi40Njk5NjI5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU1Byb3BhZ2F0aW9uTGlua0NsaWVudFN1cHBsaWVyTW9kZWxDb25zdHJhaW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NQcm9wYWdhdGlvbkxpbmtDbGllbnRTdXBwbGllck1vZGVsQ29uc3RyYWludC5qYXZhCkBAIC0yNiwzMiArMjYsMzIgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIFNQcm9wYWdhdGlvbkxpbmtDbGllbnRTdXBwbGllck1vZGVsQ29uc3RyYWludAotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgeworCWV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU1Byb3BhZ2F0aW9uTGlua0NsaWVudFN1cHBsaWVyTW9kZWxDb25zdHJhaW50KCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBTUHJvcGFnYXRpb25MaW5rQ2xpZW50U3VwcGxpZXJNb2RlbENvbnN0cmFpbnQoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBwQ29udGV4dCkgewotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBpZiAocENvbnRleHQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU1Byb3BhZ2F0aW9uTGluaykgewotICAgICAgICAgICAgSVNQcm9wYWdhdGlvbkxpbmsgdlNQcm9wYWdhdGlvbkxpbmsgPSAoSVNQcm9wYWdhdGlvbkxpbmspIHBDb250ZXh0LmdldFRhcmdldCgpOwotICAgICAgICAgICAgRGVwZW5kZW5jeSB2RGVwZW5kZW5jeSA9IHZTUHJvcGFnYXRpb25MaW5rLmdldEJhc2VfRGVwZW5kZW5jeSgpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgcENvbnRleHQpIHsKKwkJSVN0YXR1cyB2U3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJaWYgKHBDb250ZXh0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgSVNQcm9wYWdhdGlvbkxpbmspIHsKKwkJCUlTUHJvcGFnYXRpb25MaW5rIHZTUHJvcGFnYXRpb25MaW5rID0gKElTUHJvcGFnYXRpb25MaW5rKSBwQ29udGV4dC5nZXRUYXJnZXQoKTsKKwkJCURlcGVuZGVuY3kgdkRlcGVuZGVuY3kgPSB2U1Byb3BhZ2F0aW9uTGluay5nZXRCYXNlX0RlcGVuZGVuY3koKTsKIAotICAgICAgICAgICAgaWYgKHZEZXBlbmRlbmN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKHZEZXBlbmRlbmN5LmdldENsaWVudHMoKS5zaXplKCkgPT0gMSkgJiYgKHZEZXBlbmRlbmN5LmdldFN1cHBsaWVycygpLnNpemUoKSA9PSAxKSkgewotICAgICAgICAgICAgICAgICAgICB2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVGYWlsdXJlU3RhdHVzKHBDb250ZXh0LmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTdGF0dXM7Ci0gICAgfQorCQkJaWYgKHZEZXBlbmRlbmN5ICE9IG51bGwpIHsKKwkJCQlpZiAoKHZEZXBlbmRlbmN5LmdldENsaWVudHMoKS5zaXplKCkgPT0gMSkgJiYgKHZEZXBlbmRlbmN5LmdldFN1cHBsaWVycygpLnNpemUoKSA9PSAxKSkgeworCQkJCQl2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlU3VjY2Vzc1N0YXR1cygpOworCQkJCX0gZWxzZSB7CisJCQkJCXZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVGYWlsdXJlU3RhdHVzKHBDb250ZXh0LmdldFRhcmdldCgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTdGF0dXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NQcm9wYWdhdGlvbkxpbmtDbGllbnRTdXBwbGllclNpemVNb2RlbENvbnN0cmFpbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TUHJvcGFnYXRpb25MaW5rQ2xpZW50U3VwcGxpZXJTaXplTW9kZWxDb25zdHJhaW50LmphdmEKaW5kZXggZDc3N2E1NS4uY2U1ZTM5MiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NQcm9wYWdhdGlvbkxpbmtDbGllbnRTdXBwbGllclNpemVNb2RlbENvbnN0cmFpbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU1Byb3BhZ2F0aW9uTGlua0NsaWVudFN1cHBsaWVyU2l6ZU1vZGVsQ29uc3RyYWludC5qYXZhCkBAIC00NywxMjEgKzQ3LDEyMSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgU1Byb3BhZ2F0aW9uTGlua0NsaWVudFN1cHBsaWVyU2l6ZU1vZGVsQ29uc3RyYWludAotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgeworCWV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU1Byb3BhZ2F0aW9uTGlua0NsaWVudFN1cHBsaWVyU2l6ZU1vZGVsQ29uc3RyYWludCgpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU1Byb3BhZ2F0aW9uTGlua0NsaWVudFN1cHBsaWVyU2l6ZU1vZGVsQ29uc3RyYWludCgpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIGlmIChwQ29udGV4dC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTUHJvcGFnYXRpb25MaW5rKSB7Ci0gICAgICAgICAgICBJU1Byb3BhZ2F0aW9uTGluayB2U1Byb3BhZ2F0aW9uTGluayA9IChJU1Byb3BhZ2F0aW9uTGluaykgcENvbnRleHQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBEZXBlbmRlbmN5IHZEZXBlbmRlbmN5ID0gdlNQcm9wYWdhdGlvbkxpbmsuZ2V0QmFzZV9EZXBlbmRlbmN5KCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBwQ29udGV4dCkgeworCQlJU3RhdHVzIHZTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOworCQlpZiAocENvbnRleHQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU1Byb3BhZ2F0aW9uTGluaykgeworCQkJSVNQcm9wYWdhdGlvbkxpbmsgdlNQcm9wYWdhdGlvbkxpbmsgPSAoSVNQcm9wYWdhdGlvbkxpbmspIHBDb250ZXh0LmdldFRhcmdldCgpOworCQkJRGVwZW5kZW5jeSB2RGVwZW5kZW5jeSA9IHZTUHJvcGFnYXRpb25MaW5rLmdldEJhc2VfRGVwZW5kZW5jeSgpOwogCi0gICAgICAgICAgICBCb29sZWFuIHZIYXNDb3JyZWN0Q2xpZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBCb29sZWFuIHZIYXNDb3JyZWN0U3VwcGxpZXIgPSBmYWxzZTsKKwkJCUJvb2xlYW4gdkhhc0NvcnJlY3RDbGllbnQgPSBmYWxzZTsKKwkJCUJvb2xlYW4gdkhhc0NvcnJlY3RTdXBwbGllciA9IGZhbHNlOwogCi0gICAgICAgICAgICBpZiAodkRlcGVuZGVuY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gdkl0ZXJhdG9yID0gdkRlcGVuZGVuY3kuZ2V0Q2xpZW50cygpLml0ZXJhdG9yKCk7CisJCQlpZiAodkRlcGVuZGVuY3kgIT0gbnVsbCkgeworCQkJCUl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gdkl0ZXJhdG9yID0gdkRlcGVuZGVuY3kuZ2V0Q2xpZW50cygpLml0ZXJhdG9yKCk7CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAodkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBOYW1lZEVsZW1lbnQgdkVsZW1lbnQgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25Gb3JDbGllbnRFbGVtZW50KHZFbGVtZW50KTsKKwkJCQl3aGlsZSAodkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlOYW1lZEVsZW1lbnQgdkVsZW1lbnQgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25Gb3JDbGllbnRFbGVtZW50KHZFbGVtZW50KTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2SGFzQ29ycmVjdENsaWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisJCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJCXZIYXNDb3JyZWN0Q2xpZW50ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KIAotICAgICAgICAgICAgICAgIHZJdGVyYXRvciA9IHZEZXBlbmRlbmN5LmdldFN1cHBsaWVycygpLml0ZXJhdG9yKCk7CisJCQkJdkl0ZXJhdG9yID0gdkRlcGVuZGVuY3kuZ2V0U3VwcGxpZXJzKCkuaXRlcmF0b3IoKTsKIAotICAgICAgICAgICAgICAgIHdoaWxlICh2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVkRWxlbWVudCB2RWxlbWVudCA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbkZvclN1cHBsaWVyRWxlbWVudCh2RWxlbWVudCk7CisJCQkJd2hpbGUgKHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJTmFtZWRFbGVtZW50IHZFbGVtZW50ID0gdkl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uRm9yU3VwcGxpZXJFbGVtZW50KHZFbGVtZW50KTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2SGFzQ29ycmVjdFN1cHBsaWVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKwkJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQkJdkhhc0NvcnJlY3RTdXBwbGllciA9IHRydWU7CisJCQkJCX0KKwkJCQl9CiAKLSAgICAgICAgICAgICAgICBpZiAodkhhc0NvcnJlY3RDbGllbnQgJiYgdkhhc0NvcnJlY3RTdXBwbGllcikgewotICAgICAgICAgICAgICAgICAgICB2U3RhdHVzID0gcENvbnRleHQuY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVGYWlsdXJlU3RhdHVzKHBDb250ZXh0LmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTdGF0dXM7Ci0gICAgfQorCQkJCWlmICh2SGFzQ29ycmVjdENsaWVudCAmJiB2SGFzQ29ycmVjdFN1cHBsaWVyKSB7CisJCQkJCXZTdGF0dXMgPSBwQ29udGV4dC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdlN0YXR1czsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24gZm9yIENsaWVudCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHBFbGVtZW50IFRoZSBVTUwgRWxlbWVudAotICAgICAqIEByZXR1cm4gVGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEVPYmplY3QgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uRm9yQ2xpZW50RWxlbWVudChmaW5hbCBOYW1lZEVsZW1lbnQgcEVsZW1lbnQpIHsKLSAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PiB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4oKTsKKwkvKioKKwkgKiBHZXQgdGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24gZm9yIENsaWVudCBlbGVtZW50LgorCSAqCisJICogQHBhcmFtIHBFbGVtZW50IFRoZSBVTUwgRWxlbWVudAorCSAqIEByZXR1cm4gVGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24KKwkgKi8KKwlwcml2YXRlIEVPYmplY3QgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uRm9yQ2xpZW50RWxlbWVudChmaW5hbCBOYW1lZEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKKwkJTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PiB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0ID0KKwkJCW5ldyBBcnJheUxpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4oKTsKIAotICAgICAgICB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNMT0dJQ0FMR0FURVNfTElTVCk7Ci0gICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVFVkVOVFNfTElTVCk7Ci0gICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU19MSVNUKTsKKwkJdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5hZGRBbGwoRVNGTG9jYWxBbmFseXNpc1NldC5TTE9HSUNBTEdBVEVTX0xJU1QpOworCQl2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFRVZFTlRTX0xJU1QpOworCQl2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVCk7CiAKLSAgICAgICAgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU1Byb3BhZ2F0aW9uRWxlbWVudChwRWxlbWVudCwgdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdCk7CisJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNQcm9wYWdhdGlvbkVsZW1lbnQocEVsZW1lbnQsIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QpOwogCi0gICAgICAgIHJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgIH0KKwkJcmV0dXJuIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uIGZvciBTdXBwbGllciBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHBFbGVtZW50IFRoZSBVTUwgRWxlbWVudAotICAgICAqIEByZXR1cm4gVGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEVPYmplY3QgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uRm9yU3VwcGxpZXJFbGVtZW50KGZpbmFsIE5hbWVkRWxlbWVudCBwRWxlbWVudCkgewotICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBMaXN0PGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+IHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PigpOworCS8qKgorCSAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBmb3IgU3VwcGxpZXIgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCisJICovCisJcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbkZvclN1cHBsaWVyRWxlbWVudChmaW5hbCBOYW1lZEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKKwkJTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PiB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0ID0KKwkJCW5ldyBBcnJheUxpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4oKTsKIAotICAgICAgICB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNMT0dJQ0FMR0FURVNfTElTVCk7Ci0gICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU19MSVNUKTsKKwkJdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5hZGRBbGwoRVNGTG9jYWxBbmFseXNpc1NldC5TTE9HSUNBTEdBVEVTX0xJU1QpOworCQl2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVCk7CiAKLSAgICAgICAgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU1Byb3BhZ2F0aW9uRWxlbWVudChwRWxlbWVudCwgdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdCk7CisJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNQcm9wYWdhdGlvbkVsZW1lbnQocEVsZW1lbnQsIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QpOwogCi0gICAgICAgIHJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgIH0KKwkJcmV0dXJuIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uIG9mIFNQcm9wYWdhdGlvbkVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEVsZW1lbnQgVGhlIFVNTCBFbGVtZW50Ci0gICAgICogQHBhcmFtIHBTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QgVGhlIExpc3Qgb2YgU1Byb3BhZ2F0aW9uRWxlbWVudHMgZGVmaW5lZCBieSBFU0ZMb2NhbEFuYWx5c2lzIHByb2ZpbGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU1Byb3BhZ2F0aW9uRWxlbWVudCgKLSAgICAgICAgZmluYWwgRWxlbWVudCBwRWxlbWVudCwKLSAgICAgICAgZmluYWwgTGlzdDxDbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+IHBTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QpIHsKLSAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKKwkvKioKKwkgKiBHZXQgdGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24gb2YgU1Byb3BhZ2F0aW9uRWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKKwkgKiBAcGFyYW0gcFNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdCBUaGUgTGlzdCBvZiBTUHJvcGFnYXRpb25FbGVtZW50cyBkZWZpbmVkIGJ5IEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24KKwkgKi8KKwlwcml2YXRlIEVPYmplY3QgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTUHJvcGFnYXRpb25FbGVtZW50KAorCQlmaW5hbCBFbGVtZW50IHBFbGVtZW50LAorCQlmaW5hbCBMaXN0PENsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4gcFNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdCkgeworCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOwogCi0gICAgICAgIEl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICBwU1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+IHZJdGVyYXRvciA9CisJCQlwU1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7CiAKLSAgICAgICAgd2hpbGUgKCh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwpICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4gdlNQcm9wYWdhdGlvbkVsZW1lbnQgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U1Byb3BhZ2F0aW9uRWxlbWVudCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgdlNQcm9wYWdhdGlvbkVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgIH0KKwkJd2hpbGUgKCh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwpICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4gdlNQcm9wYWdhdGlvbkVsZW1lbnQgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U1Byb3BhZ2F0aW9uRWxlbWVudCkgIT0gbnVsbCkgeworCQkJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgdlNQcm9wYWdhdGlvbkVsZW1lbnQpOworCQkJfQorCQl9CisJCXJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TU3lzdGVtRXZlbnRIYXNUeXBlTW9kZWxDb25zdHJhaW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vcnVsZXMvU1N5c3RlbUV2ZW50SGFzVHlwZU1vZGVsQ29uc3RyYWludC5qYXZhCmluZGV4IDQyZTI3YjkuLjljMjZmMWUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9ydWxlcy9TU3lzdGVtRXZlbnRIYXNUeXBlTW9kZWxDb25zdHJhaW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3J1bGVzL1NTeXN0ZW1FdmVudEhhc1R5cGVNb2RlbENvbnN0cmFpbnQuamF2YQpAQCAtMjYsMzQgKzI2LDM0IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBTU3lzdGVtRXZlbnRIYXNUeXBlTW9kZWxDb25zdHJhaW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CisJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTU3lzdGVtRXZlbnRIYXNUeXBlTW9kZWxDb25zdHJhaW50KCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBTU3lzdGVtRXZlbnRIYXNUeXBlTW9kZWxDb25zdHJhaW50KCkgeworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgcENvbnRleHQpIHsKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgRU9iamVjdCB2VGFyZ2V0ID0gcENvbnRleHQuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIElTU3lzdGVtRXZlbnRUeXBlIHZUeXBlID0gbnVsbDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IHBDb250ZXh0KSB7CisJCUlTdGF0dXMgdlN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CisJCUVPYmplY3QgdlRhcmdldCA9IHBDb250ZXh0LmdldFRhcmdldCgpOworCQlJU1N5c3RlbUV2ZW50VHlwZSB2VHlwZSA9IG51bGw7CiAKLSAgICAgICAgaWYgKHZUYXJnZXQgaW5zdGFuY2VvZiBJU1N5c3RlbUV2ZW50KSB7Ci0gICAgICAgICAgICBJU1N5c3RlbUV2ZW50IHZTU3lzdGVtRXZlbnQgPSAoSVNTeXN0ZW1FdmVudCkgdlRhcmdldDsKKwkJaWYgKHZUYXJnZXQgaW5zdGFuY2VvZiBJU1N5c3RlbUV2ZW50KSB7CisJCQlJU1N5c3RlbUV2ZW50IHZTU3lzdGVtRXZlbnQgPSAoSVNTeXN0ZW1FdmVudCkgdlRhcmdldDsKIAotICAgICAgICAgICAgdlR5cGUgPSB2U1N5c3RlbUV2ZW50LmdldFR5cGUoKTsKKwkJCXZUeXBlID0gdlNTeXN0ZW1FdmVudC5nZXRUeXBlKCk7CiAKLSAgICAgICAgICAgIGlmICh2VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U3RhdHVzOwotICAgIH0KKwkJCWlmICh2VHlwZSAhPSBudWxsKSB7CisJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKKwkJCX0gZWxzZSB7CisJCQkJdlN0YXR1cyA9IHBDb250ZXh0LmNyZWF0ZUZhaWx1cmVTdGF0dXMocENvbnRleHQuZ2V0VGFyZ2V0KCkpOworCQkJfQorCQl9CisJCXJldHVybiB2U3RhdHVzOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvblNlbGVjdG9yLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25TZWxlY3Rvci5qYXZhCmluZGV4IDkyMzI3OGIuLmJjMjhjMDEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvblNlbGVjdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3NlbGVjdG9ycy9TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uU2VsZWN0b3IuamF2YQpAQCAtMjEsMjAgKzIxLDIwIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uU2VsZWN0b3IKLSAgICBpbXBsZW1lbnRzIElDbGllbnRTZWxlY3RvciB7CisJaW1wbGVtZW50cyBJQ2xpZW50U2VsZWN0b3IgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvblNlbGVjdG9yKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uU2VsZWN0b3IoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdHMoZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIHBPYmplY3QgaW5zdGFuY2VvZiBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbjsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdHMoZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKKwkJcmV0dXJuIHBPYmplY3QgaW5zdGFuY2VvZiBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbjsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU0ZhaWx1cmVNb2RlTEFuYWx5c2lzU2VsZWN0b3IuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU0ZhaWx1cmVNb2RlTEFuYWx5c2lzU2VsZWN0b3IuamF2YQppbmRleCA0NTIzODI4Li42MzUxNjBlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NGYWlsdXJlTW9kZUxBbmFseXNpc1NlbGVjdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3NlbGVjdG9ycy9TRmFpbHVyZU1vZGVMQW5hbHlzaXNTZWxlY3Rvci5qYXZhCkBAIC0yMywyNSArMjMsMjUgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIFNGYWlsdXJlTW9kZUxBbmFseXNpc1NlbGVjdG9yCi0gICAgaW1wbGVtZW50cyBJQ2xpZW50U2VsZWN0b3IgeworCWltcGxlbWVudHMgSUNsaWVudFNlbGVjdG9yIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNGYWlsdXJlTW9kZUxBbmFseXNpc1NlbGVjdG9yKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBTRmFpbHVyZU1vZGVMQW5hbHlzaXNTZWxlY3RvcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0cyhmaW5hbCBPYmplY3QgcE9iamVjdCkgewotICAgICAgICBib29sZWFuIHZJc1NGYWlsdXJlTW9kZUxBbmFseXNpcyA9IGZhbHNlOwotICAgICAgICBpZiAoKHBPYmplY3QgaW5zdGFuY2VvZiBJU0Fic2VudEZhaWx1cmVNb2RlKSB8fCAocE9iamVjdCBpbnN0YW5jZW9mIElTRXJyb25lb3VzRmFpbHVyZU1vZGUpCi0gICAgICAgICAgICB8fCAocE9iamVjdCBpbnN0YW5jZW9mIElTVW50aW1lbHlGYWlsdXJlTW9kZSkpIHsKLSAgICAgICAgICAgIHZJc1NGYWlsdXJlTW9kZUxBbmFseXNpcyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZJc1NGYWlsdXJlTW9kZUxBbmFseXNpczsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdHMoZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKKwkJYm9vbGVhbiB2SXNTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPSBmYWxzZTsKKwkJaWYgKChwT2JqZWN0IGluc3RhbmNlb2YgSVNBYnNlbnRGYWlsdXJlTW9kZSkgfHwgKHBPYmplY3QgaW5zdGFuY2VvZiBJU0Vycm9uZW91c0ZhaWx1cmVNb2RlKQorCQkJfHwgKHBPYmplY3QgaW5zdGFuY2VvZiBJU1VudGltZWx5RmFpbHVyZU1vZGUpKSB7CisJCQl2SXNTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPSB0cnVlOworCQl9CisJCXJldHVybiB2SXNTRmFpbHVyZU1vZGVMQW5hbHlzaXM7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NQb3J0TEFuYWx5c2lzU2VsZWN0b3IuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU1BvcnRMQW5hbHlzaXNTZWxlY3Rvci5qYXZhCmluZGV4IGZlYTA3Y2MuLjkxNTM1MmYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU1BvcnRMQW5hbHlzaXNTZWxlY3Rvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU1BvcnRMQW5hbHlzaXNTZWxlY3Rvci5qYXZhCkBAIC0yMSwyMCArMjEsMjAgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIFNQb3J0TEFuYWx5c2lzU2VsZWN0b3IKLSAgICBpbXBsZW1lbnRzIElDbGllbnRTZWxlY3RvciB7CisJaW1wbGVtZW50cyBJQ2xpZW50U2VsZWN0b3IgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU1BvcnRMQW5hbHlzaXNTZWxlY3RvcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU1BvcnRMQW5hbHlzaXNTZWxlY3RvcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0cyhmaW5hbCBPYmplY3QgcE9iamVjdCkgewotICAgICAgICByZXR1cm4gcE9iamVjdCBpbnN0YW5jZW9mIElTUG9ydExBbmFseXNpczsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdHMoZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKKwkJcmV0dXJuIHBPYmplY3QgaW5zdGFuY2VvZiBJU1BvcnRMQW5hbHlzaXM7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NQcm9wYWdhdGlvbkxpbmtTZWxlY3Rvci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3NlbGVjdG9ycy9TUHJvcGFnYXRpb25MaW5rU2VsZWN0b3IuamF2YQppbmRleCAzODhiNGU0Li5jYmMyYzMxIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NQcm9wYWdhdGlvbkxpbmtTZWxlY3Rvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU1Byb3BhZ2F0aW9uTGlua1NlbGVjdG9yLmphdmEKQEAgLTIxLDIwICsyMSwyMCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgU1Byb3BhZ2F0aW9uTGlua1NlbGVjdG9yCi0gICAgaW1wbGVtZW50cyBJQ2xpZW50U2VsZWN0b3IgeworCWltcGxlbWVudHMgSUNsaWVudFNlbGVjdG9yIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNQcm9wYWdhdGlvbkxpbmtTZWxlY3RvcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU1Byb3BhZ2F0aW9uTGlua1NlbGVjdG9yKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RzKGZpbmFsIE9iamVjdCBwT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBwT2JqZWN0IGluc3RhbmNlb2YgSVNQcm9wYWdhdGlvbkxpbms7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzZWxlY3RzKGZpbmFsIE9iamVjdCBwT2JqZWN0KSB7CisJCXJldHVybiBwT2JqZWN0IGluc3RhbmNlb2YgSVNQcm9wYWdhdGlvbkxpbms7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NTeXN0ZW1FdmVudFNlbGVjdG9yLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUudmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3ZhbGlkYXRpb24vc2VsZWN0b3JzL1NTeXN0ZW1FdmVudFNlbGVjdG9yLmphdmEKaW5kZXggNGMyNjgzMC4uMzM4ZGEwYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlLnZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS92YWxpZGF0aW9uL3NlbGVjdG9ycy9TU3lzdGVtRXZlbnRTZWxlY3Rvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS52YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvdmFsaWRhdGlvbi9zZWxlY3RvcnMvU1N5c3RlbUV2ZW50U2VsZWN0b3IuamF2YQpAQCAtMjEsMjAgKzIxLDIwIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBTU3lzdGVtRXZlbnRTZWxlY3RvcgotICAgIGltcGxlbWVudHMgSUNsaWVudFNlbGVjdG9yIHsKKwlpbXBsZW1lbnRzIElDbGllbnRTZWxlY3RvciB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTU3lzdGVtRXZlbnRTZWxlY3RvcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgU1N5c3RlbUV2ZW50U2VsZWN0b3IoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdHMoZmluYWwgT2JqZWN0IHBPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIHBPYmplY3QgaW5zdGFuY2VvZiBJU1N5c3RlbUV2ZW50OwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2VsZWN0cyhmaW5hbCBPYmplY3QgcE9iamVjdCkgeworCQlyZXR1cm4gcE9iamVjdCBpbnN0YW5jZW9mIElTU3lzdGVtRXZlbnQ7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5qYXZhCmluZGV4IDQ3ZjA3ZDMuLmJlMTg4ZWMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5qYXZhCkBAIC0zMiw3MCArMzIsNzAgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IHsKKwlleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgRXZlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTRmFpbHVyZUV2ZW50KElTRmFpbHVyZUV2ZW50KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudCgpCi0gICAgICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0ZhaWx1cmVFdmVudCBnZXRTRmFpbHVyZUV2ZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgRXZlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTRmFpbHVyZUV2ZW50KElTRmFpbHVyZUV2ZW50KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudCgpCisJICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0ZhaWx1cmVFdmVudCBnZXRTRmFpbHVyZUV2ZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTRmFpbHVyZUV2ZW50Ci0gICAgICogPGVtPlNGYWlsdXJlIEV2ZW50PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBFdmVudDwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVFdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0ZhaWx1cmVFdmVudChJU0ZhaWx1cmVFdmVudCB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVFdmVudAorCSAqIDxlbT5TRmFpbHVyZSBFdmVudDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNGYWlsdXJlRXZlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNGYWlsdXJlRXZlbnQoSVNGYWlsdXJlRXZlbnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZSBFdmVudHMKLSAgICAgKiBMQW5hbHlzaXMgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdAotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgKiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QgPGVtPlNGYWlsdXJlIEV2ZW50cworCSAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0CisJICogQG1vZGVsIG9wcG9zaXRlPSJzRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgorCSAqIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jawotICAgICAqIExBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jaworCSAqIExBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyB2YWx1ZSk7CiAKIH0gLy8gSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmphdmEKaW5kZXggMDNkZWQ3Mi4uZTVlZGRjOSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5qYXZhCkBAIC0zOSwxMzcgKzM5LDEzNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcwotICAgIGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZSBNb2RlcwotICAgICAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdAotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAqIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZSBNb2RlcworCSAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgorCSAqIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMKLSAgICAgKiA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMKKwkgKiA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldFNGYWlsdXJlTW9kZShJU0ZhaWx1cmVNb2RlKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmFpbHVyZU1vZGUoKQotICAgICAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNGYWlsdXJlTW9kZSBnZXRTRmFpbHVyZU1vZGUoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNGYWlsdXJlTW9kZShJU0ZhaWx1cmVNb2RlKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmFpbHVyZU1vZGUoKQorCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNGYWlsdXJlTW9kZSBnZXRTRmFpbHVyZU1vZGUoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2RlCi0gICAgICogPGVtPlNGYWlsdXJlIE1vZGU8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0ZhaWx1cmVNb2RlKElTRmFpbHVyZU1vZGUgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2RlCisJICogPGVtPlNGYWlsdXJlIE1vZGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0ZhaWx1cmVNb2RlKElTRmFpbHVyZU1vZGUgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseX0uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpCi0gICAgICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKQorCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudH0uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpc3QoKQotICAgICAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNMaXN0KCkKKwkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTRmVhcmVkRXZlbnQ+IGdldFNGZWFyZWRFdmVudHNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pd25lcjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyI2dldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZQotICAgICAqIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk93bmVyPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk93bmVyPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcikKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyI2dldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICogb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGdldE93bmVyKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA8ZW0+U0ZhaWx1cmUKKwkgKiBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Pd25lcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lcjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T3duZXIoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX093bmVyKCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgorCSAqIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBnZXRPd25lcigpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRPd25lcgotICAgICAqIDxlbT5Pd25lcjwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3duZXI8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldE93bmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRPd25lcgorCSAqIDxlbT5Pd25lcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3duZXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE93bmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB2YWx1ZSk7CiAKIH0gLy8gSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyLmphdmEKaW5kZXggN2E3ZGM5YS4uMGEyNjJlYyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuamF2YQpAQCAtMzAsMjYgKzMwLDI2IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKLSAgICBleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0T3duZXIgPGVtPk93bmVyPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRPd25lcgotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ib3duZXIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0T3duZXIgPGVtPk93bmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRPd25lcgorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ib3duZXIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CiAKIH0gLy8gSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudC5qYXZhCmluZGV4IDQyYzg0ZDguLjVkNDcwZmMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQuamF2YQpAQCAtMjMsNSArMjMsNSBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAotICAgIGV4dGVuZHMgSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQgeworCWV4dGVuZHMgSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQgewogfSAvLyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5qYXZhCmluZGV4IDRjNjkwMWEuLjU0YjRhNWYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuamF2YQpAQCAtMjgsNDAgKzI4LDQwIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IHsKKwlleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QgPGVtPlNMb2dpY2FsIEdhdGVzCi0gICAgICogTEFuYWx5c2lzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICogb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QgPGVtPlNMb2dpY2FsIEdhdGVzCisJICogTEFuYWx5c2lzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0CisJICogQG1vZGVsIG9wcG9zaXRlPSJzTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCisJICogb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcwotICAgICAqIDxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcworCSAqIDxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIHZhbHVlKTsKIAogfSAvLyBJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmphdmEKaW5kZXggYTQ4ZjMyMi4uMjg0MTQ3MyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmphdmEKQEAgLTMyLDQ2ICszMiw0NiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKLSAgICBleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rfS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRFbGVtZW50U291cmNlIDxlbT5FbGVtZW50IFNvdXJjZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEVsZW1lbnRTb3VyY2UKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9ImVsZW1lbnRTb3VyY2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRFbGVtZW50U291cmNlIDxlbT5FbGVtZW50IFNvdXJjZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEVsZW1lbnRTb3VyY2UKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVsZW1lbnRTb3VyY2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGlua30uCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFRhcmdldCA8ZW0+RWxlbWVudCBUYXJnZXQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X0luU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRFbGVtZW50VGFyZ2V0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJlbGVtZW50VGFyZ2V0IiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmt9LgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEVsZW1lbnRUYXJnZXQgPGVtPkVsZW1lbnQgVGFyZ2V0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9JblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFRhcmdldAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZWxlbWVudFRhcmdldCIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpOwogCiB9IC8vIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5qYXZhCmluZGV4IGE5ODUyODcuLjU3YTg0M2UgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkuamF2YQpAQCAtMjIsMjA1ICsyMiwyMDUgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkKLSAgICBleHRlbmRzIEVGYWN0b3J5IHsKKwlleHRlbmRzIEVGYWN0b3J5IHsKIAotICAgIC8qKgotICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmluaXQoKTsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUlFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5pbml0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1BvcnQgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1BvcnRMQW5hbHlzaXMgY3JlYXRlU1BvcnRMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1BvcnQgTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU1BvcnRMQW5hbHlzaXMgY3JlYXRlU1BvcnRMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1Byb3BhZ2F0aW9uTGluayBjcmVhdGVTUHJvcGFnYXRpb25MaW5rKCk7CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TUHJvcGFnYXRpb24gTGluazwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTUHJvcGFnYXRpb25MaW5rIGNyZWF0ZVNQcm9wYWdhdGlvbkxpbmsoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNCbG9ja0xBbmFseXNpcyBjcmVhdGVTQmxvY2tMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTQmxvY2tMQW5hbHlzaXMgY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0JhcnJpZXIgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0JhcnJpZXJMQW5hbHlzaXMgY3JlYXRlU0JhcnJpZXJMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0JhcnJpZXIgTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0JhcnJpZXJMQW5hbHlzaXMgY3JlYXRlU0JhcnJpZXJMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTTG9jYWxBbmFseXNpcyBjcmVhdGVTTG9jYWxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTTG9jYWxBbmFseXNpcyBjcmVhdGVTTG9jYWxBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTU3lzdGVtRXZlbnRzTGlicmFyeSBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50IFR5cGU8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZTwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNTeXN0ZW1FdmVudFR5cGUgY3JlYXRlU1N5c3RlbUV2ZW50VHlwZSgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50IFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTU3lzdGVtRXZlbnRUeXBlIGNyZWF0ZVNTeXN0ZW1FdmVudFR5cGUoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1N5c3RlbSBFdmVudDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1N5c3RlbSBFdmVudDwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNTeXN0ZW1FdmVudCBjcmVhdGVTU3lzdGVtRXZlbnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNTeXN0ZW0gRXZlbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNTeXN0ZW0gRXZlbnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTU3lzdGVtRXZlbnQgY3JlYXRlU1N5c3RlbUV2ZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeSBjcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWx5PC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0ZlYXJlZEV2ZW50c0ZhbWlseSBjcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5KCk7CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNGZWFyZWRFdmVudHNGYW1pbHkgY3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRmVhcmVkIEV2ZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRmVhcmVkIEV2ZW50PC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0ZlYXJlZEV2ZW50IGNyZWF0ZVNGZWFyZWRFdmVudCgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZlYXJlZCBFdmVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0ZlYXJlZCBFdmVudDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNGZWFyZWRFdmVudCBjcmVhdGVTRmVhcmVkRXZlbnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNEeXNmdW5jdGlvbmFsIEFzc29jaWF0aW9uPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBjcmVhdGVTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCk7CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uIGNyZWF0ZVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNBbmRHYXRlTEFuYWx5c2lzIGNyZWF0ZVNBbmRHYXRlTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TQW5kIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TQW5kIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0FuZEdhdGVMQW5hbHlzaXMgY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TT3IgR2F0ZSBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTT3JHYXRlTEFuYWx5c2lzIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNPciBHYXRlIExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU09yR2F0ZUxBbmFseXNpcyBjcmVhdGVTT3JHYXRlTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNVbnRpbWVseSBGYWlsdXJlIE1vZGU8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNVbnRpbWVseSBGYWlsdXJlIE1vZGU8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTVW50aW1lbHlGYWlsdXJlTW9kZSBjcmVhdGVTVW50aW1lbHlGYWlsdXJlTW9kZSgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNVbnRpbWVseUZhaWx1cmVNb2RlIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TQWJzZW50IEZhaWx1cmUgTW9kZTwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKTsKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TQWJzZW50IEZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIGNyZWF0ZVNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIGNyZWF0ZVNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNMb2NhbCBFdmVudDwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNMb2NhbEV2ZW50IGNyZWF0ZVNMb2NhbEV2ZW50KCk7CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNMb2NhbCBFdmVudDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNMb2NhbEV2ZW50IGNyZWF0ZVNMb2NhbEV2ZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSBnZXRFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIGdldEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlKCk7CiAKIH0gLy8gSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuamF2YQppbmRleCA1ODMyMWFiLi40ZDZiYzI3IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmphdmEKQEAgLTM3LDUwOTggKzM3LDUwOTggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UKLSAgICBleHRlbmRzIEVQYWNrYWdlIHsKKwlleHRlbmRzIEVQYWNrYWdlIHsKIAotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOQU1FID0gImVzZmxvY2FsYW5hbHlzaXMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAiZXNmbG9jYWxhbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5wb2xhcnN5cy5vcmcvZXNmLzAuNy4wL0VTRkxvY2FsQW5hbHlzaXMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGTG9jYWxBbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIkVTRkxvY2FsQW5hbHlzaXMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAiRVNGTG9jYWxBbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmluaXQoKTsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5pbml0KCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50Ci0gICAgICogPGVtPkFic3RyYWN0IFNMb2NhbCBBbmFseXNpcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UID0gMDsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJICogPGVtPkFic3RyYWN0IFNMb2NhbCBBbmFseXNpcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UID0gMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT04gPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT04gPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9CisJCUlFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQ09OQ0VQVF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0xvY2FsIEFuYWx5c2lzIEVsZW1lbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0NPTkNFUFRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0xvY2FsIEFuYWx5c2lzIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQ09OQ0VQVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9DT05DRVBUX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgPGVtPkFic3RyYWN0Ci0gICAgICogU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUiA9IDI7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIDxlbT5BYnN0cmFjdAorCSAqIFNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVIgPSAyOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19VVUlEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19VVUlEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX05BTUUgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX05BTUUgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KLSAgICAgICAgQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQorCQlBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1QgPQorCQlBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIE93bmVyPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIE93bmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIE93bmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1BvcnRMQW5hbHlzaXMgPGVtPlNQb3J0Ci0gICAgICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1BvcnRMQW5hbHlzaXMKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQb3J0TEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNQT1JUX0xBTkFMWVNJUyA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUG9ydExBbmFseXNpcyA8ZW0+U1BvcnQKKwkgKiBMQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUG9ydExBbmFseXNpcworCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1BvcnRMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1BPUlRfTEFOQUxZU0lTID0gMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BPUlRfTEFOQUxZU0lTX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNQT1JUX0xBTkFMWVNJU19fVVVJRCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQT1JUX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUE9SVF9MQU5BTFlTSVNfX05BTUUgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BPUlRfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNQT1JUX0xBTkFMWVNJU19fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQT1JUX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNQT1JUX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTUE9SVF9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUE9SVF9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUE9SVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNQb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BPUlRfTEFOQUxZU0lTX19TUE9SVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNQb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BPUlRfTEFOQUxZU0lTX19TUE9SVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BPUlRfTEFOQUxZU0lTX19CQVNFX1BPUlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFBvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9GRUFUVVJFX0NPVU5UICsgMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TUG9ydCBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BPUlRfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TUG9ydCBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BPUlRfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX0ZFQVRVUkVfQ09VTlQgKyA0OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTUE9SVF9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TUG9ydCBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BPUlRfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Ci0gICAgICogPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlQgPSA0OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50CisJICogPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlQgPSA0OwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fVVVJRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX05BTUUgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9CisJCUFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTID0gMzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTID0gMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1VVSUQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19VVUlEID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19OQU1FID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQorCQlBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERSA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUID0KLSAgICAgICAgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUID0KKwkJQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lcjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUiA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUiA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNQcm9wYWdhdGlvbkxpbmsgPGVtPlNQcm9wYWdhdGlvbgotICAgICAqIExpbms8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUHJvcGFnYXRpb25MaW5rCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUHJvcGFnYXRpb25MaW5rKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNQUk9QQUdBVElPTl9MSU5LID0gNTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNQcm9wYWdhdGlvbkxpbmsgPGVtPlNQcm9wYWdhdGlvbgorCSAqIExpbms8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUHJvcGFnYXRpb25MaW5rCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUHJvcGFnYXRpb25MaW5rKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNQUk9QQUdBVElPTl9MSU5LID0gNTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BST1BBR0FUSU9OX0xJTktfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNQUk9QQUdBVElPTl9MSU5LX19VVUlEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQUk9QQUdBVElPTl9MSU5LX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUFJPUEFHQVRJT05fTElOS19fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BST1BBR0FUSU9OX0xJTktfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNQUk9QQUdBVElPTl9MSU5LX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQUk9QQUdBVElPTl9MSU5LX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNQUk9QQUdBVElPTl9MSU5LX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQUk9QQUdBVElPTl9MSU5LX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUFJPUEFHQVRJT05fTElOS19fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgRGVwZW5kZW5jeTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1kgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBEZXBlbmRlbmN5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BST1BBR0FUSU9OX0xJTktfX0JBU0VfREVQRU5ERU5DWSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgU291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgU291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BST1BBR0FUSU9OX0xJTktfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TUHJvcGFnYXRpb24gTGluazwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUFJPUEFHQVRJT05fTElOS19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1BST1BBR0FUSU9OX0xJTktfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1BST1BBR0FUSU9OX0xJTktfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQmxvY2tMQW5hbHlzaXMKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTID0gNjsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCisJICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Jsb2NrTEFuYWx5c2lzCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJUyA9IDY7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCTE9DS19MQU5BTFlTSVNfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19MQU5BTFlTSVNfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT047CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19fU0JMT0NLID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jazwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19MQU5BTFlTSVNfX1NCTE9DSyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1BvcnRzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTX19TUE9SVFNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1BvcnRzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfTEFOQUxZU0lTX19TUE9SVFNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNMb2dpY2FsIEdhdGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTX19TTE9HSUNBTF9HQVRFU19MQU5BTFlTSVNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TTG9naWNhbCBHYXRlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19fU0xPR0lDQUxfR0FURVNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0JhcnJpZXJzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTX19TQkFSUklFUlNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0JhcnJpZXJzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfTEFOQUxZU0lTX19TQkFSUklFUlNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTX19TTE9DQUxfQU5BTFlTSVMgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0xvY2FsIEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19fU0xPQ0FMX0FOQUxZU0lTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCTE9DS19MQU5BTFlTSVNfX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkxPQ0tfTEFOQUxZU0lTX19TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JMT0NLX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkxPQ0tfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0JMT0NLX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKLSAgICAgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTID0gNzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcworCSAqIDxlbT5BYnN0cmFjdCBTRmFpbHVyZSBFdmVudCBMQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVMgPSA3OwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1VVSUQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fVVVJRCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX05BTUUgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KKwkJQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0KLSAgICAgICAgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0KKwkJQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBFdmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBFdmVudCBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBFdmVudCBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCi0gICAgICogPGVtPkFic3RyYWN0IFNMb2dpY2FsIEdhdGUgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTID0gODsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCisJICogPGVtPkFic3RyYWN0IFNMb2dpY2FsIEdhdGUgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTID0gODsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1VVSUQgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19VVUlEID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19OQU1FID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQorCQlBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0xvZ2ljYWwgR2F0ZSBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0xvZ2ljYWwgR2F0ZSBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU0xvZ2ljYWwgR2F0ZSBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0JhcnJpZXJMQW5hbHlzaXMgPGVtPlNCYXJyaWVyCi0gICAgICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0JhcnJpZXJMQW5hbHlzaXMKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCYXJyaWVyTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNCQVJSSUVSX0xBTkFMWVNJUyA9IDk7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQmFycmllckxBbmFseXNpcyA8ZW0+U0JhcnJpZXIKKwkgKiBMQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQmFycmllckxBbmFseXNpcworCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0JBUlJJRVJfTEFOQUxZU0lTID0gOTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JBUlJJRVJfTEFOQUxZU0lTX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fVVVJRCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkFSUklFUl9MQU5BTFlTSVNfX05BTUUgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JBUlJJRVJfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkFSUklFUl9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkFSUklFUl9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0JhcnJpZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkFSUklFUl9MQU5BTFlTSVNfX1NCQVJSSUVSID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0JhcnJpZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkFSUklFUl9MQU5BTFlTSVNfX1NCQVJSSUVSID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0JBUlJJRVJfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkFSUklFUl9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX0ZFQVRVUkVfQ09VTlQgKyAyOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQkFSUklFUl9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkFSUklFUl9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfRkVBVFVSRV9DT1VOVCArIDM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0JhcnJpZXIgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNCQVJSSUVSX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQkFSUklFUl9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9PUEVSQVRJT05fQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TTG9jYWxBbmFseXNpcyA8ZW0+U0xvY2FsCi0gICAgICogQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TTG9jYWxBbmFseXNpcwotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0FOQUxZU0lTID0gMTA7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TTG9jYWxBbmFseXNpcyA8ZW0+U0xvY2FsCisJICogQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TTG9jYWxBbmFseXNpcworCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTID0gMTA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9BTkFMWVNJU19fVVVJRCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTX19VVUlEID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9BTkFMWVNJU19fTkFNRSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTX19OQU1FID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfQU5BTFlTSVNfX0RFU0NSSVBUSU9OID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNMT0NBTF9BTkFMWVNJU19fREVTQ1JJUFRJT04gPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9BTkFMWVNJU19fREVTQ1JJUFRJT047CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1NhZmV0eSBDb25jZXB0cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfQU5BTFlTSVNfX1NTQUZFVFlfQ09OQ0VQVFNfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX19TU0FGRVRZX0NPTkNFUFRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNTYWZldHkgQ29uY2VwdHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTX19TU0FGRVRZX0NPTkNFUFRTX0xJU1QgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9BTkFMWVNJU19fU1NBRkVUWV9DT05DRVBUU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9BTkFMWVNJU19fQkFTRV9QQUNLQUdFID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNMT0NBTF9BTkFMWVNJU19fQkFTRV9QQUNLQUdFID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9BTkFMWVNJU19fU1NZU1RFTV9FVkVOVFNfTElCUkFSWSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9BTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0FOQUxZU0lTX19TQkxPQ0tTX0xBTkFMWVNJU19MSVNUID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9ja3MgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAzOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0FOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1NBRkVUWV9BTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgNDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0FOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TU0FGRVRZX0FOQUxZU0lTX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTTE9DQUxfQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NTQUZFVFlfQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50c0xpYnJhcnkgPGVtPlNTeXN0ZW0gRXZlbnRzCi0gICAgICogTGlicmFyeTwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZID0gMTE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TU3lzdGVtRXZlbnRzTGlicmFyeSA8ZW0+U1N5c3RlbSBFdmVudHMKKwkgKiBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50c0xpYnJhcnkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNTWVNURU1fRVZFTlRTX0xJQlJBUlkgPSAxMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fVVVJRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fVVVJRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KKwkJQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TU1lTVEVNX0VWRU5UX1RZUEVTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TU1lTVEVNX0VWRU5UX1RZUEVTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVMgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0xvY2FsIEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRTX0xJQlJBUllfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudFR5cGUgPGVtPlNTeXN0ZW0gRXZlbnQKLSAgICAgKiBUeXBlPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50VHlwZQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50VHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX1RZUEUgPSAxMjsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudFR5cGUgPGVtPlNTeXN0ZW0gRXZlbnQKKwkgKiBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50VHlwZQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX1RZUEUgPSAxMjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9UWVBFX19VVUlEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX1RZUEVfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9UWVBFX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX1RZUEVfX05BTUUgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfVFlQRV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9UWVBFX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfVFlQRV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX1RZUEVfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgRXZlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9UWVBFX19TRkFJTFVSRV9FVkVOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfVFlQRV9fU1NZU1RFTV9FVkVOVFNfTElCUkFSWSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9UWVBFX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX1RZUEVfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTWVNURU1fRVZFTlRfVFlQRV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TU3lzdGVtRXZlbnQgPGVtPlNTeXN0ZW0gRXZlbnQ8L2VtPn0nCi0gICAgICogY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlQgPSAxMzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudCA8ZW0+U1N5c3RlbSBFdmVudDwvZW0+fScKKwkgKiBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVCA9IDEzOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9fVVVJRCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTWVNURU1fRVZFTlRfX05BTUUgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9fU0ZBSUxVUkVfRVZFTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBFdmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTWVNURU1fRVZFTlRfX1NGQUlMVVJFX0VWRU5UID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NZU1RFTV9FVkVOVF9fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTWVNURU1fRVZFTlRfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfX0JBU0VfUFJPUEVSVFkgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX19UWVBFID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NZU1RFTV9FVkVOVF9fVFlQRSA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTWVNURU1fRVZFTlRfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU1lTVEVNX0VWRU5UX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU1lTVEVNX0VWRU5UX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTWVNURU1fRVZFTlRfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNGZWFyZWRFdmVudHNMaWJyYXJ5IDxlbT5TRmVhcmVkIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IDE0OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogTGlicmFyeTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNGZWFyZWRFdmVudHNMaWJyYXJ5CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UU19MSUJSQVJZID0gMTQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fREVTQ1JJUFRJT047CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9CisJCUFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0ZFQVJFRF9FVkVOVFNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNMb2NhbCBBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVMgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0xJQlJBUllfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50c0ZhbWlseSA8ZW0+U0ZlYXJlZCBFdmVudHMKLSAgICAgKiBGYW1pbHk8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzRmFtaWx5Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWSA9IDE1OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50c0ZhbWlseSA8ZW0+U0ZlYXJlZCBFdmVudHMKKwkgKiBGYW1pbHk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzRmFtaWx5CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWSA9IDE1OwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fVVVJRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX05BTUUgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KKwkJQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX0JBU0VfQ0xBU1MgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU2VsZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX0lTX1NFTEVDVEVEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFNlbGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19JU19TRUxFQ1RFRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NVQl9GQU1JTElFU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NVQl9GQU1JTElFU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIFNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQUxMX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIFNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQUxMX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlkgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50IDxlbT5TRmVhcmVkIEV2ZW50PC9lbT59JwotICAgICAqIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnQKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UID0gMTY7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnQgPGVtPlNGZWFyZWQgRXZlbnQ8L2VtPn0nCisJICogY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNGZWFyZWRFdmVudAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNGRUFSRURfRVZFTlQgPSAxNjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVF9fVVVJRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9fVVVJRCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRkVBUkVEX0VWRU5UX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTZWxlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNGRUFSRURfRVZFTlRfX0lTX1NFTEVDVEVEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFNlbGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9fSVNfU0VMRUNURUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUyA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1QgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVF9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0ZFQVJFRF9FVkVOVF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRkVBUkVEX0VWRU5UX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0ZFQVJFRF9FVkVOVF9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uCi0gICAgICogPGVtPlNEeXNmdW5jdGlvbmFsIEFzc29jaWF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTiA9IDE3OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgorCSAqIDxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT04gPSAxNzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1VVSUQgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19VVUlEID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19OQU1FID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fTkFNRSA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQorCQlBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25uZWN0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1IgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25uZWN0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1IgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlIE93bmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfT1dORVIgPSBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZSBPd25lcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX09XTkVSID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0FuZEdhdGVMQW5hbHlzaXMgPGVtPlNBbmQgR2F0ZQotICAgICAqIExBbmFseXNpczwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNBbmRHYXRlTEFuYWx5c2lzCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQW5kR2F0ZUxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTQU5EX0dBVEVfTEFOQUxZU0lTID0gMTg7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQW5kR2F0ZUxBbmFseXNpcyA8ZW0+U0FuZCBHYXRlCisJICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0FuZEdhdGVMQW5hbHlzaXMKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNBbmRHYXRlTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNBTkRfR0FURV9MQU5BTFlTSVMgPSAxODsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fVVVJRCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fVVVJRCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19OQU1FID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19OQU1FID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBTkRfR0FURV9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KKwkJQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBTkRfR0FURV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0KKwkJQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FORF9HQVRFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQU5EX0dBVEVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5EX0dBVEVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TQW5kIEdhdGUgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBTkRfR0FURV9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5EX0dBVEVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNPckdhdGVMQW5hbHlzaXMgPGVtPlNPciBHYXRlCi0gICAgICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU09yR2F0ZUxBbmFseXNpcwotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U09yR2F0ZUxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTT1JfR0FURV9MQU5BTFlTSVMgPSAxOTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNPckdhdGVMQW5hbHlzaXMgPGVtPlNPciBHYXRlCisJICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU09yR2F0ZUxBbmFseXNpcworCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U09yR2F0ZUxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTT1JfR0FURV9MQU5BTFlTSVMgPSAxOTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19VVUlEID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1VVSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT1JfR0FURV9MQU5BTFlTSVNfX1VVSUQgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19OQU1FID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT1JfR0FURV9MQU5BTFlTSVNfX05BTUUgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fTkFNRTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNPUl9HQVRFX0xBTkFMWVNJU19fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNPUl9HQVRFX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT1JfR0FURV9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTT1JfR0FURV9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTT1JfR0FURV9MQU5BTFlTSVNfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT1JfR0FURV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU09SX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT1JfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TT3IgR2F0ZSBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU09SX0dBVEVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPUl9HQVRFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNPUl9HQVRFX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TT3IgR2F0ZSBMQW5hbHlzaXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU09SX0dBVEVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNVbnRpbWVseUZhaWx1cmVNb2RlIDxlbT5TVW50aW1lbHkKLSAgICAgKiBGYWlsdXJlIE1vZGU8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TVW50aW1lbHlGYWlsdXJlTW9kZQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERSA9IDIwOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1VudGltZWx5RmFpbHVyZU1vZGUgPGVtPlNVbnRpbWVseQorCSAqIEZhaWx1cmUgTW9kZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNVbnRpbWVseUZhaWx1cmVNb2RlCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTVW50aW1lbHlGYWlsdXJlTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVU5USU1FTFlfRkFJTFVSRV9NT0RFID0gMjA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1VVSUQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1VVSUQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fVVVJRDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fREVTQ1JJUFRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fREVTQ1JJUFRJT047CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTVU5USU1FTFlfRkFJTFVSRV9NT0RFX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVCA9CisJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTVU5USU1FTFlfRkFJTFVSRV9NT0RFX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0KLSAgICAgICAgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPQorCQlBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fU0ZBSUxVUkVfTU9ERSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fU0ZBSUxVUkVfTU9ERSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVCA9CisJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fU0ZFQVJFRF9FVkVOVFNfTElTVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fT1dORVIgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fT1dORVIgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFkgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFkgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TVW50aW1lbHkgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TVW50aW1lbHkgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNVbnRpbWVseSBGYWlsdXJlIE1vZGU8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TVW50aW1lbHkgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVTlRJTUVMWV9GQUlMVVJFX01PREVfT1BFUkFUSU9OX0NPVU5UID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Fic2VudEZhaWx1cmVNb2RlIDxlbT5TQWJzZW50IEZhaWx1cmUKLSAgICAgKiBNb2RlPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Fic2VudEZhaWx1cmVNb2RlCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQWJzZW50RmFpbHVyZU1vZGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgU0FCU0VOVF9GQUlMVVJFX01PREUgPSAyMTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNBYnNlbnRGYWlsdXJlTW9kZSA8ZW0+U0Fic2VudCBGYWlsdXJlCisJICogTW9kZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNBYnNlbnRGYWlsdXJlTW9kZQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Fic2VudEZhaWx1cmVNb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFID0gMjE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1VVSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fVVVJRCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FCU0VOVF9GQUlMVVJFX01PREVfX05BTUUgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fTkFNRTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fREVTQ1JJUFRJT047CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KLSAgICAgICAgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0FyY2hpdGVjdHVyZSBFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0KKwkJQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPQorCQlBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fU0JMT0NLX0xBTkFMWVNJUyA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fU0ZBSUxVUkVfTU9ERSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FCU0VOVF9GQUlMVVJFX01PREVfX1NGQUlMVVJFX01PREUgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVCA9CisJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19TRkVBUkVEX0VWRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX19TRkVBUkVEX0VWRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fT1dORVIgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FCU0VOVF9GQUlMVVJFX01PREVfX09XTkVSID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX09XTkVSOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFkgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TQWJzZW50IEZhaWx1cmUgTW9kZTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNBQlNFTlRfRkFJTFVSRV9NT0RFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TQWJzZW50IEZhaWx1cmUgTW9kZTwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TQWJzZW50IEZhaWx1cmUgTW9kZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9PUEVSQVRJT05fQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRXJyb25lb3VzRmFpbHVyZU1vZGUgPGVtPlNFcnJvbmVvdXMKLSAgICAgKiBGYWlsdXJlIE1vZGU8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTRVJST05FT1VTX0ZBSUxVUkVfTU9ERSA9IDIyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Vycm9uZW91c0ZhaWx1cmVNb2RlIDxlbT5TRXJyb25lb3VzCisJICogRmFpbHVyZSBNb2RlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Vycm9uZW91c0ZhaWx1cmVNb2RlCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRXJyb25lb3VzRmFpbHVyZU1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREUgPSAyMjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX1VVSUQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1VVSUQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19OQU1FID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fTkFNRSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQotICAgICAgICBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPQorCQlBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19TQkxPQ0tfTEFOQUxZU0lTID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19TRkFJTFVSRV9NT0RFID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fU0ZBSUxVUkVfTU9ERSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUID0KLSAgICAgICAgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUID0KKwkJQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lcjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19PV05FUiA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fT1dORVIgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZID0gQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX0ZFQVRVUkVfQ09VTlQgKyAxOwogCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX09QRVJBVElPTl9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEV2ZW50IDxlbT5TTG9jYWwgRXZlbnQ8L2VtPn0nCi0gICAgICogY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEV2ZW50Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTTG9jYWxFdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfRVZFTlQgPSAyMzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEV2ZW50IDxlbT5TTG9jYWwgRXZlbnQ8L2VtPn0nCisJICogY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEV2ZW50CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTTG9jYWxFdmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTTE9DQUxfRVZFTlQgPSAyMzsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0VWRU5UX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19VVUlEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0VWRU5UX19VVUlEID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfRVZFTlRfX05BTUUgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTTE9DQUxfRVZFTlRfX05BTUUgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX05BTUU7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfRVZFTlRfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTTE9DQUxfRVZFTlRfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19ERVNDUklQVElPTjsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TQXJjaGl0ZWN0dXJlIEVsZW1lbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9FVkVOVF9fU0FSQ0hJVEVDVFVSRV9FTEVNRU5UU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNBcmNoaXRlY3R1cmUgRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0VWRU5UX19TQVJDSElURUNUVVJFX0VMRU1FTlRTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NBUkNISVRFQ1RVUkVfRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9FVkVOVF9fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0VWRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0VWRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTTE9DQUxfRVZFTlRfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0gQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBFdmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9FVkVOVF9fU0ZBSUxVUkVfRVZFTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBFdmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNMT0NBTF9FVkVOVF9fU0ZBSUxVUkVfRVZFTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTTE9DQUxfRVZFTlRfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTTE9DQUxfRVZFTlRfX1NCTE9DS19MQU5BTFlTSVMgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNMT0NBTF9FVkVOVF9fQkFTRV9QUk9QRVJUWSA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNMT0NBTF9FVkVOVF9fQkFTRV9QUk9QRVJUWSA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0VWRU5UX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNMb2NhbCBFdmVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTTE9DQUxfRVZFTlRfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19GRUFUVVJFX0NPVU5UICsgMTsKIAotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU0xPQ0FMX0VWRU5UX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0xPQ0FMX0VWRU5UX09QRVJBVElPTl9DT1VOVCA9IEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19PUEVSQVRJT05fQ09VTlQgKyAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpcyA8ZW0+U0RpcmVjdGlvbgotICAgICAqIExBbmFseXNpczwvZW0+fScgZW51bS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLlNEaXJlY3Rpb25MQW5hbHlzaXMKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgU0RJUkVDVElPTl9MQU5BTFlTSVMgPSAyNDsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5TRGlyZWN0aW9uTEFuYWx5c2lzIDxlbT5TRGlyZWN0aW9uCisJICogTEFuYWx5c2lzPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpcworCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTRElSRUNUSU9OX0xBTkFMWVNJUyA9IDI0OwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAotICAgICAqIDxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAorCSAqIDxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzIDxlbT5TUG9ydAotICAgICAqIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TUG9ydCBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTUG9ydExBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMgPGVtPlNQb3J0CisJICogTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNQb3J0TEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBzZWUgI2dldFNQb3J0TEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTUG9ydExBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBzZWUgI2dldFNQb3J0TEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTUG9ydExBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTUG9ydAotICAgICAqIDxlbT5TUG9ydDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNQb3J0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTUG9ydCgpCi0gICAgICogQHNlZSAjZ2V0U1BvcnRMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNQb3J0TEFuYWx5c2lzX1NQb3J0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNQb3J0CisJICogPGVtPlNQb3J0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U1BvcnQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNQb3J0KCkKKwkgKiBAc2VlICNnZXRTUG9ydExBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1BvcnRMQW5hbHlzaXNfU1BvcnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRCYXNlX1BvcnQKLSAgICAgKiA8ZW0+QmFzZSBQb3J0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQb3J0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRCYXNlX1BvcnQoKQotICAgICAqIEBzZWUgI2dldFNQb3J0TEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTUG9ydExBbmFseXNpc19CYXNlX1BvcnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0QmFzZV9Qb3J0CisJICogPGVtPkJhc2UgUG9ydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUG9ydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0QmFzZV9Qb3J0KCkKKwkgKiBAc2VlICNnZXRTUG9ydExBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1BvcnRMQW5hbHlzaXNfQmFzZV9Qb3J0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzIDxlbT5TRGlyZWN0aW9uIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlICNnZXRTUG9ydExBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMgPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMoKQorCSAqIEBzZWUgI2dldFNQb3J0TEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTUG9ydExBbmFseXNpc19TRGlyZWN0aW9uTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKLSAgICAgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIE93bmVyPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCisJICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyI2dldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZQotICAgICAqIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpCi0gICAgICogQHNlZSAjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcl9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA8ZW0+U0ZhaWx1cmUKKwkgKiBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKLSAgICAgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKKwkgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jaworCSAqIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQHNlZSAjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2RlIDxlbT5TRmFpbHVyZQotICAgICAqIE1vZGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTRmFpbHVyZU1vZGUoKQotICAgICAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmFpbHVyZU1vZGUoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTRmFpbHVyZU1vZGUgPGVtPlNGYWlsdXJlCisJICogTW9kZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNGYWlsdXJlIE1vZGU8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGYWlsdXJlTW9kZSgpCisJICogQHNlZSAjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGYWlsdXJlTW9kZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0IDxlbT5TRmVhcmVkCi0gICAgICogRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKQotICAgICAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0IDxlbT5TRmVhcmVkCisJICogRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaXN0IDxlbT5TRmVhcmVkIEV2ZW50cwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaXN0IDxlbT5TRmVhcmVkIEV2ZW50cworCSAqIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaXN0KCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldE93bmVyIDxlbT5Pd25lcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk93bmVyPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyNnZXRPd25lcigpCi0gICAgICogQHNlZSAjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX093bmVyKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0T3duZXIgPGVtPk93bmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+T3duZXI8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzI2dldE93bmVyKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Ci0gICAgICogPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50CisJICogPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFNQcm9wYWdhdGlvbiBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0IDxlbT5PdXQKLSAgICAgKiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCNnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPGVtPk91dAorCSAqIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCNnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPGVtPkluCi0gICAgICogU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKQotICAgICAqIEBzZWUgI2dldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X0luU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPGVtPkluCisJICogU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X0luU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsgPGVtPlNQcm9wYWdhdGlvbgotICAgICAqIExpbms8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFNQcm9wYWdhdGlvbkxpbmsoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsgPGVtPlNQcm9wYWdhdGlvbgorCSAqIExpbms8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNQcm9wYWdhdGlvbkxpbmsoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFRhcmdldCA8ZW0+RWxlbWVudCBUYXJnZXQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50IFRhcmdldDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRFbGVtZW50VGFyZ2V0KCkKLSAgICAgKiBAc2VlICNnZXRTUHJvcGFnYXRpb25MaW5rKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEVsZW1lbnRUYXJnZXQgPGVtPkVsZW1lbnQgVGFyZ2V0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudCBUYXJnZXQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFRhcmdldCgpCisJICogQHNlZSAjZ2V0U1Byb3BhZ2F0aW9uTGluaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50VGFyZ2V0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlICNnZXRTUHJvcGFnYXRpb25MaW5rKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTUHJvcGFnYXRpb25MaW5rX1NCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBzZWUgI2dldFNQcm9wYWdhdGlvbkxpbmsoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNQcm9wYWdhdGlvbkxpbmtfU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEJhc2VfRGVwZW5kZW5jeSA8ZW0+QmFzZSBEZXBlbmRlbmN5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBEZXBlbmRlbmN5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEJhc2VfRGVwZW5kZW5jeSgpCi0gICAgICogQHNlZSAjZ2V0U1Byb3BhZ2F0aW9uTGluaygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U1Byb3BhZ2F0aW9uTGlua19CYXNlX0RlcGVuZGVuY3koKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEJhc2VfRGVwZW5kZW5jeSA8ZW0+QmFzZSBEZXBlbmRlbmN5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBEZXBlbmRlbmN5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEJhc2VfRGVwZW5kZW5jeSgpCisJICogQHNlZSAjZ2V0U1Byb3BhZ2F0aW9uTGluaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1Byb3BhZ2F0aW9uTGlua19CYXNlX0RlcGVuZGVuY3koKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFNvdXJjZSA8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50IFNvdXJjZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRFbGVtZW50U291cmNlKCkKLSAgICAgKiBAc2VlICNnZXRTUHJvcGFnYXRpb25MaW5rKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRTb3VyY2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEVsZW1lbnRTb3VyY2UgPGVtPkVsZW1lbnQgU291cmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFNvdXJjZSgpCisJICogQHNlZSAjZ2V0U1Byb3BhZ2F0aW9uTGluaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50U291cmNlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCi0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jaworCSAqIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNCbG9ja0xBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTQmxvY2sKLSAgICAgKiA8ZW0+U0Jsb2NrPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0Jsb2NrPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0Jsb2NrKCkKLSAgICAgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TQmxvY2soKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNCbG9jaworCSAqIDxlbT5TQmxvY2s8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TQmxvY2s8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTQmxvY2soKQorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCbG9jaygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZSBFdmVudHMKLSAgICAgKiBMQW5hbHlzaXMgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZhaWx1cmUgRXZlbnRzIExBbmFseXNpcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QgPGVtPlNGYWlsdXJlIEV2ZW50cworCSAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TRmFpbHVyZSBFdmVudHMgTEFuYWx5c2lzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCA8ZW0+U1BvcnRzIExBbmFseXNpcwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNQb3J0cyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNQb3J0c0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTUG9ydHNMQW5hbHlzaXNMaXN0IDxlbT5TUG9ydHMgTEFuYWx5c2lzCisJICogTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U1BvcnRzIExBbmFseXNpcyBMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCgpCisJICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU1BvcnRzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldEJhc2VfQ2xhc3MgPGVtPkJhc2UgQ2xhc3M8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIENsYXNzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfQmFzZV9DbGFzcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldEJhc2VfQ2xhc3MoKQorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX0Jhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0IDxlbT5TTG9naWNhbCBHYXRlcwotICAgICAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TTG9naWNhbCBHYXRlcyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0IDxlbT5TTG9naWNhbCBHYXRlcworCSAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TTG9naWNhbCBHYXRlcyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCkKKwkgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPGVtPlNGYWlsdXJlIE1vZGVzCi0gICAgICogTEFuYWx5c2lzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPGVtPlNGYWlsdXJlIE1vZGVzCisJICogTEFuYWx5c2lzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0IDxlbT5TQmFycmllcnMgTEFuYWx5c2lzCi0gICAgICogTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0JhcnJpZXJzIExBbmFseXNpcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QgPGVtPlNCYXJyaWVycyBMQW5hbHlzaXMKKwkgKiBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TQmFycmllcnMgTEFuYWx5c2lzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0KCkKKwkgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TQmFycmllcnNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2NhbEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TTG9jYWxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTTG9jYWxBbmFseXNpcyA8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0xvY2FsQW5hbHlzaXMoKQorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2NhbEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPGVtPlNQcm9wYWdhdGlvbiBMaW5rcwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPGVtPlNQcm9wYWdhdGlvbiBMaW5rcworCSAqIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkKKwkgKiBAc2VlICNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCi0gICAgICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIEV2ZW50IExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBFdmVudCBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKKwkgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIEV2ZW50IExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTRmFpbHVyZUV2ZW50IDxlbT5TRmFpbHVyZQotICAgICAqIEV2ZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTRmFpbHVyZUV2ZW50KCkKLSAgICAgKiBAc2VlICNnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc19TRmFpbHVyZUV2ZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzI2dldFNGYWlsdXJlRXZlbnQgPGVtPlNGYWlsdXJlCisJICogRXZlbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmFpbHVyZSBFdmVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzI2dldFNGYWlsdXJlRXZlbnQoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NGYWlsdXJlRXZlbnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jawotICAgICAqIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jaworCSAqIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcwotICAgICAqIDxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcworCSAqIDxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jawotICAgICAqIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQHNlZSAjZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCisJICogTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzIDxlbT5TQmFycmllcgotICAgICAqIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TQmFycmllciBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTQmFycmllckxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMgPGVtPlNCYXJyaWVyCisJICogTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNCYXJyaWVyTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRTQmFycmllciA8ZW0+U0JhcnJpZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TQmFycmllcjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMjZ2V0U0JhcnJpZXIoKQotICAgICAqIEBzZWUgI2dldFNCYXJyaWVyTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTQmFycmllckxBbmFseXNpc19TQmFycmllcigpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCYXJyaWVyIDxlbT5TQmFycmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCYXJyaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRTQmFycmllcigpCisJICogQHNlZSAjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCYXJyaWVyTEFuYWx5c2lzX1NCYXJyaWVyKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQHNlZSAjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCYXJyaWVyTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQHNlZSAjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCYXJyaWVyTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQHNlZSAjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQHNlZSAjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyA8ZW0+U0xvY2FsCi0gICAgICogQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0xvY2FsQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwKKwkgKiBBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTTG9jYWxBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0QmFzZV9QYWNrYWdlIDxlbT5CYXNlIFBhY2thZ2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldEJhc2VfUGFja2FnZSgpCi0gICAgICogQHNlZSAjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNMb2NhbEFuYWx5c2lzX0Jhc2VfUGFja2FnZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldEJhc2VfUGFja2FnZSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRCYXNlX1BhY2thZ2UoKQorCSAqIEBzZWUgI2dldFNMb2NhbEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTTG9jYWxBbmFseXNpc19CYXNlX1BhY2thZ2UoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5IDxlbT5TU3lzdGVtIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCi0gICAgICogQHNlZSAjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNMb2NhbEFuYWx5c2lzX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkgPGVtPlNTeXN0ZW0gRXZlbnRzCisJICogTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKKwkgKiBAc2VlICNnZXRTTG9jYWxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0xvY2FsQW5hbHlzaXNfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5IDxlbT5TRmVhcmVkIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCi0gICAgICogQHNlZSAjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNMb2NhbEFuYWx5c2lzX1NGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkgKiBAc2VlICNnZXRTTG9jYWxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QgPGVtPlNCbG9ja3MgTEFuYWx5c2lzCi0gICAgICogTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBzZWUgI2dldFNMb2NhbEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTTG9jYWxBbmFseXNpc19TQmxvY2tzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QgPGVtPlNCbG9ja3MgTEFuYWx5c2lzCisJICogTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgI2dldFNMb2NhbEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTTG9jYWxBbmFseXNpc19TQmxvY2tzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSA8ZW0+U1N5c3RlbQotICAgICAqIEV2ZW50cyBMaWJyYXJ5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkgPGVtPlNTeXN0ZW0KKwkgKiBFdmVudHMgTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldEJhc2VfUGFja2FnZSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSNnZXRCYXNlX1BhY2thZ2UoKQotICAgICAqIEBzZWUgI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9CYXNlX1BhY2thZ2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSNnZXRCYXNlX1BhY2thZ2UgPGVtPkJhc2UgUGFja2FnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0QmFzZV9QYWNrYWdlKCkKKwkgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNTeXN0ZW1FdmVudFR5cGVzTGlzdCA8ZW0+U1N5c3RlbSBFdmVudCBUeXBlcwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU1N5c3RlbUV2ZW50VHlwZXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSNnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QgPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZXMKKwkgKiBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TU3lzdGVtIEV2ZW50IFR5cGVzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNTeXN0ZW1FdmVudFR5cGVzTGlzdCgpCisJICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NTeXN0ZW1FdmVudFR5cGVzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBzZWUgI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TTG9jYWxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzKCkKKwkgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSA8ZW0+U1N5c3RlbSBFdmVudAotICAgICAqIFR5cGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTU3lzdGVtRXZlbnRUeXBlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlIDxlbT5TU3lzdGVtIEV2ZW50CisJICogVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50IFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNTeXN0ZW1FdmVudFR5cGUoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZSBDbGFzczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50VHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50VHlwZV9CYXNlX0NsYXNzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRUeXBlX0Jhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0U0ZhaWx1cmVFdmVudCA8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmFpbHVyZSBFdmVudDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRTRmFpbHVyZUV2ZW50KCkKLSAgICAgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRUeXBlX1NGYWlsdXJlRXZlbnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNGYWlsdXJlRXZlbnQgPGVtPlNGYWlsdXJlIEV2ZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0U0ZhaWx1cmVFdmVudCgpCisJICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50VHlwZV9TRmFpbHVyZUV2ZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0SW5zdGFuY2VzTGlzdCA8ZW0+SW5zdGFuY2VzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluc3RhbmNlcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldEluc3RhbmNlc0xpc3QoKQotICAgICAqIEBzZWUgI2dldFNTeXN0ZW1FdmVudFR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudFR5cGVfSW5zdGFuY2VzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRJbnN0YW5jZXNMaXN0IDxlbT5JbnN0YW5jZXMgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5zdGFuY2VzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0SW5zdGFuY2VzTGlzdCgpCisJICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50VHlwZV9JbnN0YW5jZXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5IDxlbT5TU3lzdGVtIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRUeXBlX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSA8ZW0+U1N5c3RlbSBFdmVudHMKKwkgKiBMaWJyYXJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCisJICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50VHlwZV9TU3lzdGVtRXZlbnRzTGlicmFyeSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQgPGVtPlNTeXN0ZW0KLSAgICAgKiBFdmVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TU3lzdGVtIEV2ZW50PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFNTeXN0ZW1FdmVudCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50IDxlbT5TU3lzdGVtCisJICogRXZlbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1N5c3RlbSBFdmVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTU3lzdGVtRXZlbnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50I2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBzZWUgI2dldFNTeXN0ZW1FdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50X0Jhc2VfUHJvcGVydHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudF9CYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50I2dldFR5cGUKLSAgICAgKiA8ZW0+VHlwZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlR5cGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRUeXBlKCkKLSAgICAgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudF9UeXBlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRUeXBlCisJICogPGVtPlR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQjZ2V0VHlwZSgpCisJICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRfVHlwZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeSA8ZW0+U0ZlYXJlZAotICAgICAqIEV2ZW50cyBMaWJyYXJ5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQKKwkgKiBFdmVudHMgTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldEJhc2VfUGFja2FnZSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeSNnZXRCYXNlX1BhY2thZ2UoKQotICAgICAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9CYXNlX1BhY2thZ2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeSNnZXRCYXNlX1BhY2thZ2UgPGVtPkJhc2UgUGFja2FnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0QmFzZV9QYWNrYWdlKCkKKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QgPGVtPlNGZWFyZWQgRXZlbnRzCi0gICAgICogRmFtaWxpZXMgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpCi0gICAgICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogRmFtaWxpZXMgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpCisJICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QgPGVtPlNGZWFyZWQgRXZlbnRzCi0gICAgICogTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKQotICAgICAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKQorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TTG9jYWxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzKCkKKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSA8ZW0+U0ZlYXJlZAotICAgICAqIEV2ZW50cyBGYW1pbHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWx5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5IDxlbT5TRmVhcmVkCisJICogRXZlbnRzIEZhbWlseTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNGZWFyZWRFdmVudHNGYW1pbHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZSBDbGFzczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9CYXNlX0NsYXNzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X0Jhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRTRmVhcmVkRXZlbnRzTGlzdCA8ZW0+U0ZlYXJlZCBFdmVudHMKLSAgICAgKiBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaXN0IDxlbT5TRmVhcmVkIEV2ZW50cworCSAqIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKQorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNGYW1pbHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjaXNTZWxlY3RlZCA8ZW0+SXMgU2VsZWN0ZWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTZWxlY3RlZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNpc1NlbGVjdGVkKCkKLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X0lzU2VsZWN0ZWQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2lzU2VsZWN0ZWQgPGVtPklzIFNlbGVjdGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjaXNTZWxlY3RlZCgpCisJICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9Jc1NlbGVjdGVkKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U3ViRmFtaWxpZXNMaXN0IDxlbT5TdWIgRmFtaWxpZXMgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIEZhbWlsaWVzIExpc3Q8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U3ViRmFtaWxpZXNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1N1YkZhbWlsaWVzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRTdWJGYW1pbGllc0xpc3QgPGVtPlN1YiBGYW1pbGllcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgRmFtaWxpZXMgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRTdWJGYW1pbGllc0xpc3QoKQorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNGYW1pbHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU3ViRmFtaWxpZXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QgPGVtPkFsbCBTRmVhcmVkIEV2ZW50cwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFsbCBTRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldEFsbFNGZWFyZWRFdmVudHNMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X0FsbFNGZWFyZWRFdmVudHNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldEFsbFNGZWFyZWRFdmVudHNMaXN0IDxlbT5BbGwgU0ZlYXJlZCBFdmVudHMKKwkgKiBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BbGwgU0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpCisJICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9BbGxTRmVhcmVkRXZlbnRzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IDxlbT5TRmFpbHVyZSBNb2RlcwotICAgICAqIExBbmFseXNpcyBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpCi0gICAgICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA8ZW0+U0ZhaWx1cmUgTW9kZXMKKwkgKiBMQW5hbHlzaXMgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNGYW1pbHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQgRXZlbnRzCi0gICAgICogTGlicmFyeTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKQotICAgICAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNGYW1pbHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5IDxlbT5TRmVhcmVkIEV2ZW50cworCSAqIExpYnJhcnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCA8ZW0+U0ZlYXJlZAotICAgICAqIEV2ZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNGZWFyZWQgRXZlbnQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0ZlYXJlZEV2ZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQgPGVtPlNGZWFyZWQKKwkgKiBFdmVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRmVhcmVkIEV2ZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNGZWFyZWRFdmVudCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNpc1NlbGVjdGVkCi0gICAgICogPGVtPklzIFNlbGVjdGVkPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNpc1NlbGVjdGVkKCkKLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFNGZWFyZWRFdmVudF9Jc1NlbGVjdGVkKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNpc1NlbGVjdGVkCisJICogPGVtPklzIFNlbGVjdGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNpc1NlbGVjdGVkKCkKKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNGZWFyZWRFdmVudF9Jc1NlbGVjdGVkKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50I2dldEJhc2VfQ2xhc3MKLSAgICAgKiA8ZW0+QmFzZSBDbGFzczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudF9CYXNlX0NsYXNzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRCYXNlX0NsYXNzCisJICogPGVtPkJhc2UgQ2xhc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0QmFzZV9DbGFzcygpCisJICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRfQmFzZV9DbGFzcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPGVtPlNGYWlsdXJlIE1vZGVzCi0gICAgICogTEFuYWx5c2lzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBzZWUgI2dldFNGZWFyZWRFdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdAorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPGVtPlNGYWlsdXJlIE1vZGVzCisJICogTEFuYWx5c2lzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQgRXZlbnRzCi0gICAgICogTGlicmFyeTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCi0gICAgICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgICAqIDxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgorCSAqIDxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPGVtPlNGYWlsdXJlIE1vZGUKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmFpbHVyZSBNb2RlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQotICAgICAqIEBzZWUgI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fU0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPGVtPlNGYWlsdXJlIE1vZGUKKwkgKiBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TRmFpbHVyZSBNb2RlIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQorCSAqIEBzZWUgI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fU0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uI2dldEJhc2VfQ29ubmVjdG9yIDxlbT5CYXNlIENvbm5lY3RvcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgQ29ubmVjdG9yPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uI2dldEJhc2VfQ29ubmVjdG9yKCkKLSAgICAgKiBAc2VlICNnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX0Jhc2VfQ29ubmVjdG9yKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRCYXNlX0Nvbm5lY3RvciA8ZW0+QmFzZSBDb25uZWN0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIENvbm5lY3RvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRCYXNlX0Nvbm5lY3RvcigpCisJICogQHNlZSAjZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9CYXNlX0Nvbm5lY3RvcigpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVPd25lciA8ZW0+U0ZhaWx1cmUgTW9kZQotICAgICAqIE93bmVyPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVPd25lcigpCi0gICAgICogQHNlZSAjZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVPd25lcigpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24jZ2V0U0ZhaWx1cmVNb2RlT3duZXIgPGVtPlNGYWlsdXJlIE1vZGUKKwkgKiBPd25lcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24jZ2V0U0ZhaWx1cmVNb2RlT3duZXIoKQorCSAqIEBzZWUgI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fU0ZhaWx1cmVNb2RlT3duZXIoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0FuZEdhdGVMQW5hbHlzaXMgPGVtPlNBbmQgR2F0ZQotICAgICAqIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TQW5kIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQW5kR2F0ZUxBbmFseXNpcwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U0FuZEdhdGVMQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNBbmRHYXRlTEFuYWx5c2lzIDxlbT5TQW5kIEdhdGUKKwkgKiBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0FuZEdhdGVMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNBbmRHYXRlTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQW5kR2F0ZUxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0FuZEdhdGVMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQHNlZSAjZ2V0U0FuZEdhdGVMQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNBbmRHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQW5kR2F0ZUxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0FuZEdhdGVMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQHNlZSAjZ2V0U0FuZEdhdGVMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNBbmRHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU09yR2F0ZUxBbmFseXNpcyA8ZW0+U09yIEdhdGUKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTT3JHYXRlTEFuYWx5c2lzCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTT3JHYXRlTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTT3JHYXRlTEFuYWx5c2lzIDxlbT5TT3IgR2F0ZQorCSAqIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TT3IgR2F0ZSBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNPckdhdGVMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNPckdhdGVMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNPckdhdGVMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNPckdhdGVMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQHNlZSAjZ2V0U09yR2F0ZUxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVSZWZlcmVuY2UgZ2V0U09yR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU09yR2F0ZUxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU09yR2F0ZUxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAc2VlICNnZXRTT3JHYXRlTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTT3JHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUgPGVtPlNVbnRpbWVseQotICAgICAqIEZhaWx1cmUgTW9kZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TVW50aW1lbHkgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTVW50aW1lbHlGYWlsdXJlTW9kZQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNVbnRpbWVseUZhaWx1cmVNb2RlIDxlbT5TVW50aW1lbHkKKwkgKiBGYWlsdXJlIE1vZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNVbnRpbWVseUZhaWx1cmVNb2RlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTVW50aW1lbHlGYWlsdXJlTW9kZSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQHNlZSAjZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNVbnRpbWVseUZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTVW50aW1lbHlGYWlsdXJlTW9kZSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQHNlZSAjZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNVbnRpbWVseUZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlIDxlbT5TQWJzZW50Ci0gICAgICogRmFpbHVyZSBNb2RlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQWJzZW50RmFpbHVyZU1vZGUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFNBYnNlbnRGYWlsdXJlTW9kZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlIDxlbT5TQWJzZW50CisJICogRmFpbHVyZSBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQWJzZW50RmFpbHVyZU1vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNBYnNlbnRGYWlsdXJlTW9kZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQWJzZW50RmFpbHVyZU1vZGUjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQHNlZSAjZ2V0U0Fic2VudEZhaWx1cmVNb2RlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTQWJzZW50RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNBYnNlbnRGYWlsdXJlTW9kZSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlI2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldFNBYnNlbnRGYWlsdXJlTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Fic2VudEZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Vycm9uZW91c0ZhaWx1cmVNb2RlIDxlbT5TRXJyb25lb3VzCi0gICAgICogRmFpbHVyZSBNb2RlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Vycm9uZW91c0ZhaWx1cmVNb2RlIDxlbT5TRXJyb25lb3VzCisJICogRmFpbHVyZSBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNFcnJvbmVvdXMgRmFpbHVyZSBNb2RlPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Vycm9uZW91c0ZhaWx1cmVNb2RlI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQHNlZSAjZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTRXJyb25lb3VzRmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Vycm9uZW91c0ZhaWx1cmVNb2RlI2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsRXZlbnQgPGVtPlNMb2NhbCBFdmVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRTTG9jYWxFdmVudCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsRXZlbnQgPGVtPlNMb2NhbCBFdmVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTTG9jYWxFdmVudCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50I2dldEJhc2VfUHJvcGVydHkKLSAgICAgKiA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50I2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBzZWUgI2dldFNMb2NhbEV2ZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRVJlZmVyZW5jZSBnZXRTTG9jYWxFdmVudF9CYXNlX1Byb3BlcnR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50I2dldEJhc2VfUHJvcGVydHkKKwkgKiA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50I2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldFNMb2NhbEV2ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTTG9jYWxFdmVudF9CYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5TRGlyZWN0aW9uTEFuYWx5c2lzIDxlbT5TRGlyZWN0aW9uCi0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpcwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRW51bSBnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpcyA8ZW0+U0RpcmVjdGlvbgorCSAqIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT4nLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLlNEaXJlY3Rpb25MQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5IGdldEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5IGdldEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KCk7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiA8bGk+ZWFjaCBvcGVyYXRpb24gb2YgZWFjaCBjbGFzcyw8L2xpPgotICAgICAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAgICAgKiA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgTGl0ZXJhbHMgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAotICAgICAgICAgKiA8ZW0+QWJzdHJhY3QgU0xvY2FsIEFuYWx5c2lzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBBQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJCSAqIDxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFCU1RSQUNUX1NMT0NBTF9BTkFMWVNJU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUG9ydExBbmFseXNpcyA8ZW0+U1BvcnQKLSAgICAgICAgICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNQb3J0TEFuYWx5c2lzCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1BvcnRMQW5hbHlzaXMoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgU1BPUlRfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNQb3J0TEFuYWx5c2lzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1BvcnRMQW5hbHlzaXMgPGVtPlNQb3J0CisJCSAqIExBbmFseXNpczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUG9ydExBbmFseXNpcworCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQb3J0TEFuYWx5c2lzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNQT1JUX0xBTkFMWVNJUyA9IGVJTlNUQU5DRS5nZXRTUG9ydExBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTUE9SVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U1BvcnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTUE9SVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U1BvcnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TUG9ydDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTUE9SVF9MQU5BTFlTSVNfX1NQT1JUID0gZUlOU1RBTkNFLmdldFNQb3J0TEFuYWx5c2lzX1NQb3J0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U1BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1BPUlRfTEFOQUxZU0lTX19TUE9SVCA9IGVJTlNUQU5DRS5nZXRTUG9ydExBbmFseXNpc19TUG9ydCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNQT1JUX0xBTkFMWVNJU19fQkFTRV9QT1JUID0gZUlOU1RBTkNFLmdldFNQb3J0TEFuYWx5c2lzX0Jhc2VfUG9ydCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUG9ydDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVCA9IGVJTlNUQU5DRS5nZXRTUG9ydExBbmFseXNpc19CYXNlX1BvcnQoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNQT1JUX0xBTkFMWVNJU19fU0RJUkVDVElPTl9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNQT1JUX0xBTkFMWVNJU19fU0RJUkVDVElPTl9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcgotICAgICAgICAgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCisJCSAqIDxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIE93bmVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVIgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcl9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1QgPQorCQkJZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgICAgICAqIDxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIExBbmFseXNpczwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcwotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKKwkJICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPQotICAgICAgICAgICAgZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMgPQorCQkJZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERSA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZhaWx1cmVNb2RlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERSA9CisJCQllSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZhaWx1cmVNb2RlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QgPQotICAgICAgICAgICAgZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QgPQorCQkJZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVCA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1QgPQorCQkJZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Pd25lcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVIgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Pd25lcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVIgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudAotICAgICAgICAgKiA8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Ci0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudAorCQkgKiA8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50CisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0IFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1QgPQorCQkJZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfSW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9CisJCQllSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X0luU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUHJvcGFnYXRpb25MaW5rCi0gICAgICAgICAqIDxlbT5TUHJvcGFnYXRpb24gTGluazwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TUHJvcGFnYXRpb25MaW5rCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1Byb3BhZ2F0aW9uTGluaygpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTUFJPUEFHQVRJT05fTElOSyA9IGVJTlNUQU5DRS5nZXRTUHJvcGFnYXRpb25MaW5rKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1Byb3BhZ2F0aW9uTGluaworCQkgKiA8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1Byb3BhZ2F0aW9uTGluaworCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQcm9wYWdhdGlvbkxpbmsoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1BST1BBR0FUSU9OX0xJTksgPSBlSU5TVEFOQ0UuZ2V0U1Byb3BhZ2F0aW9uTGluaygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUID0gZUlOU1RBTkNFLmdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFRhcmdldCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1RBUkdFVCA9IGVJTlNUQU5DRS5nZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1BST1BBR0FUSU9OX0xJTktfX1NCTE9DS19MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U1Byb3BhZ2F0aW9uTGlua19TQmxvY2tMQW5hbHlzaXMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNQUk9QQUdBVElPTl9MSU5LX19TQkxPQ0tfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNQcm9wYWdhdGlvbkxpbmtfU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIERlcGVuZGVuY3k8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1BST1BBR0FUSU9OX0xJTktfX0JBU0VfREVQRU5ERU5DWSA9IGVJTlNUQU5DRS5nZXRTUHJvcGFnYXRpb25MaW5rX0Jhc2VfRGVwZW5kZW5jeSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgRGVwZW5kZW5jeTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTUFJPUEFHQVRJT05fTElOS19fQkFTRV9ERVBFTkRFTkNZID0gZUlOU1RBTkNFLmdldFNQcm9wYWdhdGlvbkxpbmtfQmFzZV9EZXBlbmRlbmN5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTUFJPUEFHQVRJT05fTElOS19fRUxFTUVOVF9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50U291cmNlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBTb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFID0gZUlOU1RBTkNFLmdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFNvdXJjZSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgICAgICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNCbG9ja0xBbmFseXNpcwotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTQkxPQ0tfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNCbG9ja0xBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCisJCSAqIExBbmFseXNpczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQmxvY2tMQW5hbHlzaXMKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmxvY2tMQW5hbHlzaXMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0JMT0NLX0xBTkFMWVNJUyA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0sgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCbG9jaygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0sgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCbG9jaygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgRXZlbnRzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgRXZlbnRzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUID0KKwkJCWVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TUG9ydHMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TUE9SVFNfTEFOQUxZU0lTX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TUG9ydHMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TUE9SVFNfTEFOQUxZU0lTX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfQmFzZV9DbGFzcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfQmFzZV9DbGFzcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0xvZ2ljYWwgR2F0ZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TTE9HSUNBTF9HQVRFU19MQU5BTFlTSVNfTElTVCA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0xvZ2ljYWwgR2F0ZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TTE9HSUNBTF9HQVRFU19MQU5BTFlTSVNfTElTVCA9CisJCQllSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0KKwkJCWVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCYXJyaWVycyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNCTE9DS19MQU5BTFlTSVNfX1NCQVJSSUVSU19MQU5BTFlTSVNfTElTVCA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCYXJyaWVycyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNCTE9DS19MQU5BTFlTSVNfX1NCQVJSSUVSU19MQU5BTFlTSVNfTElTVCA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0xvY2FsIEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNCTE9DS19MQU5BTFlTSVNfX1NMT0NBTF9BTkFMWVNJUyA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0xvY2FsQW5hbHlzaXMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0JMT0NLX0xBTkFMWVNJU19fU0xPQ0FMX0FOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNCbG9ja0xBbmFseXNpc19TTG9jYWxBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQkxPQ0tfTEFOQUxZU0lTX19TUFJPUEFHQVRJT05fTElOS1NfTElTVCA9IGVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKLSAgICAgICAgICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIEV2ZW50IExBbmFseXNpczwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcworCQkgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcworCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBFdmVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlQgPQorCQkJZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc19TRmFpbHVyZUV2ZW50KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0KKwkJCWVJTlNUQU5DRS5nZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcwotICAgICAgICAgKiA8ZW0+QWJzdHJhY3QgU0xvZ2ljYWwgR2F0ZSBMQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJUyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCisJCSAqIDxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5BYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcworCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0KKwkJCWVJTlNUQU5DRS5nZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNCYXJyaWVyTEFuYWx5c2lzIDxlbT5TQmFycmllcgotICAgICAgICAgKiBMQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0JhcnJpZXJMQW5hbHlzaXMKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmFycmllckxBbmFseXNpcygpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTQkFSUklFUl9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQmFycmllckxBbmFseXNpcyA8ZW0+U0JhcnJpZXIKKwkJICogTEFuYWx5c2lzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNCYXJyaWVyTEFuYWx5c2lzCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0JBUlJJRVJfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNCYXJyaWVyTEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmFycmllcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkFSUklFUl9MQU5BTFlTSVNfX1NCQVJSSUVSID0gZUlOU1RBTkNFLmdldFNCYXJyaWVyTEFuYWx5c2lzX1NCYXJyaWVyKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0JhcnJpZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0JBUlJJRVJfTEFOQUxZU0lTX19TQkFSUklFUiA9IGVJTlNUQU5DRS5nZXRTQmFycmllckxBbmFseXNpc19TQmFycmllcigpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U0JhcnJpZXJMQW5hbHlzaXNfQmFzZV9Qcm9wZXJ0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0JBUlJJRVJfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFNCYXJyaWVyTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0JBUlJJRVJfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0JBUlJJRVJfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbAotICAgICAgICAgKiBBbmFseXNpczwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TTG9jYWxBbmFseXNpcwotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNMb2NhbEFuYWx5c2lzKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNMT0NBTF9BTkFMWVNJUyA9IGVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwKKwkJICogQW5hbHlzaXM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0xvY2FsQW5hbHlzaXMKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTTG9jYWxBbmFseXNpcygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTTE9DQUxfQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U0xvY2FsQW5hbHlzaXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTTE9DQUxfQU5BTFlTSVNfX0JBU0VfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpc19CYXNlX1BhY2thZ2UoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0U0xvY2FsQW5hbHlzaXNfQmFzZV9QYWNrYWdlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNMT0NBTF9BTkFMWVNJU19fU1NZU1RFTV9FVkVOVFNfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpc19TU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0xPQ0FMX0FOQUxZU0lTX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZID0gZUlOU1RBTkNFLmdldFNMb2NhbEFuYWx5c2lzX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNMT0NBTF9BTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpc19TRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0xPQ0FMX0FOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZID0gZUlOU1RBTkNFLmdldFNMb2NhbEFuYWx5c2lzX1NGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TQmxvY2tzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0xPQ0FMX0FOQUxZU0lTX19TQkxPQ0tTX0xBTkFMWVNJU19MSVNUID0gZUlOU1RBTkNFLmdldFNMb2NhbEFuYWx5c2lzX1NCbG9ja3NMQW5hbHlzaXNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVCA9IGVJTlNUQU5DRS5nZXRTTG9jYWxBbmFseXNpc19TQmxvY2tzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50c0xpYnJhcnkKLSAgICAgICAgICogPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50c0xpYnJhcnkKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTU1lTVEVNX0VWRU5UU19MSUJSQVJZID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50c0xpYnJhcnkKKwkJICogPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50c0xpYnJhcnkKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTU1lTVEVNX0VWRU5UU19MSUJSQVJZID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X0Jhc2VfUGFja2FnZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50IFR5cGVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TU1lTVEVNX0VWRU5UX1RZUEVTX0xJU1QgPQotICAgICAgICAgICAgZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NTeXN0ZW1FdmVudFR5cGVzTGlzdCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNTeXN0ZW0gRXZlbnQgVHlwZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NTWVNURU1fRVZFTlRfVFlQRVNfTElTVCA9CisJCQllSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU1N5c3RlbUV2ZW50VHlwZXNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NMb2NhbEFuYWx5c2lzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0xvY2FsIEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUyA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TTG9jYWxBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50VHlwZSA8ZW0+U1N5c3RlbQotICAgICAgICAgKiBFdmVudCBUeXBlPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudFR5cGUKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRUeXBlKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNTWVNURU1fRVZFTlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50VHlwZSA8ZW0+U1N5c3RlbQorCQkgKiBFdmVudCBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudFR5cGUKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNTWVNURU1fRVZFTlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX0Jhc2VfQ2xhc3MoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX0Jhc2VfQ2xhc3MoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRfVFlQRV9fU0ZBSUxVUkVfRVZFTlQgPSBlSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50VHlwZV9TRmFpbHVyZUV2ZW50KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgRXZlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1NZU1RFTV9FVkVOVF9UWVBFX19TRkFJTFVSRV9FVkVOVCA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX1NGYWlsdXJlRXZlbnQoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1NZU1RFTV9FVkVOVF9UWVBFX19JTlNUQU5DRVNfTElTVCA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX0luc3RhbmNlc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRfVFlQRV9fSU5TVEFOQ0VTX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50VHlwZV9JbnN0YW5jZXNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNTWVNURU1fRVZFTlRfVFlQRV9fU1NZU1RFTV9FVkVOVFNfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTU1lTVEVNX0VWRU5UX1RZUEVfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50VHlwZV9TU3lzdGVtRXZlbnRzTGlicmFyeSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU1N5c3RlbUV2ZW50IDxlbT5TU3lzdGVtCi0gICAgICAgICAqIEV2ZW50PC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudAotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTU1lTVEVNX0VWRU5UID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNTeXN0ZW1FdmVudCA8ZW0+U1N5c3RlbQorCQkgKiBFdmVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TU3lzdGVtRXZlbnQKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1NZU1RFTV9FVkVOVCA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnQoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTU1lTVEVNX0VWRU5UX19UWVBFID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudF9UeXBlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTU1lTVEVNX0VWRU5UX19UWVBFID0gZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudF9UeXBlKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAgICAgKiA8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNGRUFSRURfRVZFTlRTX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzTGlicmFyeQorCQkgKiA8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzTGlicmFyeQorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNGRUFSRURfRVZFTlRTX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9CYXNlX1BhY2thZ2UoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QgPQorCQkJZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19MSVNUID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNMb2NhbCBBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NMb2NhbEFuYWx5c2lzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzRmFtaWx5Ci0gICAgICAgICAqIDxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50c0ZhbWlseQotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHkoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHkoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnRzRmFtaWx5CisJCSAqIDxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50c0ZhbWlseQorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfQmFzZV9DbGFzcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfQmFzZV9DbGFzcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElTVCA9IGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElTVCA9IGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTZWxlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX0lTX1NFTEVDVEVEID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfSXNTZWxlY3RlZCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFNlbGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fSVNfU0VMRUNURUQgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9Jc1NlbGVjdGVkKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU1VCX0ZBTUlMSUVTX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TdWJGYW1pbGllc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU1VCX0ZBTUlMSUVTX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TdWJGYW1pbGllc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsbCBTRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19BTExfU0ZFQVJFRF9FVkVOVFNfTElTVCA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9BbGxTRmVhcmVkRXZlbnRzTGlzdCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsbCBTRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19BTExfU0ZFQVJFRF9FVkVOVFNfTElTVCA9CisJCQllSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9BbGxTRmVhcmVkRXZlbnRzTGlzdCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0KKwkJCWVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9Ci0gICAgICAgICAgICBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZID0KKwkJCWVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRmVhcmVkRXZlbnQgPGVtPlNGZWFyZWQKLSAgICAgICAgICogRXZlbnQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50Ci0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50KCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNGRUFSRURfRVZFTlQgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0ZlYXJlZEV2ZW50IDxlbT5TRmVhcmVkCisJCSAqIEV2ZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNGZWFyZWRFdmVudAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTRkVBUkVEX0VWRU5UID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU2VsZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgU0ZFQVJFRF9FVkVOVF9fSVNfU0VMRUNURUQgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50X0lzU2VsZWN0ZWQoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTZWxlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRkVBUkVEX0VWRU5UX19JU19TRUxFQ1RFRCA9IGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRfSXNTZWxlY3RlZCgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudF9CYXNlX0NsYXNzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTID0gZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudF9CYXNlX0NsYXNzKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUID0KKwkJCWVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0ZFQVJFRF9FVkVOVF9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uCi0gICAgICAgICAqIDxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTiA9IGVJTlNUQU5DRS5nZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgorCQkgKiA8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT04gPSBlSU5TVEFOQ0UuZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZUxBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUyA9CisJCQllSU5TVEFOQ0UuZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVMQW5hbHlzaXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29ubmVjdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19CQVNFX0NPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX0Jhc2VfQ29ubmVjdG9yKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25uZWN0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SID0gZUlOU1RBTkNFLmdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fQmFzZV9Db25uZWN0b3IoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGUgT3duZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfT1dORVIgPQotICAgICAgICAgICAgZUlOU1RBTkNFLmdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fU0ZhaWx1cmVNb2RlT3duZXIoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlIE93bmVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX09XTkVSID0KKwkJCWVJTlNUQU5DRS5nZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZU93bmVyKCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQW5kR2F0ZUxBbmFseXNpcyA8ZW0+U0FuZAotICAgICAgICAgKiBHYXRlIExBbmFseXNpczwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQW5kR2F0ZUxBbmFseXNpcwotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNBbmRHYXRlTEFuYWx5c2lzKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNBTkRfR0FURV9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U0FuZEdhdGVMQW5hbHlzaXMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQW5kR2F0ZUxBbmFseXNpcyA8ZW0+U0FuZAorCQkgKiBHYXRlIExBbmFseXNpczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TQW5kR2F0ZUxBbmFseXNpcworCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNBbmRHYXRlTEFuYWx5c2lzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNBTkRfR0FURV9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U0FuZEdhdGVMQW5hbHlzaXMoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU0FORF9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTQW5kR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFNBbmRHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNPckdhdGVMQW5hbHlzaXMgPGVtPlNPciBHYXRlCi0gICAgICAgICAqIExBbmFseXNpczwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TT3JHYXRlTEFuYWx5c2lzCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U09yR2F0ZUxBbmFseXNpcygpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTT1JfR0FURV9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U09yR2F0ZUxBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNPckdhdGVMQW5hbHlzaXMgPGVtPlNPciBHYXRlCisJCSAqIExBbmFseXNpczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TT3JHYXRlTEFuYWx5c2lzCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U09yR2F0ZUxBbmFseXNpcygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTT1JfR0FURV9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U09yR2F0ZUxBbmFseXNpcygpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTT1JfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U09yR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTT1JfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U09yR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TVW50aW1lbHlGYWlsdXJlTW9kZQotICAgICAgICAgKiA8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TVW50aW1lbHlGYWlsdXJlTW9kZQotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNVbnRpbWVseUZhaWx1cmVNb2RlKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNVTlRJTUVMWV9GQUlMVVJFX01PREUgPSBlSU5TVEFOQ0UuZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TVW50aW1lbHlGYWlsdXJlTW9kZQorCQkgKiA8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TVW50aW1lbHlGYWlsdXJlTW9kZQorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLkVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNVbnRpbWVseUZhaWx1cmVNb2RlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNVTlRJTUVMWV9GQUlMVVJFX01PREUgPSBlSU5TVEFOQ0UuZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTVW50aW1lbHlGYWlsdXJlTW9kZV9CYXNlX1Byb3BlcnR5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTVU5USU1FTFlfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFNVbnRpbWVseUZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNBYnNlbnRGYWlsdXJlTW9kZSA8ZW0+U0Fic2VudAotICAgICAgICAgKiBGYWlsdXJlIE1vZGU8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Fic2VudEZhaWx1cmVNb2RlCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Fic2VudEZhaWx1cmVNb2RlKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNBQlNFTlRfRkFJTFVSRV9NT0RFID0gZUlOU1RBTkNFLmdldFNBYnNlbnRGYWlsdXJlTW9kZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNBYnNlbnRGYWlsdXJlTW9kZSA8ZW0+U0Fic2VudAorCQkgKiBGYWlsdXJlIE1vZGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Fic2VudEZhaWx1cmVNb2RlCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Fic2VudEZhaWx1cmVNb2RlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNBQlNFTlRfRkFJTFVSRV9NT0RFID0gZUlOU1RBTkNFLmdldFNBYnNlbnRGYWlsdXJlTW9kZSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTQWJzZW50RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U0Fic2VudEZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNFcnJvbmVvdXNGYWlsdXJlTW9kZQotICAgICAgICAgKiA8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Vycm9uZW91c0ZhaWx1cmVNb2RlCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFID0gZUlOU1RBTkNFLmdldFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNFcnJvbmVvdXNGYWlsdXJlTW9kZQorCQkgKiA8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0Vycm9uZW91c0ZhaWx1cmVNb2RlCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFID0gZUlOU1RBTkNFLmdldFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRVJlZmVyZW5jZSBTRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTRXJyb25lb3VzRmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEV2ZW50IDxlbT5TTG9jYWwKLSAgICAgICAgICogRXZlbnQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuU0xvY2FsRXZlbnQKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTTG9jYWxFdmVudCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBTTE9DQUxfRVZFTlQgPSBlSU5TVEFOQ0UuZ2V0U0xvY2FsRXZlbnQoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5TTG9jYWxFdmVudCA8ZW0+U0xvY2FsCisJCSAqIEV2ZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5pbXBsLlNMb2NhbEV2ZW50CisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsRXZlbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0xPQ0FMX0VWRU5UID0gZUlOU1RBTkNFLmdldFNMb2NhbEV2ZW50KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNMT0NBTF9FVkVOVF9fQkFTRV9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTTG9jYWxFdmVudF9CYXNlX1Byb3BlcnR5KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTTE9DQUxfRVZFTlRfX0JBU0VfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0U0xvY2FsRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLlNEaXJlY3Rpb25MQW5hbHlzaXMgPGVtPlNEaXJlY3Rpb24KLSAgICAgICAgICogTEFuYWx5c2lzPC9lbT59JyBlbnVtLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLlNEaXJlY3Rpb25MQW5hbHlzaXMKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuaW1wbC5FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUVudW0gU0RJUkVDVElPTl9MQU5BTFlTSVMgPSBlSU5TVEFOQ0UuZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5TRGlyZWN0aW9uTEFuYWx5c2lzIDxlbT5TRGlyZWN0aW9uCisJCSAqIExBbmFseXNpczwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5TRGlyZWN0aW9uTEFuYWx5c2lzCisJCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLmltcGwuRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFNESVJFQ1RJT05fTEFOQUxZU0lTID0gZUlOU1RBTkNFLmdldFNEaXJlY3Rpb25MQW5hbHlzaXMoKTsKIAotICAgIH0KKwl9CiAKIH0gLy8gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTQWJzZW50RmFpbHVyZU1vZGUuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCmluZGV4IDAxYjBjZDIuLjc5YTFmZDkgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCkBAIC0yOSwzNSArMjksMzUgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0Fic2VudEZhaWx1cmVNb2RlCi0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgeworCWV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Fic2VudEZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhc2VfUHJvcGVydHkoUHJvcGVydHkpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNBYnNlbnRGYWlsdXJlTW9kZV9CYXNlX1Byb3BlcnR5KCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNBYnNlbnRGYWlsdXJlTW9kZSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlCi0gICAgICogUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UKKwkgKiBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSB2YWx1ZSk7CiAKIH0gLy8gSVNBYnNlbnRGYWlsdXJlTW9kZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0FuZEdhdGVMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNBbmRHYXRlTEFuYWx5c2lzLmphdmEKaW5kZXggODgwZjc2OC4uYjI3ZjMxMSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0FuZEdhdGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTQW5kR2F0ZUxBbmFseXNpcy5qYXZhCkBAIC0yOSwzNSArMjksMzUgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0FuZEdhdGVMQW5hbHlzaXMKLSAgICBleHRlbmRzIElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQW5kR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQW5kR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNBbmRHYXRlTEFuYWx5c2lzI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UKLSAgICAgKiBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQW5kR2F0ZUxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlCisJICogUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgdmFsdWUpOwogCiB9IC8vIElTQW5kR2F0ZUxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0JhcnJpZXJMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNCYXJyaWVyTEFuYWx5c2lzLmphdmEKaW5kZXggZDFiODZjYy4uNzM2NjI4NSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0JhcnJpZXJMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTQmFycmllckxBbmFseXNpcy5qYXZhCkBAIC0zMyw5OCArMzMsOTggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0JhcnJpZXJMQW5hbHlzaXMKLSAgICBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIHsKKwlleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCYXJyaWVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmFycmllcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmFycmllcjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0JhcnJpZXIoSVNCYXJyaWVyKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmFycmllckxBbmFseXNpc19TQmFycmllcigpCi0gICAgICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0JhcnJpZXIgZ2V0U0JhcnJpZXIoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TQmFycmllcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0JhcnJpZXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0JhcnJpZXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNCYXJyaWVyKElTQmFycmllcikKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0JhcnJpZXIoKQorCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNCYXJyaWVyIGdldFNCYXJyaWVyKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCYXJyaWVyCi0gICAgICogPGVtPlNCYXJyaWVyPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TQmFycmllcjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0JhcnJpZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNCYXJyaWVyKElTQmFycmllciB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRTQmFycmllcgorCSAqIDxlbT5TQmFycmllcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0JhcnJpZXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNCYXJyaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTQmFycmllcihJU0JhcnJpZXIgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmFycmllckxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmFycmllckxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UKLSAgICAgKiBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlCisJICogUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCA8ZW0+U0JhcnJpZXJzIExBbmFseXNpcwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNCYXJyaWVyc0xBbmFseXNpc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAqIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QgPGVtPlNCYXJyaWVycyBMQW5hbHlzaXMKKwkgKiBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0CisJICogQG1vZGVsIG9wcG9zaXRlPSJzQmFycmllcnNMQW5hbHlzaXNMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKKwkgKiBMQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgdmFsdWUpOwogCiB9IC8vIElTQmFycmllckxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0Jsb2NrTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTQmxvY2tMQW5hbHlzaXMuamF2YQppbmRleCBjMmZkMDE1Li5hZGYyODJhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTQmxvY2tMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTQmxvY2tMQW5hbHlzaXMuamF2YQpAQCAtNDUsMjIxICs0NSwyMjEgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0Jsb2NrTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgeworCWV4dGVuZHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jazwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jazwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0Jsb2NrKElTQmxvY2spCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpc19TQmxvY2soKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTQmxvY2sgZ2V0U0Jsb2NrKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTQmxvY2soSVNCbG9jaykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCbG9jaygpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNCbG9jayBnZXRTQmxvY2soKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNCbG9jayA8ZW0+U0Jsb2NrPC9lbT59JwotICAgICAqIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jazwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0Jsb2NrKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTQmxvY2soSVNCbG9jayB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0Jsb2NrIDxlbT5TQmxvY2s8L2VtPn0nCisJICogcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTQmxvY2soKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNCbG9jayhJU0Jsb2NrIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzfS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCi0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja0xBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+IGdldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCisJICogTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja0xBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+IGdldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U1BvcnRzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpc30uCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TUG9ydHMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TUG9ydHMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpc19TUG9ydHNMQW5hbHlzaXNMaXN0KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzCi0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzQmxvY2tMQW5hbHlzaXMiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU1BvcnRMQW5hbHlzaXM+IGdldFNQb3J0c0xBbmFseXNpc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TUG9ydHMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNQb3J0cyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNQb3J0cyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja0xBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTUG9ydExBbmFseXNpcz4gZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmxvY2tMQW5hbHlzaXNfQmFzZV9DbGFzcygpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX0Jhc2VfQ2xhc3MoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCW9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGdldEJhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldEJhc2VfQ2xhc3MgPGVtPkJhc2UKLSAgICAgKiBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZQorCSAqIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNMb2dpY2FsIEdhdGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc30uCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCi0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNMb2dpY2FsIEdhdGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0xvZ2ljYWwgR2F0ZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcwotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0Jsb2NrTEFuYWx5c2lzIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPiBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNMb2dpY2FsIEdhdGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc30uCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrCisJICogTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNMb2dpY2FsIEdhdGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0xvZ2ljYWwgR2F0ZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcworCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0Jsb2NrTEFuYWx5c2lzIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8SUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPiBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzCi0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzQmxvY2tMQW5hbHlzaXMiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKKwkgKiBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzCisJICogQG1vZGVsIG9wcG9zaXRlPSJzQmxvY2tMQW5hbHlzaXMiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TQmFycmllcnMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzfS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCYXJyaWVycyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCYXJyaWVycyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCYXJyaWVyc0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja0xBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVMaXN0PElTQmFycmllckxBbmFseXNpcz4gZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCYXJyaWVycyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXN9LgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcyNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0JhcnJpZXJzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0JhcnJpZXJzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmxvY2tMQW5hbHlzaXNfU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCYXJyaWVyTEFuYWx5c2lzI2dldFNCbG9ja0xBbmFseXNpcworCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0Jsb2NrTEFuYWx5c2lzIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8SVNCYXJyaWVyTEFuYWx5c2lzPiBnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QgPGVtPlNCbG9ja3MgTEFuYWx5c2lzCi0gICAgICogTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTTG9jYWxBbmFseXNpcyhJU0xvY2FsQW5hbHlzaXMpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpc19TTG9jYWxBbmFseXNpcygpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNCbG9ja3NMQW5hbHlzaXNMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzQmxvY2tzTEFuYWx5c2lzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICogb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTTG9jYWxBbmFseXNpcyBnZXRTTG9jYWxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNMb2NhbCBBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCA8ZW0+U0Jsb2NrcyBMQW5hbHlzaXMKKwkgKiBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2NhbEFuYWx5c2lzKCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja3NMQW5hbHlzaXNMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNMb2NhbEFuYWx5c2lzIGdldFNMb2NhbEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTTG9jYWxBbmFseXNpcyA8ZW0+U0xvY2FsCi0gICAgICogQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcyB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbAorCSAqIEFuYWx5c2lzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNMb2NhbEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTTG9jYWxBbmFseXNpcyhJU0xvY2FsQW5hbHlzaXMgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmt9LgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldFNCbG9ja0xBbmFseXNpcyA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRTQmxvY2tMQW5hbHlzaXMKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNCbG9ja0xBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGlua30uCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNCbG9ja0xBbmFseXNpc19TUHJvcGFnYXRpb25MaW5rc0xpc3QoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldFNCbG9ja0xBbmFseXNpcworCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0Jsb2NrTEFuYWx5c2lzIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpOwogCiB9IC8vIElTQmxvY2tMQW5hbHlzaXMKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YQppbmRleCA3ZjZlYWIwLi4xMGU4NjRlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5qYXZhCkBAIC0zNCw5NCArMzQsOTQgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgIGV4dGVuZHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKKwlleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldFNGYWlsdXJlTW9kZUxBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fU0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgZ2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZUxBbmFseXNpcygpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIGdldFNGYWlsdXJlTW9kZUxBbmFseXNpcygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24jZ2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIDxlbT5TRmFpbHVyZSBNb2RlCi0gICAgICogTEFuYWx5c2lzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPGVtPlNGYWlsdXJlIE1vZGUKKwkgKiBMQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNGYWlsdXJlTW9kZUxBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDb25uZWN0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ29ubmVjdG9yPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ29ubmVjdG9yPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX0Nvbm5lY3RvcihDb25uZWN0b3IpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fQmFzZV9Db25uZWN0b3IoKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENvbm5lY3RvciBnZXRCYXNlX0Nvbm5lY3RvcigpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ29ubmVjdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENvbm5lY3RvcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENvbm5lY3RvcjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9Db25uZWN0b3IoQ29ubmVjdG9yKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX0Jhc2VfQ29ubmVjdG9yKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb25uZWN0b3IgZ2V0QmFzZV9Db25uZWN0b3IoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRCYXNlX0Nvbm5lY3RvcgotICAgICAqIDxlbT5CYXNlIENvbm5lY3RvcjwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDb25uZWN0b3I8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfQ29ubmVjdG9yKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX0Nvbm5lY3RvcihDb25uZWN0b3IgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiNnZXRCYXNlX0Nvbm5lY3RvcgorCSAqIDxlbT5CYXNlIENvbm5lY3RvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDb25uZWN0b3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhc2VfQ29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX0Nvbm5lY3RvcihDb25uZWN0b3IgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZSBPd25lcjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlIE93bmVyPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTRmFpbHVyZU1vZGVPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcikKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVPd25lcigpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgZ2V0U0ZhaWx1cmVNb2RlT3duZXIoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlIE93bmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlIE93bmVyPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNGYWlsdXJlTW9kZU93bmVyKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZU93bmVyKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBnZXRTRmFpbHVyZU1vZGVPd25lcigpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uI2dldFNGYWlsdXJlTW9kZU93bmVyCi0gICAgICogPGVtPlNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZU93bmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTRmFpbHVyZU1vZGVPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uI2dldFNGYWlsdXJlTW9kZU93bmVyCisJICogPGVtPlNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZU93bmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTRmFpbHVyZU1vZGVPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB2YWx1ZSk7CiAKIH0gLy8gSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0Vycm9uZW91c0ZhaWx1cmVNb2RlLmphdmEKaW5kZXggZTA5NmMwZS4uNjQ0NDRiNiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0Vycm9uZW91c0ZhaWx1cmVNb2RlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0Vycm9uZW91c0ZhaWx1cmVNb2RlLmphdmEKQEAgLTI5LDM1ICsyOSwzNSBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRXJyb25lb3VzRmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Vycm9uZW91c0ZhaWx1cmVNb2RlI2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UKLSAgICAgKiBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZQorCSAqIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKIAogfSAvLyBJU0Vycm9uZW91c0ZhaWx1cmVNb2RlCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTRmVhcmVkRXZlbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNGZWFyZWRFdmVudC5qYXZhCmluZGV4IGJmODY3YjMuLjQ1ZDE3ZTggMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNGZWFyZWRFdmVudC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNGZWFyZWRFdmVudC5qYXZhCkBAIC0zNCwxMTcgKzM0LDExNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTRmVhcmVkRXZlbnQKLSAgICBleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU2VsZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRJc1NlbGVjdGVkKGJvb2xlYW4pCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudF9Jc1NlbGVjdGVkKCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAqIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBib29sZWFuIGlzU2VsZWN0ZWQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTZWxlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElzU2VsZWN0ZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50X0lzU2VsZWN0ZWQoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiCisJICogZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZWxlY3RlZCgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjaXNTZWxlY3RlZCA8ZW0+SXMgU2VsZWN0ZWQ8L2VtPn0nCi0gICAgICogYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzU2VsZWN0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldElzU2VsZWN0ZWQoYm9vbGVhbiB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjaXNTZWxlY3RlZCA8ZW0+SXMgU2VsZWN0ZWQ8L2VtPn0nCisJICogYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2VsZWN0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElzU2VsZWN0ZWQoYm9vbGVhbiB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudF9CYXNlX0NsYXNzKCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRfQmFzZV9DbGFzcygpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZSBDbGFzczwvZW0+fScKLSAgICAgKiByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRCYXNlX0NsYXNzIDxlbT5CYXNlIENsYXNzPC9lbT59JworCSAqIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhc2VfQ2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudF9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpCi0gICAgICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudF9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpCisJICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNGZWFyZWRFdmVudHNMaXN0IDxlbT5TRmVhcmVkIEV2ZW50cwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTRmVhcmVkRXZlbnRzTGlicmFyeShJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudF9TRmVhcmVkRXZlbnRzTGlicmFyeSgpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNGZWFyZWRFdmVudHNMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzRmVhcmVkRXZlbnRzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICogb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNGZWFyZWRFdmVudHNMaWJyYXJ5KElTRmVhcmVkRXZlbnRzTGlicmFyeSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNGZWFyZWRFdmVudHNMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSA8ZW0+U0ZlYXJlZAotICAgICAqIEV2ZW50cyBMaWJyYXJ5PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSA8ZW0+U0ZlYXJlZAorCSAqIEV2ZW50cyBMaWJyYXJ5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZhbHVlKTsKIAogfSAvLyBJU0ZlYXJlZEV2ZW50CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTRmVhcmVkRXZlbnRzRmFtaWx5LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTRmVhcmVkRXZlbnRzRmFtaWx5LmphdmEKaW5kZXggOTJhNjBjMy4uYjZjNGJkZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0ZlYXJlZEV2ZW50c0ZhbWlseS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNGZWFyZWRFdmVudHNGYW1pbHkuamF2YQpAQCAtMzksMTY4ICszOSwxNjggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU0ZlYXJlZEV2ZW50c0ZhbWlseQotICAgIGV4dGVuZHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKKwlleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHlfQmFzZV9DbGFzcygpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9CYXNlX0NsYXNzKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZQotICAgICAqIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZQorCSAqIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudH0uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmVhcmVkRXZlbnRzTGlzdCgpCi0gICAgICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmVhcmVkRXZlbnRzTGlzdCgpCisJICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU2VsZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRJc1NlbGVjdGVkKGJvb2xlYW4pCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHlfSXNTZWxlY3RlZCgpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgKiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1NlbGVjdGVkKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU2VsZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJc1NlbGVjdGVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHlfSXNTZWxlY3RlZCgpCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIKKwkgKiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NlbGVjdGVkKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjaXNTZWxlY3RlZCA8ZW0+SXMKLSAgICAgKiBTZWxlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU2VsZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzU2VsZWN0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldElzU2VsZWN0ZWQoYm9vbGVhbiB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2lzU2VsZWN0ZWQgPGVtPklzCisJICogU2VsZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFNlbGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NlbGVjdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJc1NlbGVjdGVkKGJvb2xlYW4gdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHl9LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIEZhbWlsaWVzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgRmFtaWxpZXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TdWJGYW1pbGllc0xpc3QoKQotICAgICAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldFN1YkZhbWlsaWVzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBGYW1pbGllcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBGYW1pbGllcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIEZhbWlsaWVzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHlfU3ViRmFtaWxpZXNMaXN0KCkKKwkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBnZXRTdWJGYW1pbGllc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbCBTRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnR9LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIFNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgU0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9BbGxTRmVhcmVkRXZlbnRzTGlzdCgpCi0gICAgICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbCBTRmVhcmVkIEV2ZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIFNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgU0ZlYXJlZCBFdmVudHMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9BbGxTRmVhcmVkRXZlbnRzTGlzdCgpCisJICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzfS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKQotICAgICAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkKKwkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCA8ZW0+U0ZlYXJlZCBFdmVudHMKLSAgICAgKiBGYW1pbGllcyBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdAotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICogb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCA8ZW0+U0ZlYXJlZCBFdmVudHMKKwkgKiBGYW1pbGllcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCisJICogb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTRmVhcmVkRXZlbnRzTGlicmFyeSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5Ci0gICAgICogPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTRmVhcmVkRXZlbnRzTGlicmFyeShJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseSNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeQorCSAqIDxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZhbHVlKTsKIAogfSAvLyBJU0ZlYXJlZEV2ZW50c0ZhbWlseQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0ZlYXJlZEV2ZW50c0xpYnJhcnkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKaW5kZXggYzFjNDc2Yy4uODA4OTVkMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0ZlYXJlZEV2ZW50c0xpYnJhcnkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTRmVhcmVkRXZlbnRzTGlicmFyeS5qYXZhCkBAIC0zNCwxMTEgKzM0LDExMSBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTRmVhcmVkRXZlbnRzTGlicmFyeQotICAgIGV4dGVuZHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKKwlleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9CYXNlX1BhY2thZ2UoKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgZ2V0QmFzZV9QYWNrYWdlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGdldEJhc2VfUGFja2FnZSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeSNnZXRCYXNlX1BhY2thZ2UgPGVtPkJhc2UKLSAgICAgKiBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUGFja2FnZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0QmFzZV9QYWNrYWdlIDxlbT5CYXNlCisJICogUGFja2FnZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHl9LgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5IDxlbT5TRmVhcmVkIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5I2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzRmVhcmVkRXZlbnRzTGlicmFyeSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseX0uCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPGVtPlNGZWFyZWQgRXZlbnRzCisJICogTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNGZWFyZWRFdmVudHNMaWJyYXJ5IiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudH0uCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSA8ZW0+U0ZlYXJlZCBFdmVudHMKLSAgICAgKiBMaWJyYXJ5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzTGlzdCgpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZlYXJlZEV2ZW50c0xpYnJhcnkiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudH0uCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSA8ZW0+U0ZlYXJlZCBFdmVudHMKKwkgKiBMaWJyYXJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudCNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeQorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZlYXJlZEV2ZW50c0xpYnJhcnkiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0xvY2FsIEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5IDxlbT5TRmVhcmVkIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TTG9jYWxBbmFseXNpcygpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzRmVhcmVkRXZlbnRzTGlicmFyeSIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICogb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTTG9jYWxBbmFseXNpcyBnZXRTTG9jYWxBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNMb2NhbCBBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSA8ZW0+U0ZlYXJlZCBFdmVudHMKKwkgKiBMaWJyYXJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeQorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic0ZlYXJlZEV2ZW50c0xpYnJhcnkiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgorCSAqIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0xvY2FsQW5hbHlzaXMgZ2V0U0xvY2FsQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMKLSAgICAgKiA8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNMb2NhbEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTTG9jYWxBbmFseXNpcyhJU0xvY2FsQW5hbHlzaXMgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMKKwkgKiA8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNMb2NhbEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTTG9jYWxBbmFseXNpcyhJU0xvY2FsQW5hbHlzaXMgdmFsdWUpOwogCiB9IC8vIElTRmVhcmVkRXZlbnRzTGlicmFyeQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0xvY2FsQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNMb2NhbEFuYWx5c2lzLmphdmEKaW5kZXggNmRmN2QwNy4uNDc0ZmYwNiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0xvY2FsQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTTG9jYWxBbmFseXNpcy5qYXZhCkBAIC0zNywxMTkgKzM3LDExOSBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTTG9jYWxBbmFseXNpcwotICAgIGV4dGVuZHMgSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzIHsKKwlleHRlbmRzIElBYnN0cmFjdFNTYWZldHlBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTTG9jYWxBbmFseXNpc19CYXNlX1BhY2thZ2UoKQotICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgZ2V0QmFzZV9QYWNrYWdlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsQW5hbHlzaXNfQmFzZV9QYWNrYWdlKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGdldEJhc2VfUGFja2FnZSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRCYXNlX1BhY2thZ2UgPGVtPkJhc2UKLSAgICAgKiBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUGFja2FnZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0QmFzZV9QYWNrYWdlIDxlbT5CYXNlCisJICogUGFja2FnZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KElTU3lzdGVtRXZlbnRzTGlicmFyeSkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsQW5hbHlzaXNfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSNnZXRTTG9jYWxBbmFseXNpcwotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic0xvY2FsQW5hbHlzaXMiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTU3lzdGVtRXZlbnRzTGlicmFyeShJU1N5c3RlbUV2ZW50c0xpYnJhcnkpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNMb2NhbEFuYWx5c2lzX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNMb2NhbEFuYWx5c2lzIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgICogPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTU3lzdGVtRXZlbnRzTGlicmFyeShJU1N5c3RlbUV2ZW50c0xpYnJhcnkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkKKwkgKiA8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KElTU3lzdGVtRXZlbnRzTGlicmFyeSB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTRmVhcmVkRXZlbnRzTGlicmFyeShJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNMb2NhbEFuYWx5c2lzX1NGZWFyZWRFdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkjZ2V0U0xvY2FsQW5hbHlzaXMKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNMb2NhbEFuYWx5c2lzIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeSNnZXRTTG9jYWxBbmFseXNpcyA8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTTG9jYWxBbmFseXNpc19TRmVhcmVkRXZlbnRzTGlicmFyeSgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzCisJICogQG1vZGVsIG9wcG9zaXRlPSJzTG9jYWxBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTRmVhcmVkRXZlbnRzTGlicmFyeSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAqIDxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5CisJICogPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTRmVhcmVkRXZlbnRzTGlicmFyeShJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzfS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9ja3MgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNMb2NhbEFuYWx5c2lzX1NCbG9ja3NMQW5hbHlzaXNMaXN0KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2NhbEFuYWx5c2lzCi0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzTG9jYWxBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVMaXN0PElTQmxvY2tMQW5hbHlzaXM+IGdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzfS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrcyBMQW5hbHlzaXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9ja3MgTEFuYWx5c2lzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNMb2NhbEFuYWx5c2lzX1NCbG9ja3NMQW5hbHlzaXNMaXN0KCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNMb2NhbEFuYWx5c2lzCisJICogQG1vZGVsIG9wcG9zaXRlPSJzTG9jYWxBbmFseXNpcyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTQmxvY2tMQW5hbHlzaXM+IGdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCk7CiAKIH0gLy8gSVNMb2NhbEFuYWx5c2lzCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTTG9jYWxFdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU0xvY2FsRXZlbnQuamF2YQppbmRleCAxYzA5MzliLi4zYTM0N2I2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTTG9jYWxFdmVudC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNMb2NhbEV2ZW50LmphdmEKQEAgLTI5LDM1ICsyOSwzNSBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTTG9jYWxFdmVudAotICAgIGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U0xvY2FsRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxFdmVudCNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlCi0gICAgICogUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsRXZlbnQjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZQorCSAqIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKIAogfSAvLyBJU0xvY2FsRXZlbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNPckdhdGVMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNPckdhdGVMQW5hbHlzaXMuamF2YQppbmRleCAxNjAzNjJiLi5kNTRhYzM5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTT3JHYXRlTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU09yR2F0ZUxBbmFseXNpcy5qYXZhCkBAIC0yOSwzNSArMjksMzUgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU09yR2F0ZUxBbmFseXNpcwotICAgIGV4dGVuZHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIHsKKwlleHRlbmRzIElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfUHJvcGVydHkoUHJvcGVydHkpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNPckdhdGVMQW5hbHlzaXNfQmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U09yR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNPckdhdGVMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZQotICAgICAqIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNPckdhdGVMQW5hbHlzaXMjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZQorCSAqIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKIAogfSAvLyBJU09yR2F0ZUxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1BvcnRMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNQb3J0TEFuYWx5c2lzLmphdmEKaW5kZXggYzNmMjlhMi4uMGRjZDIyMiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1BvcnRMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTUG9ydExBbmFseXNpcy5qYXZhCkBAIC0zNSwxMzAgKzM1LDEzMCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTUG9ydExBbmFseXNpcwotICAgIGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgeworCWV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0Jsb2NrIExBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCA8ZW0+U1BvcnRzIExBbmFseXNpcwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1BvcnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNQb3J0c0xBbmFseXNpc0xpc3QKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InNQb3J0c0xBbmFseXNpc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAqIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNQb3J0c0xBbmFseXNpc0xpc3QgPGVtPlNQb3J0cyBMQW5hbHlzaXMKKwkgKiBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQb3J0TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTUG9ydHNMQW5hbHlzaXNMaXN0CisJICogQG1vZGVsIG9wcG9zaXRlPSJzUG9ydHNMQW5hbHlzaXNMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKKwkgKiBMQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U1BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNQb3J0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNQb3J0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTUG9ydChJU1BvcnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQb3J0TEFuYWx5c2lzX1NQb3J0KCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1BvcnQgZ2V0U1BvcnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TUG9ydDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U1BvcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1BvcnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNQb3J0KElTUG9ydCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1BvcnRMQW5hbHlzaXNfU1BvcnQoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTUG9ydCBnZXRTUG9ydCgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRTUG9ydCA8ZW0+U1BvcnQ8L2VtPn0nCi0gICAgICogcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U1BvcnQ8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNQb3J0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTUG9ydChJU1BvcnQgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1BvcnRMQW5hbHlzaXMjZ2V0U1BvcnQgPGVtPlNQb3J0PC9lbT59JworCSAqIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNQb3J0PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTUG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U1BvcnQoSVNQb3J0IHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUG9ydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQb3J0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUG9ydDwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0QmFzZV9Qb3J0KFBvcnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQb3J0TEFuYWx5c2lzX0Jhc2VfUG9ydCgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgUG9ydCBnZXRCYXNlX1BvcnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFBvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUG9ydDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBvcnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhc2VfUG9ydChQb3J0KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUG9ydExBbmFseXNpc19CYXNlX1BvcnQoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVBvcnQgZ2V0QmFzZV9Qb3J0KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldEJhc2VfUG9ydCA8ZW0+QmFzZSBQb3J0PC9lbT59JwotICAgICAqIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUG9ydDwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qb3J0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX1BvcnQoUG9ydCB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyNnZXRCYXNlX1BvcnQgPGVtPkJhc2UgUG9ydDwvZW0+fScKKwkgKiByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFBvcnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhc2VfUG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QmFzZV9Qb3J0KFBvcnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpc30uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRGlyZWN0aW9uIExBbmFseXNpczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRGlyZWN0aW9uIExBbmFseXNpczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpcwotICAgICAqIEBzZWUgI3NldFNEaXJlY3Rpb25MQW5hbHlzaXMoU0RpcmVjdGlvbkxBbmFseXNpcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU0RpcmVjdGlvbkxBbmFseXNpcyBnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpc30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRGlyZWN0aW9uIExBbmFseXNpczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRGlyZWN0aW9uIExBbmFseXNpczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuU0RpcmVjdGlvbkxBbmFseXNpcworCSAqIEBzZWUgI3NldFNEaXJlY3Rpb25MQW5hbHlzaXMoU0RpcmVjdGlvbkxBbmFseXNpcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0RpcmVjdGlvbkxBbmFseXNpcyBnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMKLSAgICAgKiA8ZW0+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5TRGlyZWN0aW9uTEFuYWx5c2lzCi0gICAgICogQHNlZSAjZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0RpcmVjdGlvbkxBbmFseXNpcyhTRGlyZWN0aW9uTEFuYWx5c2lzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMKKwkgKiA8ZW0+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5TRGlyZWN0aW9uTEFuYWx5c2lzCisJICogQHNlZSAjZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0RpcmVjdGlvbkxBbmFseXNpcyhTRGlyZWN0aW9uTEFuYWx5c2lzIHZhbHVlKTsKIAogfSAvLyBJU1BvcnRMQW5hbHlzaXMKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNQcm9wYWdhdGlvbkxpbmsuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNQcm9wYWdhdGlvbkxpbmsuamF2YQppbmRleCA3MDM1NGM1Li5iNzc2OWRmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTUHJvcGFnYXRpb25MaW5rLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1Byb3BhZ2F0aW9uTGluay5qYXZhCkBAIC0zMiwxMzcgKzMyLDEzNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTUHJvcGFnYXRpb25MaW5rCi0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgeworCWV4dGVuZHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQgVGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCNnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA8ZW0+SW4KLSAgICAgKiBTUHJvcGFnYXRpb24gTGlua3MgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IFRhcmdldDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFRhcmdldDwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0RWxlbWVudFRhcmdldChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQjZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9ImluU1Byb3BhZ2F0aW9uTGlua3NMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgKiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBnZXRFbGVtZW50VGFyZ2V0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBUYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50I2dldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0IDxlbT5JbgorCSAqIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgVGFyZ2V0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgVGFyZ2V0PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRFbGVtZW50VGFyZ2V0KElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFRhcmdldCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCNnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0iaW5TUHJvcGFnYXRpb25MaW5rc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgorCSAqIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IGdldEVsZW1lbnRUYXJnZXQoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRFbGVtZW50VGFyZ2V0IDxlbT5FbGVtZW50Ci0gICAgICogVGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFRhcmdldDwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0RWxlbWVudFRhcmdldCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RWxlbWVudFRhcmdldChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFRhcmdldCA8ZW0+RWxlbWVudAorCSAqIFRhcmdldDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBUYXJnZXQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEVsZW1lbnRUYXJnZXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVsZW1lbnRUYXJnZXQoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TQmxvY2sgTEFuYWx5c2lzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPGVtPlNQcm9wYWdhdGlvbiBMaW5rcwotICAgICAqIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1Byb3BhZ2F0aW9uTGlua19TQmxvY2tMQW5hbHlzaXMoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMjZ2V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzUHJvcGFnYXRpb25MaW5rc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAqIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNCbG9jayBMQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzI2dldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA8ZW0+U1Byb3BhZ2F0aW9uIExpbmtzCisJICogTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUHJvcGFnYXRpb25MaW5rX1NCbG9ja0xBbmFseXNpcygpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcyNnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNQcm9wYWdhdGlvbkxpbmtzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCisJICogb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0U0Jsb2NrTEFuYWx5c2lzIDxlbT5TQmxvY2sKLSAgICAgKiBMQW5hbHlzaXM8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNCbG9ja0xBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRTQmxvY2tMQW5hbHlzaXMgPGVtPlNCbG9jaworCSAqIExBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U0Jsb2NrTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIERlcGVuZGVuY3k8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgRGVwZW5kZW5jeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIERlcGVuZGVuY3k8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfRGVwZW5kZW5jeShEZXBlbmRlbmN5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUHJvcGFnYXRpb25MaW5rX0Jhc2VfRGVwZW5kZW5jeSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRGVwZW5kZW5jeSBnZXRCYXNlX0RlcGVuZGVuY3koKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIERlcGVuZGVuY3k8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgRGVwZW5kZW5jeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIERlcGVuZGVuY3k8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhc2VfRGVwZW5kZW5jeShEZXBlbmRlbmN5KQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTUHJvcGFnYXRpb25MaW5rX0Jhc2VfRGVwZW5kZW5jeSgpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGVwZW5kZW5jeSBnZXRCYXNlX0RlcGVuZGVuY3koKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRCYXNlX0RlcGVuZGVuY3kgPGVtPkJhc2UKLSAgICAgKiBEZXBlbmRlbmN5PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIERlcGVuZGVuY3k8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfRGVwZW5kZW5jeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9EZXBlbmRlbmN5KERlcGVuZGVuY3kgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1Byb3BhZ2F0aW9uTGluayNnZXRCYXNlX0RlcGVuZGVuY3kgPGVtPkJhc2UKKwkgKiBEZXBlbmRlbmN5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIERlcGVuZGVuY3k8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhc2VfRGVwZW5kZW5jeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QmFzZV9EZXBlbmRlbmN5KERlcGVuZGVuY3kgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBTb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50I2dldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA8ZW0+T3V0Ci0gICAgICogU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEVsZW1lbnRTb3VyY2UoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50U291cmNlKCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50I2dldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdAotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ib3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgKiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBnZXRFbGVtZW50U291cmNlKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBTb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50I2dldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA8ZW0+T3V0CisJICogU1Byb3BhZ2F0aW9uIExpbmtzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEVsZW1lbnRTb3VyY2UoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50U291cmNlKCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50I2dldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0ib3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBnZXRFbGVtZW50U291cmNlKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsjZ2V0RWxlbWVudFNvdXJjZSA8ZW0+RWxlbWVudAotICAgICAqIFNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBTb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEVsZW1lbnRTb3VyY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEVsZW1lbnRTb3VyY2UoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rI2dldEVsZW1lbnRTb3VyY2UgPGVtPkVsZW1lbnQKKwkgKiBTb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgU291cmNlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFbGVtZW50U291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFbGVtZW50U291cmNlKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgdmFsdWUpOwogCiB9IC8vIElTUHJvcGFnYXRpb25MaW5rCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTU3lzdGVtRXZlbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNTeXN0ZW1FdmVudC5qYXZhCmluZGV4IDViOGM0OTMuLmRhZDIzNjUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNTeXN0ZW1FdmVudC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNTeXN0ZW1FdmVudC5qYXZhCkBAIC0zMCw2NiArMzAsNjYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU1N5c3RlbUV2ZW50Ci0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIHsKKwlleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50X0Jhc2VfUHJvcGVydHkoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50I2dldEJhc2VfUHJvcGVydHkgPGVtPkJhc2UKLSAgICAgKiBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZQorCSAqIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRJbnN0YW5jZXNMaXN0IDxlbT5JbnN0YW5jZXMgTGlzdDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldFR5cGUoSVNTeXN0ZW1FdmVudFR5cGUpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudF9UeXBlKCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRJbnN0YW5jZXNMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJpbnN0YW5jZXNMaXN0IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTU3lzdGVtRXZlbnRUeXBlIGdldFR5cGUoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0SW5zdGFuY2VzTGlzdCA8ZW0+SW5zdGFuY2VzIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRUeXBlKElTU3lzdGVtRXZlbnRUeXBlKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRfVHlwZSgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0SW5zdGFuY2VzTGlzdAorCSAqIEBtb2RlbCBvcHBvc2l0ZT0iaW5zdGFuY2VzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU1N5c3RlbUV2ZW50VHlwZSBnZXRUeXBlKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRUeXBlKElTU3lzdGVtRXZlbnRUeXBlIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUeXBlKElTU3lzdGVtRXZlbnRUeXBlIHZhbHVlKTsKIAogfSAvLyBJU1N5c3RlbUV2ZW50CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTU3lzdGVtRXZlbnRUeXBlLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTU3lzdGVtRXZlbnRUeXBlLmphdmEKaW5kZXggZTgyNjgwOC4uYWQ5NDY0MiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1N5c3RlbUV2ZW50VHlwZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNTeXN0ZW1FdmVudFR5cGUuamF2YQpAQCAtMzUsMTE4ICszNSwxMTggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU1N5c3RlbUV2ZW50VHlwZQotICAgIGV4dGVuZHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKKwlleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudFR5cGVfQmFzZV9DbGFzcygpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50VHlwZV9CYXNlX0NsYXNzKCkKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZQotICAgICAqIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZQorCSAqIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIEV2ZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBFdmVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBFdmVudDwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U0ZhaWx1cmVFdmVudChJU0ZhaWx1cmVFdmVudCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50VHlwZV9TRmFpbHVyZUV2ZW50KCkKLSAgICAgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElTRmFpbHVyZUV2ZW50IGdldFNGYWlsdXJlRXZlbnQoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TRmFpbHVyZSBFdmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNGYWlsdXJlRXZlbnQoSVNGYWlsdXJlRXZlbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudFR5cGVfU0ZhaWx1cmVFdmVudCgpCisJICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJU0ZhaWx1cmVFdmVudCBnZXRTRmFpbHVyZUV2ZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUjZ2V0U0ZhaWx1cmVFdmVudCA8ZW0+U0ZhaWx1cmUKLSAgICAgKiBFdmVudDwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0ZhaWx1cmUgRXZlbnQ8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNGYWlsdXJlRXZlbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNGYWlsdXJlRXZlbnQoSVNGYWlsdXJlRXZlbnQgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRTRmFpbHVyZUV2ZW50IDxlbT5TRmFpbHVyZQorCSAqIEV2ZW50PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBFdmVudDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVFdmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0ZhaWx1cmVFdmVudChJU0ZhaWx1cmVFdmVudCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnN0YW5jZXMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50fS4KLSAgICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRUeXBlCi0gICAgICogPGVtPlR5cGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFuY2VzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW5jZXMgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50VHlwZV9JbnN0YW5jZXNMaXN0KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50I2dldFR5cGUKLSAgICAgKiBAbW9kZWwgb3Bwb3NpdGU9InR5cGUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFTGlzdDxJU1N5c3RlbUV2ZW50PiBnZXRJbnN0YW5jZXNMaXN0KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFuY2VzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudH0uCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQjZ2V0VHlwZQorCSAqIDxlbT5UeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc3RhbmNlcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFuY2VzIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudFR5cGVfSW5zdGFuY2VzTGlzdCgpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCNnZXRUeXBlCisJICogQG1vZGVsIG9wcG9zaXRlPSJ0eXBlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8SVNTeXN0ZW1FdmVudD4gZ2V0SW5zdGFuY2VzTGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSNnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QgPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZXMKLSAgICAgKiBMaXN0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRUeXBlX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzU3lzdGVtRXZlbnRUeXBlc0xpc3QiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAqIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNTeXN0ZW1FdmVudFR5cGVzTGlzdCA8ZW0+U1N5c3RlbSBFdmVudCBUeXBlcworCSAqIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTU3lzdGVtRXZlbnRzTGlicmFyeShJU1N5c3RlbUV2ZW50c0xpYnJhcnkpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudFR5cGVfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeSNnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNTeXN0ZW1FdmVudFR5cGVzTGlzdCIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCisJICogb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUlTU3lzdGVtRXZlbnRzTGlicmFyeSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgICogPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTU3lzdGVtRXZlbnRzTGlicmFyeShJU1N5c3RlbUV2ZW50c0xpYnJhcnkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeQorCSAqIDxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHZhbHVlKTsKIAogfSAvLyBJU1N5c3RlbUV2ZW50VHlwZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmphdmEKaW5kZXggNjBlNTkwMi4uNWQ3NGViNCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTU3lzdGVtRXZlbnRzTGlicmFyeS5qYXZhCkBAIC0zMiw5MCArMzIsOTAgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJU1N5c3RlbUV2ZW50c0xpYnJhcnkKLSAgICBleHRlbmRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFBhY2thZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGdldEJhc2VfUGFja2FnZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X0Jhc2VfUGFja2FnZSgpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBnZXRCYXNlX1BhY2thZ2UoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkjZ2V0QmFzZV9QYWNrYWdlIDxlbT5CYXNlCi0gICAgICogUGFja2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQYWNrYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldEJhc2VfUGFja2FnZSA8ZW0+QmFzZQorCSAqIFBhY2thZ2U8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUGFja2FnZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmFzZV9QYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50IFR5cGVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGV9LgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5IDxlbT5TU3lzdGVtIEV2ZW50cwotICAgICAqIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TU3lzdGVtRXZlbnRUeXBlc0xpc3QoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgICogQG1vZGVsIG9wcG9zaXRlPSJzU3lzdGVtRXZlbnRzTGlicmFyeSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVMaXN0PElTU3lzdGVtRXZlbnRUeXBlPiBnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TU3lzdGVtIEV2ZW50IFR5cGVzIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGV9LgorCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5IDxlbT5TU3lzdGVtIEV2ZW50cworCSAqIExpYnJhcnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TU3lzdGVtRXZlbnRUeXBlc0xpc3QoKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5CisJICogQG1vZGVsIG9wcG9zaXRlPSJzU3lzdGVtRXZlbnRzTGlicmFyeSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTU3lzdGVtRXZlbnRUeXBlPiBnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNMb2NhbCBBbmFseXNpczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSA8ZW0+U1N5c3RlbSBFdmVudHMKLSAgICAgKiBMaWJyYXJ5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI3NldFNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxBbmFseXNpcyNnZXRTU3lzdGVtRXZlbnRzTGlicmFyeQotICAgICAqIEBtb2RlbCBvcHBvc2l0ZT0ic1N5c3RlbUV2ZW50c0xpYnJhcnkiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAqIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU0xvY2FsQW5hbHlzaXMgZ2V0U0xvY2FsQW5hbHlzaXMoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TTG9jYWwgQW5hbHlzaXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkgPGVtPlNTeXN0ZW0gRXZlbnRzCisJICogTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TTG9jYWwgQW5hbHlzaXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTTG9jYWxBbmFseXNpcyhJU0xvY2FsQW5hbHlzaXMpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NMb2NhbEFuYWx5c2lzKCkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMjZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkKKwkgKiBAbW9kZWwgb3Bwb3NpdGU9InNTeXN0ZW1FdmVudHNMaWJyYXJ5IiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNMb2NhbEFuYWx5c2lzIGdldFNMb2NhbEFuYWx5c2lzKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzCi0gICAgICogPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRTTG9jYWxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5I2dldFNMb2NhbEFuYWx5c2lzCisJICogPGVtPlNMb2NhbCBBbmFseXNpczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTTG9jYWxBbmFseXNpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIHZhbHVlKTsKIAogfSAvLyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNVbnRpbWVseUZhaWx1cmVNb2RlLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lTVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCmluZGV4IGQxM2UyMmMuLjExYTU4NTIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSVNVbnRpbWVseUZhaWx1cmVNb2RlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JU1VudGltZWx5RmFpbHVyZU1vZGUuamF2YQpAQCAtMjksMzUgKzI5LDM1IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNVbnRpbWVseUZhaWx1cmVNb2RlCi0gICAgZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgeworCWV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1VudGltZWx5RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UjZ2V0U1VudGltZWx5RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpOwogCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTVW50aW1lbHlGYWlsdXJlTW9kZSNnZXRCYXNlX1Byb3BlcnR5IDxlbT5CYXNlCi0gICAgICogUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlLgotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgdmFsdWUpOworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUjZ2V0QmFzZV9Qcm9wZXJ0eSA8ZW0+QmFzZQorCSAqIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IHZhbHVlKTsKIAogfSAvLyBJU1VudGltZWx5RmFpbHVyZU1vZGUKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvU0RpcmVjdGlvbkxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9TRGlyZWN0aW9uTEFuYWx5c2lzLmphdmEKaW5kZXggNDBkY2U4OC4uZmM1ZTAyNyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9TRGlyZWN0aW9uTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9TRGlyZWN0aW9uTEFuYWx5c2lzLmphdmEKQEAgLTI3LDI0MSArMjcsMjQxIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBlbnVtIFNEaXJlY3Rpb25MQW5hbHlzaXMgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNJTl9WQUxVRQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIElOKDAsICJJTiIsICJJTiIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNJTl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUlOKDAsICJJTiIsICJJTiIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNPVVRfVkFMVUUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBPVVQoMSwgIk9VVCIsICJPVVQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI09VVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9VVCgxLCAiT1VUIiwgIk9VVCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNVTkRFRklORURfVkFMVUUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBVTkRFRklORUQoMiwgIlVOREVGSU5FRCIsICJVTkRFRklORUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI1VOREVGSU5FRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVVOREVGSU5FRCgyLCAiVU5ERUZJTkVEIiwgIlVOREVGSU5FRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNJTgotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1ZBTFVFID0gMDsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjSU4KKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNPVVQKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfVkFMVUUgPSAxOworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI09VVAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9WQUxVRSA9IDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5VTkRFRklORUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNVTkRFRklORUQKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfVkFMVUUgPSAyOworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI1VOREVGSU5FRAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRF9WQUxVRSA9IDI7CiAKLSAgICAvKioKLSAgICAgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNEaXJlY3Rpb25MQW5hbHlzaXNbXSBWQUxVRVNfQVJSQVkgPSBuZXcgU0RpcmVjdGlvbkxBbmFseXNpc1tdIHtJTiwgT1VULCBVTkRFRklORUQsfTsKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNEaXJlY3Rpb25MQW5hbHlzaXNbXSBWQUxVRVNfQVJSQVkgPSBuZXcgU0RpcmVjdGlvbkxBbmFseXNpc1tdIHtJTiwgT1VULCBVTkRFRklORUQsfTsKIAotICAgIC8qKgotICAgICAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TRGlyZWN0aW9uIExBbmFseXNpczwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNEaXJlY3Rpb25MQW5hbHlzaXM+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTRGlyZWN0aW9uTEFuYWx5c2lzPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGxpdGVyYWwgdGhlIGxpdGVyYWwuCi0gICAgICogQHJldHVybiB0aGUgbWF0Y2hpbmcgZW51bWVyYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTRGlyZWN0aW9uTEFuYWx5c2lzIGdldChTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgU0RpcmVjdGlvbkxBbmFseXNpcyByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICAgICAgICBpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5TRGlyZWN0aW9uIExBbmFseXNpczwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBsaXRlcmFsIHRoZSBsaXRlcmFsLgorCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIGVudW1lcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU0RpcmVjdGlvbkxBbmFseXNpcyBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVNEaXJlY3Rpb25MQW5hbHlzaXMgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5TRGlyZWN0aW9uIExBbmFseXNpczwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIGVudW1lcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU0RpcmVjdGlvbkxBbmFseXNpcyBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIFNEaXJlY3Rpb25MQW5hbHlzaXMgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5TRGlyZWN0aW9uIExBbmFseXNpczwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lLgorCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIGVudW1lcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU0RpcmVjdGlvbkxBbmFseXNpcyBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVNEaXJlY3Rpb25MQW5hbHlzaXMgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBpbnRlZ2VyIHZhbHVlLgotICAgICAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIGVudW1lcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU0RpcmVjdGlvbkxBbmFseXNpcyBnZXQoaW50IHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5fVkFMVUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOOwotICAgICAgICAgICAgY2FzZSBPVVRfVkFMVUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9VVDsKLSAgICAgICAgICAgIGNhc2UgVU5ERUZJTkVEX1ZBTFVFOgotICAgICAgICAgICAgICAgIHJldHVybiBVTkRFRklORUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVnZXIgdmFsdWUuCisJICogQHJldHVybiB0aGUgbWF0Y2hpbmcgZW51bWVyYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBTRGlyZWN0aW9uTEFuYWx5c2lzIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBJTl9WQUxVRToKKwkJCQlyZXR1cm4gSU47CisJCQljYXNlIE9VVF9WQUxVRToKKwkJCQlyZXR1cm4gT1VUOworCQkJY2FzZSBVTkRFRklORURfVkFMVUU6CisJCQkJcmV0dXJuIFVOREVGSU5FRDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKIAotICAgIC8qKgotICAgICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFNEaXJlY3Rpb25MQW5hbHlzaXMoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotICAgIH0KKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBTRGlyZWN0aW9uTEFuYWx5c2lzKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CiAKIH0gLy8gU0RpcmVjdGlvbkxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5qYXZhCmluZGV4IGY0MzI4YjcuLmY3NzBjMDcgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9BYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzLmphdmEKQEAgLTQwLDIwNiArNDAsMjA2IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKLSAgICBleHRlbmRzIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudAotICAgIGltcGxlbWVudHMgSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyB7CisJZXh0ZW5kcyBBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKKwlpbXBsZW1lbnRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZhaWx1cmVFdmVudCgpIDxlbT5TRmFpbHVyZSBFdmVudDwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVFdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTRmFpbHVyZUV2ZW50IHNGYWlsdXJlRXZlbnQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZhaWx1cmVFdmVudCgpIDxlbT5TRmFpbHVyZSBFdmVudDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVFdmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIElTRmFpbHVyZUV2ZW50IHNGYWlsdXJlRXZlbnQ7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJUzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0ZhaWx1cmVFdmVudCBnZXRTRmFpbHVyZUV2ZW50KCkgewotICAgICAgICBpZiAoc0ZhaWx1cmVFdmVudCAhPSBudWxsICYmIHNGYWlsdXJlRXZlbnQuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZFNGYWlsdXJlRXZlbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBzRmFpbHVyZUV2ZW50OwotICAgICAgICAgICAgc0ZhaWx1cmVFdmVudCA9IChJU0ZhaWx1cmVFdmVudCkgZVJlc29sdmVQcm94eShvbGRTRmFpbHVyZUV2ZW50KTsKLSAgICAgICAgICAgIGlmIChzRmFpbHVyZUV2ZW50ICE9IG9sZFNGYWlsdXJlRXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTRmFpbHVyZUV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNGYWlsdXJlRXZlbnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0ZhaWx1cmVFdmVudDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTRmFpbHVyZUV2ZW50IGdldFNGYWlsdXJlRXZlbnQoKSB7CisJCWlmIChzRmFpbHVyZUV2ZW50ICE9IG51bGwgJiYgc0ZhaWx1cmVFdmVudC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU0ZhaWx1cmVFdmVudCA9IChJbnRlcm5hbEVPYmplY3QpIHNGYWlsdXJlRXZlbnQ7CisJCQlzRmFpbHVyZUV2ZW50ID0gKElTRmFpbHVyZUV2ZW50KSBlUmVzb2x2ZVByb3h5KG9sZFNGYWlsdXJlRXZlbnQpOworCQkJaWYgKHNGYWlsdXJlRXZlbnQgIT0gb2xkU0ZhaWx1cmVFdmVudCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5ULAorCQkJCQkJCW9sZFNGYWlsdXJlRXZlbnQsCisJCQkJCQkJc0ZhaWx1cmVFdmVudCkpOworCQkJfQorCQl9CisJCXJldHVybiBzRmFpbHVyZUV2ZW50OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0ZhaWx1cmVFdmVudCBiYXNpY0dldFNGYWlsdXJlRXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiBzRmFpbHVyZUV2ZW50OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGYWlsdXJlRXZlbnQgYmFzaWNHZXRTRmFpbHVyZUV2ZW50KCkgeworCQlyZXR1cm4gc0ZhaWx1cmVFdmVudDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTRmFpbHVyZUV2ZW50KElTRmFpbHVyZUV2ZW50IG5ld1NGYWlsdXJlRXZlbnQpIHsKLSAgICAgICAgSVNGYWlsdXJlRXZlbnQgb2xkU0ZhaWx1cmVFdmVudCA9IHNGYWlsdXJlRXZlbnQ7Ci0gICAgICAgIHNGYWlsdXJlRXZlbnQgPSBuZXdTRmFpbHVyZUV2ZW50OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlQsCi0gICAgICAgICAgICAgICAgICAgIG9sZFNGYWlsdXJlRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIHNGYWlsdXJlRXZlbnQpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0ZhaWx1cmVFdmVudChJU0ZhaWx1cmVFdmVudCBuZXdTRmFpbHVyZUV2ZW50KSB7CisJCUlTRmFpbHVyZUV2ZW50IG9sZFNGYWlsdXJlRXZlbnQgPSBzRmFpbHVyZUV2ZW50OworCQlzRmFpbHVyZUV2ZW50ID0gbmV3U0ZhaWx1cmVFdmVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5ULAorCQkJCQlvbGRTRmFpbHVyZUV2ZW50LAorCQkJCQlzRmFpbHVyZUV2ZW50KSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzIHNCbG9ja0xBbmFseXNpcyA9IGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgIHJldHVybiBzQmxvY2tMQW5hbHlzaXMgIT0gbnVsbCAmJiBzQmxvY2tMQW5hbHlzaXMuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSVNCbG9ja0xBbmFseXNpcykgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzQmxvY2tMQW5hbHlzaXMpCi0gICAgICAgICAgICA6IHNCbG9ja0xBbmFseXNpczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlJU0Jsb2NrTEFuYWx5c2lzIHNCbG9ja0xBbmFseXNpcyA9IGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCXJldHVybiBzQmxvY2tMQW5hbHlzaXMgIT0gbnVsbCAmJiBzQmxvY2tMQW5hbHlzaXMuZUlzUHJveHkoKQorCQkJPyAoSVNCbG9ja0xBbmFseXNpcykgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzQmxvY2tMQW5hbHlzaXMpCisJCQk6IHNCbG9ja0xBbmFseXNpczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIG5ld1NCbG9ja0xBbmFseXNpcykgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyBuZXdTQmxvY2tMQW5hbHlzaXMpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0ZhaWx1cmVFdmVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNGYWlsdXJlRXZlbnQoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0ZhaWx1cmVFdmVudCgpOworCQkJCXJldHVybiBiYXNpY0dldFNGYWlsdXJlRXZlbnQoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNCbG9ja0xBbmFseXNpcygpOworCQkJCXJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOgotICAgICAgICAgICAgICAgIHNldFNGYWlsdXJlRXZlbnQoKElTRmFpbHVyZUV2ZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVDoKKwkJCQlzZXRTRmFpbHVyZUV2ZW50KChJU0ZhaWx1cmVFdmVudCkgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVDoKLSAgICAgICAgICAgICAgICBzZXRTRmFpbHVyZUV2ZW50KChJU0ZhaWx1cmVFdmVudCkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVDoKKwkJCQlzZXRTRmFpbHVyZUV2ZW50KChJU0ZhaWx1cmVFdmVudCkgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCXNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBzRmFpbHVyZUV2ZW50ICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UOgorCQkJCXJldHVybiBzRmFpbHVyZUV2ZW50ICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuamF2YQppbmRleCA4MzExODQ1Li40YWRjYjU2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuamF2YQpAQCAtNTQsMzM0ICs1NCwzMzQgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKLSAgICBpbXBsZW1lbnRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyB7CisJZXh0ZW5kcyBBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKKwlpbXBsZW1lbnRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTRmFpbHVyZU1vZGUoKSA8ZW0+U0ZhaWx1cmUgTW9kZTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2RlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVNGYWlsdXJlTW9kZSBzRmFpbHVyZU1vZGU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZhaWx1cmVNb2RlKCkgPGVtPlNGYWlsdXJlIE1vZGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFNGYWlsdXJlTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIElTRmFpbHVyZU1vZGUgc0ZhaWx1cmVNb2RlOwogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpIDxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbGllcyBMaXN0PC9lbT59JyByZWZlcmVuY2UKLSAgICAgKiBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSA8ZW0+U0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdDwvZW0+fScgcmVmZXJlbmNlCisJICogbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gc0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNGZWFyZWRFdmVudHNMaXN0KCkgPGVtPlNGZWFyZWQgRXZlbnRzIExpc3Q8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBzRmVhcmVkRXZlbnRzTGlzdDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTRmVhcmVkRXZlbnRzTGlzdCgpIDxlbT5TRmVhcmVkIEV2ZW50cyBMaXN0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFNGZWFyZWRFdmVudHNMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8SVNGZWFyZWRFdmVudD4gc0ZlYXJlZEV2ZW50c0xpc3Q7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzIHNCbG9ja0xBbmFseXNpcyA9IGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgIHJldHVybiBzQmxvY2tMQW5hbHlzaXMgIT0gbnVsbCAmJiBzQmxvY2tMQW5hbHlzaXMuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSVNCbG9ja0xBbmFseXNpcykgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzQmxvY2tMQW5hbHlzaXMpCi0gICAgICAgICAgICA6IHNCbG9ja0xBbmFseXNpczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmxvY2tMQW5hbHlzaXMgZ2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlJU0Jsb2NrTEFuYWx5c2lzIHNCbG9ja0xBbmFseXNpcyA9IGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCXJldHVybiBzQmxvY2tMQW5hbHlzaXMgIT0gbnVsbCAmJiBzQmxvY2tMQW5hbHlzaXMuZUlzUHJveHkoKQorCQkJPyAoSVNCbG9ja0xBbmFseXNpcykgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzQmxvY2tMQW5hbHlzaXMpCisJCQk6IHNCbG9ja0xBbmFseXNpczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIG5ld1NCbG9ja0xBbmFseXNpcykgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyBuZXdTQmxvY2tMQW5hbHlzaXMpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNGYWlsdXJlTW9kZSBnZXRTRmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIGlmIChzRmFpbHVyZU1vZGUgIT0gbnVsbCAmJiBzRmFpbHVyZU1vZGUuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZFNGYWlsdXJlTW9kZSA9IChJbnRlcm5hbEVPYmplY3QpIHNGYWlsdXJlTW9kZTsKLSAgICAgICAgICAgIHNGYWlsdXJlTW9kZSA9IChJU0ZhaWx1cmVNb2RlKSBlUmVzb2x2ZVByb3h5KG9sZFNGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICBpZiAoc0ZhaWx1cmVNb2RlICE9IG9sZFNGYWlsdXJlTW9kZSkgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTRmFpbHVyZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc0ZhaWx1cmVNb2RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNGYWlsdXJlTW9kZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTRmFpbHVyZU1vZGUgZ2V0U0ZhaWx1cmVNb2RlKCkgeworCQlpZiAoc0ZhaWx1cmVNb2RlICE9IG51bGwgJiYgc0ZhaWx1cmVNb2RlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTRmFpbHVyZU1vZGUgPSAoSW50ZXJuYWxFT2JqZWN0KSBzRmFpbHVyZU1vZGU7CisJCQlzRmFpbHVyZU1vZGUgPSAoSVNGYWlsdXJlTW9kZSkgZVJlc29sdmVQcm94eShvbGRTRmFpbHVyZU1vZGUpOworCQkJaWYgKHNGYWlsdXJlTW9kZSAhPSBvbGRTRmFpbHVyZU1vZGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREUsCisJCQkJCQkJb2xkU0ZhaWx1cmVNb2RlLAorCQkJCQkJCXNGYWlsdXJlTW9kZSkpOworCQkJfQorCQl9CisJCXJldHVybiBzRmFpbHVyZU1vZGU7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmFpbHVyZU1vZGUgYmFzaWNHZXRTRmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBzRmFpbHVyZU1vZGU7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0ZhaWx1cmVNb2RlIGJhc2ljR2V0U0ZhaWx1cmVNb2RlKCkgeworCQlyZXR1cm4gc0ZhaWx1cmVNb2RlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNGYWlsdXJlTW9kZShJU0ZhaWx1cmVNb2RlIG5ld1NGYWlsdXJlTW9kZSkgewotICAgICAgICBJU0ZhaWx1cmVNb2RlIG9sZFNGYWlsdXJlTW9kZSA9IHNGYWlsdXJlTW9kZTsKLSAgICAgICAgc0ZhaWx1cmVNb2RlID0gbmV3U0ZhaWx1cmVNb2RlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFLAotICAgICAgICAgICAgICAgICAgICBvbGRTRmFpbHVyZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgIHNGYWlsdXJlTW9kZSkpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTRmFpbHVyZU1vZGUoSVNGYWlsdXJlTW9kZSBuZXdTRmFpbHVyZU1vZGUpIHsKKwkJSVNGYWlsdXJlTW9kZSBvbGRTRmFpbHVyZU1vZGUgPSBzRmFpbHVyZU1vZGU7CisJCXNGYWlsdXJlTW9kZSA9IG5ld1NGYWlsdXJlTW9kZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERSwKKwkJCQkJb2xkU0ZhaWx1cmVNb2RlLAorCQkJCQlzRmFpbHVyZU1vZGUpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSB7Ci0gICAgICAgIGlmIChzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PigKLSAgICAgICAgICAgICAgICBJU0ZlYXJlZEV2ZW50c0ZhbWlseS5jbGFzcywKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3Q7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpIHsKKwkJaWYgKHNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QgPT0gbnVsbCkgeworCQkJc0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+KAorCQkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAorCQkJCXRoaXMsCisJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUKTsKKwkJfQorCQlyZXR1cm4gc0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKSB7Ci0gICAgICAgIGlmIChzRmVhcmVkRXZlbnRzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzRmVhcmVkRXZlbnRzTGlzdCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8SVNGZWFyZWRFdmVudD4oCi0gICAgICAgICAgICAgICAgSVNGZWFyZWRFdmVudC5jbGFzcywKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNGZWFyZWRFdmVudHNMaXN0OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKSB7CisJCWlmIChzRmVhcmVkRXZlbnRzTGlzdCA9PSBudWxsKSB7CisJCQlzRmVhcmVkRXZlbnRzTGlzdCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8SVNGZWFyZWRFdmVudD4oCisJCQkJSVNGZWFyZWRFdmVudC5jbGFzcywKKwkJCQl0aGlzLAorCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVCk7CisJCX0KKwkJcmV0dXJuIHNGZWFyZWRFdmVudHNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBnZXRPd25lcigpIHsKLSAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgb3duZXIgPSBiYXNpY0dldE93bmVyKCk7Ci0gICAgICAgIHJldHVybiBvd25lciAhPSBudWxsICYmIG93bmVyLmVJc1Byb3h5KCkKLSAgICAgICAgICAgID8gKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIG93bmVyKQotICAgICAgICAgICAgOiBvd25lcjsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGdldE93bmVyKCkgeworCQlJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBvd25lciA9IGJhc2ljR2V0T3duZXIoKTsKKwkJcmV0dXJuIG93bmVyICE9IG51bGwgJiYgb3duZXIuZUlzUHJveHkoKQorCQkJPyAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgb3duZXIpCisJCQk6IG93bmVyOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBiYXNpY0dldE93bmVyKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnT3duZXInIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRPd25lcigpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ093bmVyJyByZWZlcmVuY2UKKwkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBuZXdPd25lcikgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnT3duZXInIHJlZmVyZW5jZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3duZXIoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgbmV3T3duZXIpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ093bmVyJyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0ZhaWx1cmVNb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVI6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRPd25lcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldE93bmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNGYWlsdXJlTW9kZSgpOworCQkJCXJldHVybiBiYXNpY0dldFNGYWlsdXJlTW9kZSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSVNUOgorCQkJCXJldHVybiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX09XTkVSOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0T3duZXIoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRPd25lcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICBzZXRTRmFpbHVyZU1vZGUoKElTRmFpbHVyZU1vZGUpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50c0ZhbWlseT4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTRmVhcmVkRXZlbnQ+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX09XTkVSOgotICAgICAgICAgICAgICAgIHNldE93bmVyKChJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJc2V0U0Jsb2NrTEFuYWx5c2lzKChJU0Jsb2NrTEFuYWx5c2lzKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGQUlMVVJFX01PREU6CisJCQkJc2V0U0ZhaWx1cmVNb2RlKChJU0ZhaWx1cmVNb2RlKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q6CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpLmNsZWFyKCk7CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNGZWFyZWRFdmVudHNGYW1pbHk+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOworCQkJCWdldFNGZWFyZWRFdmVudHNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50PikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUjoKKwkJCQlzZXRPd25lcigoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgc2V0U0Jsb2NrTEFuYWx5c2lzKChJU0Jsb2NrTEFuYWx5c2lzKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICBzZXRTRmFpbHVyZU1vZGUoKElTRmFpbHVyZU1vZGUpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVI6Ci0gICAgICAgICAgICAgICAgc2V0T3duZXIoKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOgorCQkJCXNldFNGYWlsdXJlTW9kZSgoSVNGYWlsdXJlTW9kZSkgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q6CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUjoKKwkJCQlzZXRPd25lcigoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpIG51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOgotICAgICAgICAgICAgICAgIHJldHVybiBzRmFpbHVyZU1vZGUgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0ICE9IG51bGwgJiYgIXNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QuaXNFbXB0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNGZWFyZWRFdmVudHNMaXN0ICE9IG51bGwgJiYgIXNGZWFyZWRFdmVudHNMaXN0LmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRPd25lcigpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFOgorCQkJCXJldHVybiBzRmFpbHVyZU1vZGUgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgorCQkJCXJldHVybiBzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0ICE9IG51bGwgJiYgIXNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJcmV0dXJuIHNGZWFyZWRFdmVudHNMaXN0ICE9IG51bGwgJiYgIXNGZWFyZWRFdmVudHNMaXN0LmlzRW1wdHkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUjoKKwkJCQlyZXR1cm4gYmFzaWNHZXRPd25lcigpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9BYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyLmphdmEKaW5kZXggMzU5YzZkYi4uNjc4MmIzNCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lci5qYXZhCkBAIC0zNSwxMDQgKzM1LDEwNCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcgotICAgIGV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICBpbXBsZW1lbnRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIHsKKwlleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJaW1wbGVtZW50cyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUjsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgorCQkJCWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUl9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlyZXR1cm4gIWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CiAKIH0gLy8gQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcgpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQuamF2YQppbmRleCBmZjlhODQzLi5lMzdjYmQyIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQuamF2YQpAQCAtMjUsMjggKzI1LDI4IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAotICAgIGV4dGVuZHMgQWJzdHJhY3RTU2FmZXR5Q29uY2VwdAotICAgIGltcGxlbWVudHMgSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IHsKKwlleHRlbmRzIEFic3RyYWN0U1NhZmV0eUNvbmNlcHQKKwlpbXBsZW1lbnRzIElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlQ7CisJfQogCiB9IC8vIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9BYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5qYXZhCmluZGV4IDNkNmY1ZmYuLjVjYTMzYWQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9BYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9BYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5qYXZhCkBAIC0zMiwxMzAgKzMyLDEzMCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKLSAgICBleHRlbmRzIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudAotICAgIGltcGxlbWVudHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIHsKKwlleHRlbmRzIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudAorCWltcGxlbWVudHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJUzsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIElTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNCbG9ja0xBbmFseXNpcyAhPSBudWxsICYmIHNCbG9ja0xBbmFseXNpcy5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJU0Jsb2NrTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNCbG9ja0xBbmFseXNpcykKLSAgICAgICAgICAgIDogc0Jsb2NrTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7CisJCUlTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHNCbG9ja0xBbmFseXNpcyAhPSBudWxsICYmIHNCbG9ja0xBbmFseXNpcy5lSXNQcm94eSgpCisJCQk/IChJU0Jsb2NrTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNCbG9ja0xBbmFseXNpcykKKwkJCTogc0Jsb2NrTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgbmV3U0Jsb2NrTEFuYWx5c2lzKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTQmxvY2sgTEFuYWx5c2lzJyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIG5ld1NCbG9ja0xBbmFseXNpcykgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJc2V0U0Jsb2NrTEFuYWx5c2lzKChJU0Jsb2NrTEFuYWx5c2lzKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJc2V0U0Jsb2NrTEFuYWx5c2lzKChJU0Jsb2NrTEFuYWx5c2lzKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmphdmEKaW5kZXggOWM4OTAyZi4uNGRjZjc5NyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9BYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuamF2YQpAQCAtMzcsMTI3ICszNywxMjcgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudAotICAgIGV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICBpbXBsZW1lbnRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgeworCWV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKKwlpbXBsZW1lbnRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdPdXQgU1Byb3BhZ2F0aW9uIExpbmtzIExpc3QnIHJlZmVyZW5jZSBsaXN0Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ091dCBTUHJvcGFnYXRpb24gTGlua3MgTGlzdCcgcmVmZXJlbmNlIGxpc3QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0luIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0luIFNQcm9wYWdhdGlvbiBMaW5rcyBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKKwkJCQlyZXR1cm4gZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6CisJCQkJcmV0dXJuIGdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTUHJvcGFnYXRpb25MaW5rPikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTUHJvcGFnYXRpb25MaW5rPikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKKwkJCQlnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5jbGVhcigpOworCQkJCWdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNQcm9wYWdhdGlvbkxpbms+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX0lOX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOgorCQkJCWdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNQcm9wYWdhdGlvbkxpbms+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6CisJCQkJZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6CisJCQkJZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU1BST1BBR0FUSU9OX0VMRU1FTlRfX09VVF9TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIWdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIWdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuaXNFbXB0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19PVVRfU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6CisJCQkJcmV0dXJuICFnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5pc0VtcHR5KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fSU5fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6CisJCQkJcmV0dXJuICFnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0VTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkuamF2YQppbmRleCBiZjlhY2RlLi44MzhmMDgxIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkuamF2YQpAQCAtMjksMzY2ICsyOSwzNjYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5Ci0gICAgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLSAgICBpbXBsZW1lbnRzIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB7CisJZXh0ZW5kcyBFRmFjdG9yeUltcGwKKwlpbXBsZW1lbnRzIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkgaW5pdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB0aGVFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgKElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICAgICAgaWYgKHRoZUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhlRVNGTG9jYWxBbmFseXNpc0ZhY3Rvcnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkoKTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkgdGhlRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkgPQorCQkJCShJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lTlNfVVJJKTsKKwkJCWlmICh0aGVFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5OworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KCk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0gICAgICAgIHN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNQb3J0TEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOSzoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU1Byb3BhZ2F0aW9uTGluaygpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNCYXJyaWVyTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTU3lzdGVtRXZlbnQoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBTkRfR0FURV9MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNBbmRHYXRlTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TT1JfR0FURV9MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQUJTRU5UX0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU0Fic2VudEZhaWx1cmVNb2RlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRVJST05FT1VTX0ZBSUxVUkVfTU9ERToKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNMb2NhbEV2ZW50KCk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNyZWF0ZVNQb3J0TEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOSzoKKwkJCQlyZXR1cm4gY3JlYXRlU1Byb3BhZ2F0aW9uTGluaygpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlyZXR1cm4gY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNyZWF0ZVNCYXJyaWVyTEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgorCQkJCXJldHVybiBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UOgorCQkJCXJldHVybiBjcmVhdGVTU3lzdGVtRXZlbnQoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUlk6CisJCQkJcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFk6CisJCQkJcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlQ6CisJCQkJcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT046CisJCQkJcmV0dXJuIGNyZWF0ZVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBTkRfR0FURV9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNyZWF0ZVNBbmRHYXRlTEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TT1JfR0FURV9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREU6CisJCQkJcmV0dXJuIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQUJTRU5UX0ZBSUxVUkVfTU9ERToKKwkJCQlyZXR1cm4gY3JlYXRlU0Fic2VudEZhaWx1cmVNb2RlKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRVJST05FT1VTX0ZBSUxVUkVfTU9ERToKKwkJCQlyZXR1cm4gY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfRVZFTlQ6CisJCQkJcmV0dXJuIGNyZWF0ZVNMb2NhbEV2ZW50KCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNESVJFQ1RJT05fTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTRGlyZWN0aW9uTEFuYWx5c2lzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RJUkVDVElPTl9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNyZWF0ZVNEaXJlY3Rpb25MQW5hbHlzaXNGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNESVJFQ1RJT05fTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0U0RpcmVjdGlvbkxBbmFseXNpc1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RJUkVDVElPTl9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIGNvbnZlcnRTRGlyZWN0aW9uTEFuYWx5c2lzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTUG9ydExBbmFseXNpcyBjcmVhdGVTUG9ydExBbmFseXNpcygpIHsKLSAgICAgICAgU1BvcnRMQW5hbHlzaXMgc1BvcnRMQW5hbHlzaXMgPSBuZXcgU1BvcnRMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNQb3J0TEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNQb3J0TEFuYWx5c2lzIGNyZWF0ZVNQb3J0TEFuYWx5c2lzKCkgeworCQlTUG9ydExBbmFseXNpcyBzUG9ydExBbmFseXNpcyA9IG5ldyBTUG9ydExBbmFseXNpcygpOworCQlyZXR1cm4gc1BvcnRMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTUHJvcGFnYXRpb25MaW5rIGNyZWF0ZVNQcm9wYWdhdGlvbkxpbmsoKSB7Ci0gICAgICAgIFNQcm9wYWdhdGlvbkxpbmsgc1Byb3BhZ2F0aW9uTGluayA9IG5ldyBTUHJvcGFnYXRpb25MaW5rKCk7Ci0gICAgICAgIHJldHVybiBzUHJvcGFnYXRpb25MaW5rOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNQcm9wYWdhdGlvbkxpbmsgY3JlYXRlU1Byb3BhZ2F0aW9uTGluaygpIHsKKwkJU1Byb3BhZ2F0aW9uTGluayBzUHJvcGFnYXRpb25MaW5rID0gbmV3IFNQcm9wYWdhdGlvbkxpbmsoKTsKKwkJcmV0dXJuIHNQcm9wYWdhdGlvbkxpbms7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmxvY2tMQW5hbHlzaXMgY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICBTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gbmV3IFNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICByZXR1cm4gc0Jsb2NrTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBjcmVhdGVTQmxvY2tMQW5hbHlzaXMoKSB7CisJCVNCbG9ja0xBbmFseXNpcyBzQmxvY2tMQW5hbHlzaXMgPSBuZXcgU0Jsb2NrTEFuYWx5c2lzKCk7CisJCXJldHVybiBzQmxvY2tMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmFycmllckxBbmFseXNpcyBjcmVhdGVTQmFycmllckxBbmFseXNpcygpIHsKLSAgICAgICAgU0JhcnJpZXJMQW5hbHlzaXMgc0JhcnJpZXJMQW5hbHlzaXMgPSBuZXcgU0JhcnJpZXJMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNCYXJyaWVyTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCYXJyaWVyTEFuYWx5c2lzIGNyZWF0ZVNCYXJyaWVyTEFuYWx5c2lzKCkgeworCQlTQmFycmllckxBbmFseXNpcyBzQmFycmllckxBbmFseXNpcyA9IG5ldyBTQmFycmllckxBbmFseXNpcygpOworCQlyZXR1cm4gc0JhcnJpZXJMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTTG9jYWxBbmFseXNpcyBjcmVhdGVTTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgU0xvY2FsQW5hbHlzaXMgc0xvY2FsQW5hbHlzaXMgPSBuZXcgU0xvY2FsQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNMb2NhbEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNMb2NhbEFuYWx5c2lzIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKCkgeworCQlTTG9jYWxBbmFseXNpcyBzTG9jYWxBbmFseXNpcyA9IG5ldyBTTG9jYWxBbmFseXNpcygpOworCQlyZXR1cm4gc0xvY2FsQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTU3lzdGVtRXZlbnRzTGlicmFyeSBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgU1N5c3RlbUV2ZW50c0xpYnJhcnkgc1N5c3RlbUV2ZW50c0xpYnJhcnkgPSBuZXcgU1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgcmV0dXJuIHNTeXN0ZW1FdmVudHNMaWJyYXJ5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlTU3lzdGVtRXZlbnRzTGlicmFyeSBzU3lzdGVtRXZlbnRzTGlicmFyeSA9IG5ldyBTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCQlyZXR1cm4gc1N5c3RlbUV2ZW50c0xpYnJhcnk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTU3lzdGVtRXZlbnRUeXBlIGNyZWF0ZVNTeXN0ZW1FdmVudFR5cGUoKSB7Ci0gICAgICAgIFNTeXN0ZW1FdmVudFR5cGUgc1N5c3RlbUV2ZW50VHlwZSA9IG5ldyBTU3lzdGVtRXZlbnRUeXBlKCk7Ci0gICAgICAgIHJldHVybiBzU3lzdGVtRXZlbnRUeXBlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNTeXN0ZW1FdmVudFR5cGUgY3JlYXRlU1N5c3RlbUV2ZW50VHlwZSgpIHsKKwkJU1N5c3RlbUV2ZW50VHlwZSBzU3lzdGVtRXZlbnRUeXBlID0gbmV3IFNTeXN0ZW1FdmVudFR5cGUoKTsKKwkJcmV0dXJuIHNTeXN0ZW1FdmVudFR5cGU7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTU3lzdGVtRXZlbnQgY3JlYXRlU1N5c3RlbUV2ZW50KCkgewotICAgICAgICBTU3lzdGVtRXZlbnQgc1N5c3RlbUV2ZW50ID0gbmV3IFNTeXN0ZW1FdmVudCgpOwotICAgICAgICByZXR1cm4gc1N5c3RlbUV2ZW50OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNTeXN0ZW1FdmVudCBjcmVhdGVTU3lzdGVtRXZlbnQoKSB7CisJCVNTeXN0ZW1FdmVudCBzU3lzdGVtRXZlbnQgPSBuZXcgU1N5c3RlbUV2ZW50KCk7CisJCXJldHVybiBzU3lzdGVtRXZlbnQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmVhcmVkRXZlbnRzTGlicmFyeSBjcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgU0ZlYXJlZEV2ZW50c0xpYnJhcnkgc0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBuZXcgU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgcmV0dXJuIHNGZWFyZWRFdmVudHNMaWJyYXJ5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQlTRmVhcmVkRXZlbnRzTGlicmFyeSBzRmVhcmVkRXZlbnRzTGlicmFyeSA9IG5ldyBTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCQlyZXR1cm4gc0ZlYXJlZEV2ZW50c0xpYnJhcnk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmVhcmVkRXZlbnRzRmFtaWx5IGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkoKSB7Ci0gICAgICAgIFNGZWFyZWRFdmVudHNGYW1pbHkgc0ZlYXJlZEV2ZW50c0ZhbWlseSA9IG5ldyBTRmVhcmVkRXZlbnRzRmFtaWx5KCk7Ci0gICAgICAgIHJldHVybiBzRmVhcmVkRXZlbnRzRmFtaWx5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGZWFyZWRFdmVudHNGYW1pbHkgY3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseSgpIHsKKwkJU0ZlYXJlZEV2ZW50c0ZhbWlseSBzRmVhcmVkRXZlbnRzRmFtaWx5ID0gbmV3IFNGZWFyZWRFdmVudHNGYW1pbHkoKTsKKwkJcmV0dXJuIHNGZWFyZWRFdmVudHNGYW1pbHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmVhcmVkRXZlbnQgY3JlYXRlU0ZlYXJlZEV2ZW50KCkgewotICAgICAgICBTRmVhcmVkRXZlbnQgc0ZlYXJlZEV2ZW50ID0gbmV3IFNGZWFyZWRFdmVudCgpOwotICAgICAgICByZXR1cm4gc0ZlYXJlZEV2ZW50OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGZWFyZWRFdmVudCBjcmVhdGVTRmVhcmVkRXZlbnQoKSB7CisJCVNGZWFyZWRFdmVudCBzRmVhcmVkRXZlbnQgPSBuZXcgU0ZlYXJlZEV2ZW50KCk7CisJCXJldHVybiBzRmVhcmVkRXZlbnQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uIGNyZWF0ZVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKSB7Ci0gICAgICAgIFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiA9IG5ldyBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gY3JlYXRlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpIHsKKwkJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uID0gbmV3IFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKTsKKwkJcmV0dXJuIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb247CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQW5kR2F0ZUxBbmFseXNpcyBjcmVhdGVTQW5kR2F0ZUxBbmFseXNpcygpIHsKLSAgICAgICAgU0FuZEdhdGVMQW5hbHlzaXMgc0FuZEdhdGVMQW5hbHlzaXMgPSBuZXcgU0FuZEdhdGVMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNBbmRHYXRlTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNBbmRHYXRlTEFuYWx5c2lzIGNyZWF0ZVNBbmRHYXRlTEFuYWx5c2lzKCkgeworCQlTQW5kR2F0ZUxBbmFseXNpcyBzQW5kR2F0ZUxBbmFseXNpcyA9IG5ldyBTQW5kR2F0ZUxBbmFseXNpcygpOworCQlyZXR1cm4gc0FuZEdhdGVMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTT3JHYXRlTEFuYWx5c2lzIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIFNPckdhdGVMQW5hbHlzaXMgc09yR2F0ZUxBbmFseXNpcyA9IG5ldyBTT3JHYXRlTEFuYWx5c2lzKCk7Ci0gICAgICAgIHJldHVybiBzT3JHYXRlTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNPckdhdGVMQW5hbHlzaXMgY3JlYXRlU09yR2F0ZUxBbmFseXNpcygpIHsKKwkJU09yR2F0ZUxBbmFseXNpcyBzT3JHYXRlTEFuYWx5c2lzID0gbmV3IFNPckdhdGVMQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHNPckdhdGVMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTVW50aW1lbHlGYWlsdXJlTW9kZSBjcmVhdGVTVW50aW1lbHlGYWlsdXJlTW9kZSgpIHsKLSAgICAgICAgU1VudGltZWx5RmFpbHVyZU1vZGUgc1VudGltZWx5RmFpbHVyZU1vZGUgPSBuZXcgU1VudGltZWx5RmFpbHVyZU1vZGUoKTsKLSAgICAgICAgcmV0dXJuIHNVbnRpbWVseUZhaWx1cmVNb2RlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNVbnRpbWVseUZhaWx1cmVNb2RlIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlKCkgeworCQlTVW50aW1lbHlGYWlsdXJlTW9kZSBzVW50aW1lbHlGYWlsdXJlTW9kZSA9IG5ldyBTVW50aW1lbHlGYWlsdXJlTW9kZSgpOworCQlyZXR1cm4gc1VudGltZWx5RmFpbHVyZU1vZGU7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQWJzZW50RmFpbHVyZU1vZGUgY3JlYXRlU0Fic2VudEZhaWx1cmVNb2RlKCkgewotICAgICAgICBTQWJzZW50RmFpbHVyZU1vZGUgc0Fic2VudEZhaWx1cmVNb2RlID0gbmV3IFNBYnNlbnRGYWlsdXJlTW9kZSgpOwotICAgICAgICByZXR1cm4gc0Fic2VudEZhaWx1cmVNb2RlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKSB7CisJCVNBYnNlbnRGYWlsdXJlTW9kZSBzQWJzZW50RmFpbHVyZU1vZGUgPSBuZXcgU0Fic2VudEZhaWx1cmVNb2RlKCk7CisJCXJldHVybiBzQWJzZW50RmFpbHVyZU1vZGU7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRXJyb25lb3VzRmFpbHVyZU1vZGUgY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkgewotICAgICAgICBTRXJyb25lb3VzRmFpbHVyZU1vZGUgc0Vycm9uZW91c0ZhaWx1cmVNb2RlID0gbmV3IFNFcnJvbmVvdXNGYWlsdXJlTW9kZSgpOwotICAgICAgICByZXR1cm4gc0Vycm9uZW91c0ZhaWx1cmVNb2RlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSBjcmVhdGVTRXJyb25lb3VzRmFpbHVyZU1vZGUoKSB7CisJCVNFcnJvbmVvdXNGYWlsdXJlTW9kZSBzRXJyb25lb3VzRmFpbHVyZU1vZGUgPSBuZXcgU0Vycm9uZW91c0ZhaWx1cmVNb2RlKCk7CisJCXJldHVybiBzRXJyb25lb3VzRmFpbHVyZU1vZGU7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTTG9jYWxFdmVudCBjcmVhdGVTTG9jYWxFdmVudCgpIHsKLSAgICAgICAgU0xvY2FsRXZlbnQgc0xvY2FsRXZlbnQgPSBuZXcgU0xvY2FsRXZlbnQoKTsKLSAgICAgICAgcmV0dXJuIHNMb2NhbEV2ZW50OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNMb2NhbEV2ZW50IGNyZWF0ZVNMb2NhbEV2ZW50KCkgeworCQlTTG9jYWxFdmVudCBzTG9jYWxFdmVudCA9IG5ldyBTTG9jYWxFdmVudCgpOworCQlyZXR1cm4gc0xvY2FsRXZlbnQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFNEaXJlY3Rpb25MQW5hbHlzaXMgY3JlYXRlU0RpcmVjdGlvbkxBbmFseXNpc0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICBTRGlyZWN0aW9uTEFuYWx5c2lzIHJlc3VsdCA9IFNEaXJlY3Rpb25MQW5hbHlzaXMuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNEaXJlY3Rpb25MQW5hbHlzaXMgY3JlYXRlU0RpcmVjdGlvbkxBbmFseXNpc0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlTRGlyZWN0aW9uTEFuYWx5c2lzIHJlc3VsdCA9IFNEaXJlY3Rpb25MQW5hbHlzaXMuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTRGlyZWN0aW9uTEFuYWx5c2lzVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFNEaXJlY3Rpb25MQW5hbHlzaXNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIGdldEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gKElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSBnZXRFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSgpIHsKKwkJcmV0dXJuIChJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UpIGdldEVQYWNrYWdlKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0U7CisJfQogCiB9IC8vIEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5qYXZhCmluZGV4IDU2YmQyZTAuLjEzYTBjZGMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9FU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5qYXZhCkBAIC02OCwyODc2ICs2OCwyODc2IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZQotICAgIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi0gICAgaW1wbGVtZW50cyBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UgeworCWV4dGVuZHMgRVBhY2thZ2VJbXBsCisJaW1wbGVtZW50cyBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UgewogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50RUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNQb3J0TEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzUG9ydExBbmFseXNpc0VDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEVDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBzUHJvcGFnYXRpb25MaW5rRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzUHJvcGFnYXRpb25MaW5rRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNCbG9ja0xBbmFseXNpc0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc0VDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBzQmFycmllckxBbmFseXNpc0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc0xvY2FsQW5hbHlzaXNFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNMb2NhbEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNTeXN0ZW1FdmVudEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc1N5c3RlbUV2ZW50RUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNGZWFyZWRFdmVudHNMaWJyYXJ5RUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNGZWFyZWRFdmVudEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0ZlYXJlZEV2ZW50RUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc0FuZEdhdGVMQW5hbHlzaXNFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNBbmRHYXRlTEFuYWx5c2lzRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNPckdhdGVMQW5hbHlzaXNFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNPckdhdGVMQW5hbHlzaXNFQ2xhc3MgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc1VudGltZWx5RmFpbHVyZU1vZGVFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNVbnRpbWVseUZhaWx1cmVNb2RlRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNBYnNlbnRGYWlsdXJlTW9kZUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0Fic2VudEZhaWx1cmVNb2RlRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNFcnJvbmVvdXNGYWlsdXJlTW9kZUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc0Vycm9uZW91c0ZhaWx1cmVNb2RlRUNsYXNzID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHNMb2NhbEV2ZW50RUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzTG9jYWxFdmVudEVDbGFzcyA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVFbnVtIHNEaXJlY3Rpb25MQW5hbHlzaXNFRW51bSA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBzRGlyZWN0aW9uTEFuYWx5c2lzRUVudW0gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0gICAgICogcGFja2FnZSBVUkkgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotICAgICAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0gICAgICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLSAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNlTlNfVVJJCi0gICAgICogQHNlZSAjaW5pdCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UoKSB7Ci0gICAgICAgIHN1cGVyKGVOU19VUkksIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5lSU5TVEFOQ0UpOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD4KKwkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgSUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIGluaXQoKSB7Ci0gICAgICAgIGlmIChpc0luaXRlZCkKLSAgICAgICAgICAgIHJldHVybiAoSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZU5TX1VSSSk7CisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKQorCQkJcmV0dXJuIChJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lTlNfVVJJKTsKIAotICAgICAgICAvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0gICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIHRoZUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlID0KLSAgICAgICAgICAgIChFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlCi0gICAgICAgICAgICAgICAgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkKLSAgICAgICAgICAgICAgICA6IG5ldyBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSgpKTsKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSB0aGVFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSA9CisJCQkoRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZQorCQkJCT8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpCisJCQkJOiBuZXcgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UoKSk7CiAKLSAgICAgICAgaXNJbml0ZWQgPSB0cnVlOworCQlpc0luaXRlZCA9IHRydWU7CiAKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0gICAgICAgIElFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotICAgICAgICBJRVNGU2FmZXR5Q29uY2VwdHNQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUlFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlJRVNGU2FmZXR5Q29uY2VwdHNQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAotICAgICAgICAvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotICAgICAgICB0aGVFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotICAgICAgICB0aGVFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZnJlZXplKCk7CisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZnJlZXplKCk7CiAKLSAgICAgICAgLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0gICAgICAgIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZU5TX1VSSSwgdGhlRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UpOwotICAgICAgICByZXR1cm4gdGhlRVNGTG9jYWxBbmFseXNpc1BhY2thZ2U7Ci0gICAgfQorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lTlNfVVJJLCB0aGVFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSk7CisJCXJldHVybiB0aGVFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSB7CisJCXJldHVybiBhYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudEVDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNQb3J0TEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gc1BvcnRMQW5hbHlzaXNFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U1BvcnRMQW5hbHlzaXMoKSB7CisJCXJldHVybiBzUG9ydExBbmFseXNpc0VDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTUG9ydExBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1BvcnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1BvcnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNQb3J0TEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U1BvcnRMQW5hbHlzaXNfU1BvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1BvcnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1BvcnRMQW5hbHlzaXNfU1BvcnQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1BvcnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTUG9ydExBbmFseXNpc19CYXNlX1BvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1BvcnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1BvcnRMQW5hbHlzaXNfQmFzZV9Qb3J0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNQb3J0TEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzUG9ydExBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTUG9ydExBbmFseXNpc19TRGlyZWN0aW9uTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNQb3J0TEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lckVDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCkgeworCQlyZXR1cm4gYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lckVDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcl9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGYWlsdXJlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmFpbHVyZU1vZGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmVhcmVkRXZlbnRzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmVhcmVkRXZlbnRzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX093bmVyKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX093bmVyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCkgeworCQlyZXR1cm4gYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50RUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X0luU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfSW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTUHJvcGFnYXRpb25MaW5rKCkgewotICAgICAgICByZXR1cm4gc1Byb3BhZ2F0aW9uTGlua0VDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTUHJvcGFnYXRpb25MaW5rKCkgeworCQlyZXR1cm4gc1Byb3BhZ2F0aW9uTGlua0VDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1Byb3BhZ2F0aW9uTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1Byb3BhZ2F0aW9uTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNQcm9wYWdhdGlvbkxpbmtfU0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNQcm9wYWdhdGlvbkxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1Byb3BhZ2F0aW9uTGlua19TQmxvY2tMQW5hbHlzaXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1Byb3BhZ2F0aW9uTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNQcm9wYWdhdGlvbkxpbmtfQmFzZV9EZXBlbmRlbmN5KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNQcm9wYWdhdGlvbkxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1Byb3BhZ2F0aW9uTGlua19CYXNlX0RlcGVuZGVuY3koKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1Byb3BhZ2F0aW9uTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzUHJvcGFnYXRpb25MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFNvdXJjZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzUHJvcGFnYXRpb25MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiBzQmxvY2tMQW5hbHlzaXNFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gc0Jsb2NrTEFuYWx5c2lzRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TQmxvY2soKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TQmxvY2soKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU1BvcnRzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX0Jhc2VfQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19CYXNlX0NsYXNzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TQmFycmllcnNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU0xvY2FsQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNCbG9ja0xBbmFseXNpc19TTG9jYWxBbmFseXNpcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpIHsKKwkJcmV0dXJuIGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0VDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NGYWlsdXJlRXZlbnQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoKSB7CisJCXJldHVybiBhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc0VDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTQmFycmllckxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIHNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNCYXJyaWVyTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0JhcnJpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0JhcnJpZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmFycmllckxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNCYXJyaWVyTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQmFycmllckxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIHNMb2NhbEFuYWx5c2lzRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNMb2NhbEFuYWx5c2lzKCkgeworCQlyZXR1cm4gc0xvY2FsQW5hbHlzaXNFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0xvY2FsQW5hbHlzaXNfQmFzZV9QYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNMb2NhbEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNMb2NhbEFuYWx5c2lzX0Jhc2VfUGFja2FnZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzTG9jYWxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNMb2NhbEFuYWx5c2lzX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNMb2NhbEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNMb2NhbEFuYWx5c2lzX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNMb2NhbEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0xvY2FsQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0xvY2FsQW5hbHlzaXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTTG9jYWxBbmFseXNpc19TQmxvY2tzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzTG9jYWxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTTG9jYWxBbmFseXNpc19TQmxvY2tzTEFuYWx5c2lzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzTG9jYWxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiBzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKKwkJcmV0dXJuIHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X0Jhc2VfUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9CYXNlX1BhY2thZ2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TU3lzdGVtRXZlbnRUeXBlc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNTeXN0ZW1FdmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNTeXN0ZW1FdmVudFR5cGUoKSB7CisJCXJldHVybiBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudFR5cGVfQmFzZV9DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudFR5cGVfQmFzZV9DbGFzcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50VHlwZV9TRmFpbHVyZUV2ZW50KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNTeXN0ZW1FdmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50VHlwZV9TRmFpbHVyZUV2ZW50KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNTeXN0ZW1FdmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRUeXBlX0luc3RhbmNlc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRUeXBlX0luc3RhbmNlc0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudFR5cGVfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRUeXBlX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNTeXN0ZW1FdmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNTeXN0ZW1FdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHNTeXN0ZW1FdmVudEVDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTU3lzdGVtRXZlbnQoKSB7CisJCXJldHVybiBzU3lzdGVtRXZlbnRFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U1N5c3RlbUV2ZW50X0Jhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1N5c3RlbUV2ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudF9CYXNlX1Byb3BlcnR5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNTeXN0ZW1FdmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNTeXN0ZW1FdmVudF9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNTeXN0ZW1FdmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTU3lzdGVtRXZlbnRfVHlwZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzU3lzdGVtRXZlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgewotICAgICAgICByZXR1cm4gc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCXJldHVybiBzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9CYXNlX1BhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TTG9jYWxBbmFseXNpcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpIHsKLSAgICAgICAgcmV0dXJuIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpIHsKKwkJcmV0dXJuIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9CYXNlX0NsYXNzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9CYXNlX0NsYXNzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmVhcmVkRXZlbnRzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9Jc1NlbGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9Jc1NlbGVjdGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1N1YkZhbWlsaWVzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU3ViRmFtaWxpZXNMaXN0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X0FsbFNGZWFyZWRFdmVudHNMaXN0KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9BbGxTRmVhcmVkRXZlbnRzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNGZWFyZWRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHNGZWFyZWRFdmVudEVDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTRmVhcmVkRXZlbnQoKSB7CisJCXJldHVybiBzRmVhcmVkRXZlbnRFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0ZlYXJlZEV2ZW50X0lzU2VsZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgc0ZlYXJlZEV2ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNGZWFyZWRFdmVudF9Jc1NlbGVjdGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNGZWFyZWRFdmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudF9CYXNlX0NsYXNzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNGZWFyZWRFdmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRfQmFzZV9DbGFzcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudF9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRmVhcmVkRXZlbnRfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0ZlYXJlZEV2ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNGZWFyZWRFdmVudF9TRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRmVhcmVkRXZlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKSB7CisJCXJldHVybiBzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fU0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25fQmFzZV9Db25uZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX0Jhc2VfQ29ubmVjdG9yKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZU93bmVyKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVPd25lcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTQW5kR2F0ZUxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIHNBbmRHYXRlTEFuYWx5c2lzRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNBbmRHYXRlTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gc0FuZEdhdGVMQW5hbHlzaXNFQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U0FuZEdhdGVMQW5hbHlzaXNfQmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzQW5kR2F0ZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQW5kR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNBbmRHYXRlTEFuYWx5c2lzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTT3JHYXRlTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gc09yR2F0ZUxBbmFseXNpc0VDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTT3JHYXRlTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gc09yR2F0ZUxBbmFseXNpc0VDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT3JHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc09yR2F0ZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT3JHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc09yR2F0ZUxBbmFseXNpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0U1VudGltZWx5RmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBzVW50aW1lbHlGYWlsdXJlTW9kZUVDbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTVW50aW1lbHlGYWlsdXJlTW9kZSgpIHsKKwkJcmV0dXJuIHNVbnRpbWVseUZhaWx1cmVNb2RlRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNVbnRpbWVseUZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1VudGltZWx5RmFpbHVyZU1vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1VudGltZWx5RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzVW50aW1lbHlGYWlsdXJlTW9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0U0Fic2VudEZhaWx1cmVNb2RlKCkgewotICAgICAgICByZXR1cm4gc0Fic2VudEZhaWx1cmVNb2RlRUNsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNBYnNlbnRGYWlsdXJlTW9kZSgpIHsKKwkJcmV0dXJuIHNBYnNlbnRGYWlsdXJlTW9kZUVDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTQWJzZW50RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBzQWJzZW50RmFpbHVyZU1vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0Fic2VudEZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0Fic2VudEZhaWx1cmVNb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTRXJyb25lb3VzRmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBzRXJyb25lb3VzRmFpbHVyZU1vZGVFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkgeworCQlyZXR1cm4gc0Vycm9uZW91c0ZhaWx1cmVNb2RlRUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNFcnJvbmVvdXNGYWlsdXJlTW9kZV9CYXNlX1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNFcnJvbmVvdXNGYWlsdXJlTW9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRXJyb25lb3VzRmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKSBzRXJyb25lb3VzRmFpbHVyZU1vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFNMb2NhbEV2ZW50KCkgewotICAgICAgICByZXR1cm4gc0xvY2FsRXZlbnRFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0xvY2FsRXZlbnQoKSB7CisJCXJldHVybiBzTG9jYWxFdmVudEVDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTTG9jYWxFdmVudF9CYXNlX1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHNMb2NhbEV2ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNMb2NhbEV2ZW50X0Jhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc0xvY2FsRXZlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUVudW0gZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIHNEaXJlY3Rpb25MQW5hbHlzaXNFRW51bTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFNEaXJlY3Rpb25MQW5hbHlzaXMoKSB7CisJCXJldHVybiBzRGlyZWN0aW9uTEFuYWx5c2lzRUVudW07CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSBnZXRFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIChJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSBnZXRFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gVGhpcyBtZXRob2QgaXMKLSAgICAgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotICAgICAgICBpZiAoaXNDcmVhdGVkKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpc0NyZWF0ZWQgPSB0cnVlOworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkKKwkJCXJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKIAotICAgICAgICAvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLSAgICAgICAgYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlQpOworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlQpOwogCi0gICAgICAgIHNQb3J0TEFuYWx5c2lzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNQT1JUX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1BvcnRMQW5hbHlzaXNFQ2xhc3MsIFNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1BvcnRMQW5hbHlzaXNFQ2xhc3MsIFNQT1JUX0xBTkFMWVNJU19fU1BPUlQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNQb3J0TEFuYWx5c2lzRUNsYXNzLCBTUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc1BvcnRMQW5hbHlzaXNFQ2xhc3MsIFNQT1JUX0xBTkFMWVNJU19fU0RJUkVDVElPTl9MQU5BTFlTSVMpOworCQlzUG9ydExBbmFseXNpc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTUE9SVF9MQU5BTFlTSVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHNQb3J0TEFuYWx5c2lzRUNsYXNzLCBTUE9SVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHNQb3J0TEFuYWx5c2lzRUNsYXNzLCBTUE9SVF9MQU5BTFlTSVNfX1NQT1JUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzUG9ydExBbmFseXNpc0VDbGFzcywgU1BPUlRfTEFOQUxZU0lTX19CQVNFX1BPUlQpOworCQljcmVhdGVFQXR0cmlidXRlKHNQb3J0TEFuYWx5c2lzRUNsYXNzLCBTUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTKTsKIAotICAgICAgICBhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVIpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJFQ2xhc3MsIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfT1dORVJfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUKTsKKwkJYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzLCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCk7CiAKLSAgICAgICAgYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MsIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLAotICAgICAgICAgICAgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElTVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MsIEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19PV05FUik7CisJCWFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcywgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMpOworCQljcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoCisJCQlhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcywKKwkJCUFCU1RSQUNUX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0VDbGFzcywgQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLCBBQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJU19fT1dORVIpOwogCi0gICAgICAgIGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50RUNsYXNzLCBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRFQ2xhc3MsIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCk7CisJCWFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50RUNsYXNzLCBBQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVF9fT1VUX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRFQ2xhc3MsIEFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UX19JTl9TUFJPUEFHQVRJT05fTElOS1NfTElTVCk7CiAKLSAgICAgICAgc1Byb3BhZ2F0aW9uTGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTUFJPUEFHQVRJT05fTElOSyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzUHJvcGFnYXRpb25MaW5rRUNsYXNzLCBTUFJPUEFHQVRJT05fTElOS19fU0JMT0NLX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywgU1BST1BBR0FUSU9OX0xJTktfX0JBU0VfREVQRU5ERU5DWSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFKTsKKwkJc1Byb3BhZ2F0aW9uTGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTUFJPUEFHQVRJT05fTElOSyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzUHJvcGFnYXRpb25MaW5rRUNsYXNzLCBTUFJPUEFHQVRJT05fTElOS19fU0JMT0NLX0xBTkFMWVNJUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywgU1BST1BBR0FUSU9OX0xJTktfX0JBU0VfREVQRU5ERU5DWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywgU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFKTsKIAotICAgICAgICBzQmxvY2tMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0JMT0NLX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLCBTQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0spOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNCbG9ja0xBbmFseXNpc0VDbGFzcywgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NQT1JUU19MQU5BTFlTSVNfTElTVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLCBTQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NCQVJSSUVSU19MQU5BTFlTSVNfTElTVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLCBTQkxPQ0tfTEFOQUxZU0lTX19TTE9DQUxfQU5BTFlTSVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNCbG9ja0xBbmFseXNpc0VDbGFzcywgU0JMT0NLX0xBTkFMWVNJU19fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QpOworCQlzQmxvY2tMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0JMT0NLX0xBTkFMWVNJUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLCBTQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0spOworCQljcmVhdGVFUmVmZXJlbmNlKHNCbG9ja0xBbmFseXNpc0VDbGFzcywgU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NQT1JUU19MQU5BTFlTSVNfTElTVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLCBTQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzQmxvY2tMQW5hbHlzaXNFQ2xhc3MsIFNCTE9DS19MQU5BTFlTSVNfX1NCQVJSSUVSU19MQU5BTFlTSVNfTElTVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLCBTQkxPQ0tfTEFOQUxZU0lTX19TTE9DQUxfQU5BTFlTSVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHNCbG9ja0xBbmFseXNpc0VDbGFzcywgU0JMT0NLX0xBTkFMWVNJU19fU1BST1BBR0FUSU9OX0xJTktTX0xJU1QpOwogCi0gICAgICAgIGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0VDbGFzcywgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzRUNsYXNzLCBBQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMpOworCQlhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNFQ2xhc3MsIEFCU1RSQUNUX1NGQUlMVVJFX0VWRU5UX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlQpOworCQljcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0VDbGFzcywgQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTKTsKIAotICAgICAgICBhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNFQ2xhc3MsIEFCU1RSQUNUX1NMT0dJQ0FMX0dBVEVfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTKTsKKwkJYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVMpOworCQljcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzRUNsYXNzLCBBQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyk7CiAKLSAgICAgICAgc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0JBUlJJRVJfTEFOQUxZU0lTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzQmFycmllckxBbmFseXNpc0VDbGFzcywgU0JBUlJJRVJfTEFOQUxZU0lTX19TQkFSUklFUik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MsIFNCQVJSSUVSX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MsIFNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUyk7CisJCXNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNCQVJSSUVSX0xBTkFMWVNJUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MsIFNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzLCBTQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkpOworCQljcmVhdGVFUmVmZXJlbmNlKHNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzLCBTQkFSUklFUl9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVMpOwogCi0gICAgICAgIHNMb2NhbEFuYWx5c2lzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNMT0NBTF9BTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0xvY2FsQW5hbHlzaXNFQ2xhc3MsIFNMT0NBTF9BTkFMWVNJU19fQkFTRV9QQUNLQUdFKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzTG9jYWxBbmFseXNpc0VDbGFzcywgU0xPQ0FMX0FOQUxZU0lTX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzTG9jYWxBbmFseXNpc0VDbGFzcywgU0xPQ0FMX0FOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzTG9jYWxBbmFseXNpc0VDbGFzcywgU0xPQ0FMX0FOQUxZU0lTX19TQkxPQ0tTX0xBTkFMWVNJU19MSVNUKTsKKwkJc0xvY2FsQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0xPQ0FMX0FOQUxZU0lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzTG9jYWxBbmFseXNpc0VDbGFzcywgU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0UpOworCQljcmVhdGVFUmVmZXJlbmNlKHNMb2NhbEFuYWx5c2lzRUNsYXNzLCBTTE9DQUxfQU5BTFlTSVNfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlkpOworCQljcmVhdGVFUmVmZXJlbmNlKHNMb2NhbEFuYWx5c2lzRUNsYXNzLCBTTE9DQUxfQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlkpOworCQljcmVhdGVFUmVmZXJlbmNlKHNMb2NhbEFuYWx5c2lzRUNsYXNzLCBTTE9DQUxfQU5BTFlTSVNfX1NCTE9DS1NfTEFOQUxZU0lTX0xJU1QpOwogCi0gICAgICAgIHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNTWVNURU1fRVZFTlRTX0xJQlJBUlkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzLCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzLCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TU1lTVEVNX0VWRU5UX1RZUEVTX0xJU1QpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzLCBTU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVMpOworCQlzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTU1lTVEVNX0VWRU5UU19MSUJSQVJZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcywgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcywgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU1NZU1RFTV9FVkVOVF9UWVBFU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcywgU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTKTsKIAotICAgICAgICBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNTWVNURU1fRVZFTlRfVFlQRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1N5c3RlbUV2ZW50VHlwZUVDbGFzcywgU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLCBTU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5UKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLCBTU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLCBTU1lTVEVNX0VWRU5UX1RZUEVfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlkpOworCQlzU3lzdGVtRXZlbnRUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNTWVNURU1fRVZFTlRfVFlQRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc1N5c3RlbUV2ZW50VHlwZUVDbGFzcywgU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLCBTU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5UKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLCBTU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLCBTU1lTVEVNX0VWRU5UX1RZUEVfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlkpOwogCi0gICAgICAgIHNTeXN0ZW1FdmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTU1lTVEVNX0VWRU5UKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRFQ2xhc3MsIFNTWVNURU1fRVZFTlRfX0JBU0VfUFJPUEVSVFkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNTeXN0ZW1FdmVudEVDbGFzcywgU1NZU1RFTV9FVkVOVF9fVFlQRSk7CisJCXNTeXN0ZW1FdmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTU1lTVEVNX0VWRU5UKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzU3lzdGVtRXZlbnRFQ2xhc3MsIFNTWVNURU1fRVZFTlRfX0JBU0VfUFJPUEVSVFkpOworCQljcmVhdGVFUmVmZXJlbmNlKHNTeXN0ZW1FdmVudEVDbGFzcywgU1NZU1RFTV9FVkVOVF9fVFlQRSk7CiAKLSAgICAgICAgc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNMaWJyYXJ5RUNsYXNzLCBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTKTsKKwkJc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNMaWJyYXJ5RUNsYXNzLCBTRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTKTsKIAotICAgICAgICBzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNGRUFSRURfRVZFTlRTX0ZBTUlMWSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzLCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJU1QpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fSVNfU0VMRUNURUQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU1VCX0ZBTUlMSUVTX0xJU1QpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQUxMX1NGRUFSRURfRVZFTlRTX0xJU1QpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1QpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWSk7CisJCXNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0ZFQVJFRF9FVkVOVFNfRkFNSUxZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRzRmFtaWx5RUNsYXNzLCBTRkVBUkVEX0VWRU5UU19GQU1JTFlfX0JBU0VfQ0xBU1MpOworCQljcmVhdGVFUmVmZXJlbmNlKHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsIFNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElTVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19JU19TRUxFQ1RFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TVUJfRkFNSUxJRVNfTElTVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19BTExfU0ZFQVJFRF9FVkVOVFNfTElTVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcywgU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZKTsKIAotICAgICAgICBzRmVhcmVkRXZlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0ZFQVJFRF9FVkVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc0ZlYXJlZEV2ZW50RUNsYXNzLCBTRkVBUkVEX0VWRU5UX19JU19TRUxFQ1RFRCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50RUNsYXNzLCBTRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRFQ2xhc3MsIFNGRUFSRURfRVZFTlRfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRFQ2xhc3MsIFNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlkpOworCQlzRmVhcmVkRXZlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0ZFQVJFRF9FVkVOVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc0ZlYXJlZEV2ZW50RUNsYXNzLCBTRkVBUkVEX0VWRU5UX19JU19TRUxFQ1RFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0ZlYXJlZEV2ZW50RUNsYXNzLCBTRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRFQ2xhc3MsIFNGRUFSRURfRVZFTlRfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRmVhcmVkRXZlbnRFQ2xhc3MsIFNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlkpOwogCi0gICAgICAgIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MsIFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcywgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRUNsYXNzLCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fU0ZBSUxVUkVfTU9ERV9PV05FUik7CisJCXNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MsIFNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcywgU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRUNsYXNzLCBTRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fU0ZBSUxVUkVfTU9ERV9PV05FUik7CiAKLSAgICAgICAgc0FuZEdhdGVMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0FORF9HQVRFX0xBTkFMWVNJUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0FuZEdhdGVMQW5hbHlzaXNFQ2xhc3MsIFNBTkRfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkpOworCQlzQW5kR2F0ZUxBbmFseXNpc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTQU5EX0dBVEVfTEFOQUxZU0lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzQW5kR2F0ZUxBbmFseXNpc0VDbGFzcywgU0FORF9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSk7CiAKLSAgICAgICAgc09yR2F0ZUxBbmFseXNpc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT1JfR0FURV9MQU5BTFlTSVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNPckdhdGVMQW5hbHlzaXNFQ2xhc3MsIFNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSk7CisJCXNPckdhdGVMQW5hbHlzaXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09SX0dBVEVfTEFOQUxZU0lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzT3JHYXRlTEFuYWx5c2lzRUNsYXNzLCBTT1JfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFkpOwogCi0gICAgICAgIHNVbnRpbWVseUZhaWx1cmVNb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNVTlRJTUVMWV9GQUlMVVJFX01PREUpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNVbnRpbWVseUZhaWx1cmVNb2RlRUNsYXNzLCBTVU5USU1FTFlfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZKTsKKwkJc1VudGltZWx5RmFpbHVyZU1vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1VOVElNRUxZX0ZBSUxVUkVfTU9ERSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc1VudGltZWx5RmFpbHVyZU1vZGVFQ2xhc3MsIFNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFkpOwogCi0gICAgICAgIHNBYnNlbnRGYWlsdXJlTW9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTQUJTRU5UX0ZBSUxVUkVfTU9ERSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc0Fic2VudEZhaWx1cmVNb2RlRUNsYXNzLCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSk7CisJCXNBYnNlbnRGYWlsdXJlTW9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTQUJTRU5UX0ZBSUxVUkVfTU9ERSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc0Fic2VudEZhaWx1cmVNb2RlRUNsYXNzLCBTQUJTRU5UX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSk7CiAKLSAgICAgICAgc0Vycm9uZW91c0ZhaWx1cmVNb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzRXJyb25lb3VzRmFpbHVyZU1vZGVFQ2xhc3MsIFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZKTsKKwkJc0Vycm9uZW91c0ZhaWx1cmVNb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzRXJyb25lb3VzRmFpbHVyZU1vZGVFQ2xhc3MsIFNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZKTsKIAotICAgICAgICBzTG9jYWxFdmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTTE9DQUxfRVZFTlQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNMb2NhbEV2ZW50RUNsYXNzLCBTTE9DQUxfRVZFTlRfX0JBU0VfUFJPUEVSVFkpOworCQlzTG9jYWxFdmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTTE9DQUxfRVZFTlQpOworCQljcmVhdGVFUmVmZXJlbmNlKHNMb2NhbEV2ZW50RUNsYXNzLCBTTE9DQUxfRVZFTlRfX0JBU0VfUFJPUEVSVFkpOwogCi0gICAgICAgIC8vIENyZWF0ZSBlbnVtcwotICAgICAgICBzRGlyZWN0aW9uTEFuYWx5c2lzRUVudW0gPSBjcmVhdGVFRW51bShTRElSRUNUSU9OX0xBTkFMWVNJUyk7Ci0gICAgfQorCQkvLyBDcmVhdGUgZW51bXMKKwkJc0RpcmVjdGlvbkxBbmFseXNpc0VFbnVtID0gY3JlYXRlRUVudW0oU0RJUkVDVElPTl9MQU5BTFlTSVMpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAotICAgIC8qKgotICAgICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMKLSAgICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0gICAgICAgIGlmIChpc0luaXRpYWxpemVkKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkKKwkJCXJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CiAKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgICAgIHNldE5hbWUoZU5BTUUpOwotICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICAgICAgc2V0TnNVUkkoZU5TX1VSSSk7CisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOwogCi0gICAgICAgIC8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLSAgICAgICAgSUVTRkNvcmVQYWNrYWdlIHRoZUVTRkNvcmVQYWNrYWdlID0KLSAgICAgICAgICAgIChJRVNGQ29yZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKElFU0ZDb3JlUGFja2FnZS5lTlNfVVJJKTsKLSAgICAgICAgSUVTRkFyY2hpdGVjdHVyZUNvbmNlcHRzUGFja2FnZSB0aGVFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UgPQotICAgICAgICAgICAgKElFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0gICAgICAgICAgICAgICAgLmdldEVQYWNrYWdlKElFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UuZU5TX1VSSSk7Ci0gICAgICAgIFVNTFBhY2thZ2UgdGhlVU1MUGFja2FnZSA9IChVTUxQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVTUxQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBJU0R5c2Z1bmN0aW9uc1BhY2thZ2UgdGhlU0R5c2Z1bmN0aW9uc1BhY2thZ2UgPQotICAgICAgICAgICAgKElTRHlzZnVuY3Rpb25zUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSVNEeXNmdW5jdGlvbnNQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBJU1JlY29tbWVuZGF0aW9uc1BhY2thZ2UgdGhlU1JlY29tbWVuZGF0aW9uc1BhY2thZ2UgPQotICAgICAgICAgICAgKElTUmVjb21tZW5kYXRpb25zUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSVNSZWNvbW1lbmRhdGlvbnNQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBUeXBlc1BhY2thZ2UgdGhlVHlwZXNQYWNrYWdlID0gKFR5cGVzUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHlwZXNQYWNrYWdlLmVOU19VUkkpOworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUlFU0ZDb3JlUGFja2FnZSB0aGVFU0ZDb3JlUGFja2FnZSA9CisJCQkoSUVTRkNvcmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJRVNGQ29yZVBhY2thZ2UuZU5TX1VSSSk7CisJCUlFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UgdGhlRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlID0KKwkJCShJRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQorCQkJCS5nZXRFUGFja2FnZShJRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlLmVOU19VUkkpOworCQlVTUxQYWNrYWdlIHRoZVVNTFBhY2thZ2UgPSAoVU1MUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVU1MUGFja2FnZS5lTlNfVVJJKTsKKwkJSVNEeXNmdW5jdGlvbnNQYWNrYWdlIHRoZVNEeXNmdW5jdGlvbnNQYWNrYWdlID0KKwkJCShJU0R5c2Z1bmN0aW9uc1BhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKElTRHlzZnVuY3Rpb25zUGFja2FnZS5lTlNfVVJJKTsKKwkJSVNSZWNvbW1lbmRhdGlvbnNQYWNrYWdlIHRoZVNSZWNvbW1lbmRhdGlvbnNQYWNrYWdlID0KKwkJCShJU1JlY29tbWVuZGF0aW9uc1BhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKElTUmVjb21tZW5kYXRpb25zUGFja2FnZS5lTlNfVVJJKTsKKwkJVHlwZXNQYWNrYWdlIHRoZVR5cGVzUGFja2FnZSA9IChUeXBlc1BhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFR5cGVzUGFja2FnZS5lTlNfVVJJKTsKIAotICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKIAotICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLSAgICAgICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotICAgICAgICBhYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFU0ZDb3JlUGFja2FnZS5nZXRBYnN0cmFjdFNTYWZldHlDb25jZXB0KCkpOwotICAgICAgICBzUG9ydExBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKSk7Ci0gICAgICAgIGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKLSAgICAgICAgYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKSk7Ci0gICAgICAgIGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOwotICAgICAgICBzUHJvcGFnYXRpb25MaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSk7Ci0gICAgICAgIHNCbG9ja0xBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOwotICAgICAgICBhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKSk7Ci0gICAgICAgIGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCkpOwotICAgICAgICBzQmFycmllckxBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKSk7Ci0gICAgICAgIHNMb2NhbEFuYWx5c2lzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVTRkNvcmVQYWNrYWdlLmdldEFic3RyYWN0U1NhZmV0eUFuYWx5c2lzKCkpOwotICAgICAgICBzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOwotICAgICAgICBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSk7Ci0gICAgICAgIHNTeXN0ZW1FdmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpKTsKLSAgICAgICAgc0ZlYXJlZEV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKLSAgICAgICAgc0ZlYXJlZEV2ZW50c0ZhbWlseUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOwotICAgICAgICBzRmVhcmVkRXZlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKLSAgICAgICAgc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOwotICAgICAgICBzQW5kR2F0ZUxBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkpOwotICAgICAgICBzT3JHYXRlTEFuYWx5c2lzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoKSk7Ci0gICAgICAgIHNVbnRpbWVseUZhaWx1cmVNb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSk7Ci0gICAgICAgIHNBYnNlbnRGYWlsdXJlTW9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkpOwotICAgICAgICBzRXJyb25lb3VzRmFpbHVyZU1vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpKTsKLSAgICAgICAgc0xvY2FsRXZlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoKSk7CisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRVNGQ29yZVBhY2thZ2UuZ2V0QWJzdHJhY3RTU2FmZXR5Q29uY2VwdCgpKTsKKwkJc1BvcnRMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCkpOworCQlhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSk7CisJCWFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCkpOworCQlhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKKwkJc1Byb3BhZ2F0aW9uTGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOworCQlzQmxvY2tMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKKwkJYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCkpOworCQlhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpKTsKKwkJc0JhcnJpZXJMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCkpOworCQlzTG9jYWxBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFU0ZDb3JlUGFja2FnZS5nZXRBYnN0cmFjdFNTYWZldHlBbmFseXNpcygpKTsKKwkJc1N5c3RlbUV2ZW50c0xpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKKwkJc1N5c3RlbUV2ZW50VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KCkpOworCQlzU3lzdGVtRXZlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoKSk7CisJCXNGZWFyZWRFdmVudHNMaWJyYXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSk7CisJCXNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKKwkJc0ZlYXJlZEV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoKSk7CisJCXNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCgpKTsKKwkJc0FuZEdhdGVMQW5hbHlzaXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpKTsKKwkJc09yR2F0ZUxBbmFseXNpc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkpOworCQlzVW50aW1lbHlGYWlsdXJlTW9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkpOworCQlzQWJzZW50RmFpbHVyZU1vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpKTsKKwkJc0Vycm9uZW91c0ZhaWx1cmVNb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSk7CisJCXNMb2NhbEV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCkpOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycwotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRFQ2xhc3MsCi0gICAgICAgICAgICBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQuY2xhc3MsCi0gICAgICAgICAgICAiQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMsIGZlYXR1cmVzLCBhbmQgb3BlcmF0aW9uczsgYWRkIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcygKKwkJCWFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50RUNsYXNzLAorCQkJSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50LmNsYXNzLAorCQkJIkFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50IiwgLy8kTk9OLU5MUy0xJAorCQkJSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgc1BvcnRMQW5hbHlzaXNFQ2xhc3MsCi0gICAgICAgICAgICBJU1BvcnRMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAiU1BvcnRMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAhSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTUG9ydExBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICB0aGlzLmdldFNCbG9ja0xBbmFseXNpc19TUG9ydHNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAic0Jsb2NrTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNQb3J0TEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTUG9ydExBbmFseXNpc19TUG9ydCgpLAotICAgICAgICAgICAgdGhlRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlLmdldFNQb3J0KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNQb3J0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNQb3J0TEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTUG9ydExBbmFseXNpc19CYXNlX1BvcnQoKSwKLSAgICAgICAgICAgIHRoZVVNTFBhY2thZ2UuZ2V0UG9ydCgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJiYXNlX1BvcnQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU1BvcnRMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZSgKLSAgICAgICAgICAgIGdldFNQb3J0TEFuYWx5c2lzX1NEaXJlY3Rpb25MQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpLAotICAgICAgICAgICAgInNEaXJlY3Rpb25MQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU1BvcnRMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgIUlTX0lELAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzUG9ydExBbmFseXNpc0VDbGFzcywKKwkJCUlTUG9ydExBbmFseXNpcy5jbGFzcywKKwkJCSJTUG9ydExBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNQb3J0TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAorCQkJdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKSwKKwkJCSJzQmxvY2tMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1BvcnRMQW5hbHlzaXMuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNQb3J0TEFuYWx5c2lzX1NQb3J0KCksCisJCQl0aGVFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UuZ2V0U1BvcnQoKSwKKwkJCW51bGwsCisJCQkic1BvcnQiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1BvcnRMQW5hbHlzaXMuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNQb3J0TEFuYWx5c2lzX0Jhc2VfUG9ydCgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQb3J0KCksCisJCQludWxsLAorCQkJImJhc2VfUG9ydCIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTUG9ydExBbmFseXNpcy5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKAorCQkJZ2V0U1BvcnRMQW5hbHlzaXNfU0RpcmVjdGlvbkxBbmFseXNpcygpLAorCQkJdGhpcy5nZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCksCisJCQkic0RpcmVjdGlvbkxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTUG9ydExBbmFseXNpcy5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQkhSVNfSUQsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKIAotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lckVDbGFzcywKLSAgICAgICAgICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyLmNsYXNzLAotICAgICAgICAgICAgIkFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKSwKLSAgICAgICAgICAgICJzRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lci5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyRUNsYXNzLAorCQkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuY2xhc3MsCisJCQkiQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciIsIC8vJE5PTi1OTFMtMSQKKwkJCUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcl9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19Pd25lcigpLAorCQkJInNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyLmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKIAotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MsCi0gICAgICAgICAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAiQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAotICAgICAgICAgICAgdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAic0Jsb2NrTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmFpbHVyZU1vZGUoKSwKLSAgICAgICAgICAgIHRoZVNEeXNmdW5jdGlvbnNQYWNrYWdlLmdldFNGYWlsdXJlTW9kZSgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJzRmFpbHVyZU1vZGUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpLAotICAgICAgICAgICAgdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAib3duZXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOworCQlpbml0RUNsYXNzKAorCQkJYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNFQ2xhc3MsCisJCQlJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuY2xhc3MsCisJCQkiQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQlJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAorCQkJdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQkic0Jsb2NrTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc19TRmFpbHVyZU1vZGUoKSwKKwkJCXRoZVNEeXNmdW5jdGlvbnNQYWNrYWdlLmdldFNGYWlsdXJlTW9kZSgpLAorCQkJbnVsbCwKKwkJCSJzRmFpbHVyZU1vZGUiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCTEsCisJCQlJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpLAorCQkJbnVsbCwKKwkJCSJzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCisJCQludWxsLAorCQkJInNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfT3duZXIoKSwKKwkJCXRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQkib3duZXIiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRFQ2xhc3MsCi0gICAgICAgICAgICBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmNsYXNzLAotICAgICAgICAgICAgIkFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdGhpcy5nZXRTUHJvcGFnYXRpb25MaW5rKCksCi0gICAgICAgICAgICB0aGlzLmdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFNvdXJjZSgpLAotICAgICAgICAgICAgIm91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfSW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1Byb3BhZ2F0aW9uTGluaygpLAotICAgICAgICAgICAgdGhpcy5nZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKSwKLSAgICAgICAgICAgICJpblNQcm9wYWdhdGlvbkxpbmtzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCWFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEVDbGFzcywKKwkJCUlBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuY2xhc3MsCisJCQkiQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IiwgLy8kTk9OLU5MUy0xJAorCQkJSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCisJCQl0aGlzLmdldFNQcm9wYWdhdGlvbkxpbmsoKSwKKwkJCXRoaXMuZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50U291cmNlKCksCisJCQkib3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9JblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJdGhpcy5nZXRTUHJvcGFnYXRpb25MaW5rKCksCisJCQl0aGlzLmdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFRhcmdldCgpLAorCQkJImluU1Byb3BhZ2F0aW9uTGlua3NMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzUHJvcGFnYXRpb25MaW5rRUNsYXNzLAotICAgICAgICAgICAgSVNQcm9wYWdhdGlvbkxpbmsuY2xhc3MsCi0gICAgICAgICAgICAiU1Byb3BhZ2F0aW9uTGluayIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNQcm9wYWdhdGlvbkxpbmtfRWxlbWVudFRhcmdldCgpLAotICAgICAgICAgICAgdGhpcy5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X0luU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCi0gICAgICAgICAgICAiZWxlbWVudFRhcmdldCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTUHJvcGFnYXRpb25MaW5rLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTUHJvcGFnYXRpb25MaW5rX1NCbG9ja0xBbmFseXNpcygpLAotICAgICAgICAgICAgdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgInNCbG9ja0xBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTUHJvcGFnYXRpb25MaW5rLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTUHJvcGFnYXRpb25MaW5rX0Jhc2VfRGVwZW5kZW5jeSgpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXREZXBlbmRlbmN5KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgImJhc2VfRGVwZW5kZW5jeSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTUHJvcGFnYXRpb25MaW5rLmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRTb3VyY2UoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCksCi0gICAgICAgICAgICB0aGlzLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKLSAgICAgICAgICAgICJlbGVtZW50U291cmNlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNQcm9wYWdhdGlvbkxpbmsuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOworCQlpbml0RUNsYXNzKAorCQkJc1Byb3BhZ2F0aW9uTGlua0VDbGFzcywKKwkJCUlTUHJvcGFnYXRpb25MaW5rLmNsYXNzLAorCQkJIlNQcm9wYWdhdGlvbkxpbmsiLCAvLyROT04tTkxTLTEkCisJCQkhSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTUHJvcGFnYXRpb25MaW5rX0VsZW1lbnRUYXJnZXQoKSwKKwkJCXRoaXMuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KCksCisJCQl0aGlzLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9JblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJImVsZW1lbnRUYXJnZXQiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1Byb3BhZ2F0aW9uTGluay5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U1Byb3BhZ2F0aW9uTGlua19TQmxvY2tMQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNCbG9ja0xBbmFseXNpc19TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCSJzQmxvY2tMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1Byb3BhZ2F0aW9uTGluay5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U1Byb3BhZ2F0aW9uTGlua19CYXNlX0RlcGVuZGVuY3koKSwKKwkJCXRoZVVNTFBhY2thZ2UuZ2V0RGVwZW5kZW5jeSgpLAorCQkJbnVsbCwKKwkJCSJiYXNlX0RlcGVuZGVuY3kiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1Byb3BhZ2F0aW9uTGluay5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U1Byb3BhZ2F0aW9uTGlua19FbGVtZW50U291cmNlKCksCisJCQl0aGlzLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCisJCQkiZWxlbWVudFNvdXJjZSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTUHJvcGFnYXRpb25MaW5rLmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKIAotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgc0Jsb2NrTEFuYWx5c2lzRUNsYXNzLAotICAgICAgICAgICAgSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICJTQmxvY2tMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAhSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTQmxvY2tMQW5hbHlzaXNfU0Jsb2NrKCksCi0gICAgICAgICAgICB0aGVFU0ZBcmNoaXRlY3R1cmVDb25jZXB0c1BhY2thZ2UuZ2V0U0Jsb2NrKCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNCbG9jayIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTQmxvY2tMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNCbG9ja0xBbmFseXNpc19TRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCksCi0gICAgICAgICAgICB0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgICJzRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQb3J0c0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1BvcnRMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1BvcnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICAic1BvcnRzTEFuYWx5c2lzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTQmxvY2tMQW5hbHlzaXNfQmFzZV9DbGFzcygpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRDbGFzc18oKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9DbGFzcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTQmxvY2tMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgdGhpcy5nZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpLAotICAgICAgICAgICAgdGhpcy5nZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgICJzTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICAic0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCYXJyaWVyc0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0JhcnJpZXJMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICAic0JhcnJpZXJzTEFuYWx5c2lzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTQmxvY2tMQW5hbHlzaXNfU0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0xvY2FsQW5hbHlzaXNfU0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgICJzTG9jYWxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTQmxvY2tMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNCbG9ja0xBbmFseXNpc19TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1Byb3BhZ2F0aW9uTGluaygpLAotICAgICAgICAgICAgdGhpcy5nZXRTUHJvcGFnYXRpb25MaW5rX1NCbG9ja0xBbmFseXNpcygpLAotICAgICAgICAgICAgInNQcm9wYWdhdGlvbkxpbmtzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCXNCbG9ja0xBbmFseXNpc0VDbGFzcywKKwkJCUlTQmxvY2tMQW5hbHlzaXMuY2xhc3MsCisJCQkiU0Jsb2NrTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAorCQkJIUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCbG9jaygpLAorCQkJdGhlRVNGQXJjaGl0ZWN0dXJlQ29uY2VwdHNQYWNrYWdlLmdldFNCbG9jaygpLAorCQkJbnVsbCwKKwkJCSJzQmxvY2siLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAorCQkJIUlTX1RSQU5TSUVOVCwKKwkJCSFJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCksCisJCQl0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcygpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCisJCQkic0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTQmxvY2tMQW5hbHlzaXMuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNCbG9ja0xBbmFseXNpc19TUG9ydHNMQW5hbHlzaXNMaXN0KCksCisJCQl0aGlzLmdldFNQb3J0TEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNQb3J0TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAorCQkJInNQb3J0c0xBbmFseXNpc0xpc3QiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCS0xLAorCQkJSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0Jsb2NrTEFuYWx5c2lzX0Jhc2VfQ2xhc3MoKSwKKwkJCXRoZVVNTFBhY2thZ2UuZ2V0Q2xhc3NfKCksCisJCQludWxsLAorCQkJImJhc2VfQ2xhc3MiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAorCQkJIUlTX1RSQU5TSUVOVCwKKwkJCSFJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTQmxvY2tMQW5hbHlzaXNfU0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKSwKKwkJCXRoaXMuZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCisJCQkic0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCS0xLAorCQkJSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQl0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCksCisJCQl0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAorCQkJInNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTQmxvY2tMQW5hbHlzaXMuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNCbG9ja0xBbmFseXNpc19TQmFycmllcnNMQW5hbHlzaXNMaXN0KCksCisJCQl0aGlzLmdldFNCYXJyaWVyTEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAorCQkJInNCYXJyaWVyc0xBbmFseXNpc0xpc3QiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCS0xLAorCQkJSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2NhbEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNMb2NhbEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNMb2NhbEFuYWx5c2lzX1NCbG9ja3NMQW5hbHlzaXNMaXN0KCksCisJCQkic0xvY2FsQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCisJCQl0aGlzLmdldFNQcm9wYWdhdGlvbkxpbmsoKSwKKwkJCXRoaXMuZ2V0U1Byb3BhZ2F0aW9uTGlua19TQmxvY2tMQW5hbHlzaXMoKSwKKwkJCSJzUHJvcGFnYXRpb25MaW5rc0xpc3QiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCS0xLAorCQkJSVNCbG9ja0xBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0VDbGFzcywKLSAgICAgICAgICAgIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICAiQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudCgpLAotICAgICAgICAgICAgdGhlU0R5c2Z1bmN0aW9uc1BhY2thZ2UuZ2V0U0ZhaWx1cmVFdmVudCgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJzRmFpbHVyZUV2ZW50IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0QWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAotICAgICAgICAgICAgdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgInNCbG9ja0xBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOworCQlpbml0RUNsYXNzKAorCQkJYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzRUNsYXNzLAorCQkJSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5jbGFzcywKKwkJCSJBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQlJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldEFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc19TRmFpbHVyZUV2ZW50KCksCisJCQl0aGVTRHlzZnVuY3Rpb25zUGFja2FnZS5nZXRTRmFpbHVyZUV2ZW50KCksCisJCQludWxsLAorCQkJInNGYWlsdXJlRXZlbnQiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCTEsCisJCQlJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzLmNsYXNzLAorCQkJIUlTX1RSQU5TSUVOVCwKKwkJCSFJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNCbG9ja0xBbmFseXNpcygpLAorCQkJdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXNfU0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCksCisJCQkic0Jsb2NrTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzRUNsYXNzLAotICAgICAgICAgICAgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgIkFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICB0aGlzLmdldFNCbG9ja0xBbmFseXNpc19TTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgInNCbG9ja0xBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc0VDbGFzcywKKwkJCUlBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5jbGFzcywKKwkJCSJBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0QWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNfU0Jsb2NrTEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNCbG9ja0xBbmFseXNpcygpLAorCQkJdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXNfU0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKSwKKwkJCSJzQmxvY2tMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzQmFycmllckxBbmFseXNpc0VDbGFzcywKLSAgICAgICAgICAgIElTQmFycmllckxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICJTQmFycmllckxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNCYXJyaWVyTEFuYWx5c2lzX1NCYXJyaWVyKCksCi0gICAgICAgICAgICB0aGVTUmVjb21tZW5kYXRpb25zUGFja2FnZS5nZXRTQmFycmllcigpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJzQmFycmllciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTQmFycmllckxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0JhcnJpZXJMQW5hbHlzaXNfQmFzZV9Qcm9wZXJ0eSgpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJiYXNlX1Byb3BlcnR5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNCYXJyaWVyTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTQmFycmllckxBbmFseXNpc19TQmxvY2tMQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICB0aGlzLmdldFNCbG9ja0xBbmFseXNpc19TQmFycmllcnNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAic0Jsb2NrTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNCYXJyaWVyTEFuYWx5c2lzLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCXNCYXJyaWVyTEFuYWx5c2lzRUNsYXNzLAorCQkJSVNCYXJyaWVyTEFuYWx5c2lzLmNsYXNzLAorCQkJIlNCYXJyaWVyTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAorCQkJIUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0JhcnJpZXJMQW5hbHlzaXNfU0JhcnJpZXIoKSwKKwkJCXRoZVNSZWNvbW1lbmRhdGlvbnNQYWNrYWdlLmdldFNCYXJyaWVyKCksCisJCQludWxsLAorCQkJInNCYXJyaWVyIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQkxLAorCQkJSVNCYXJyaWVyTEFuYWx5c2lzLmNsYXNzLAorCQkJIUlTX1RSQU5TSUVOVCwKKwkJCSFJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTQmFycmllckxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCksCisJCQl0aGVVTUxQYWNrYWdlLmdldFByb3BlcnR5KCksCisJCQludWxsLAorCQkJImJhc2VfUHJvcGVydHkiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0JhcnJpZXJMQW5hbHlzaXMuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNCYXJyaWVyTEFuYWx5c2lzX1NCbG9ja0xBbmFseXNpcygpLAorCQkJdGhpcy5nZXRTQmxvY2tMQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCYXJyaWVyc0xBbmFseXNpc0xpc3QoKSwKKwkJCSJzQmxvY2tMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0JhcnJpZXJMQW5hbHlzaXMuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzTG9jYWxBbmFseXNpc0VDbGFzcywKLSAgICAgICAgICAgIElTTG9jYWxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICJTTG9jYWxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNMb2NhbEFuYWx5c2lzX0Jhc2VfUGFja2FnZSgpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgImJhc2VfUGFja2FnZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTTG9jYWxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0xvY2FsQW5hbHlzaXNfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgICJzU3lzdGVtRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTTG9jYWxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgICJzRmVhcmVkRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTTG9jYWxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0xvY2FsQW5hbHlzaXNfU0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKCksCi0gICAgICAgICAgICB0aGlzLmdldFNCbG9ja0xBbmFseXNpc19TTG9jYWxBbmFseXNpcygpLAotICAgICAgICAgICAgInNCbG9ja3NMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTTG9jYWxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzTG9jYWxBbmFseXNpc0VDbGFzcywKKwkJCUlTTG9jYWxBbmFseXNpcy5jbGFzcywKKwkJCSJTTG9jYWxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNMb2NhbEFuYWx5c2lzX0Jhc2VfUGFja2FnZSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksCisJCQludWxsLAorCQkJImJhc2VfUGFja2FnZSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTTG9jYWxBbmFseXNpcy5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0xvY2FsQW5hbHlzaXNfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKSwKKwkJCXRoaXMuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSwKKwkJCXRoaXMuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKKwkJCSJzU3lzdGVtRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkwLAorCQkJMSwKKwkJCUlTTG9jYWxBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKKwkJCSJzRmVhcmVkRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkwLAorCQkJMSwKKwkJCUlTTG9jYWxBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0xvY2FsQW5hbHlzaXNfU0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNCbG9ja0xBbmFseXNpc19TTG9jYWxBbmFseXNpcygpLAorCQkJInNCbG9ja3NMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTTG9jYWxBbmFseXNpcy5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIHNTeXN0ZW1FdmVudHNMaWJyYXJ5RUNsYXNzLAotICAgICAgICAgICAgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmNsYXNzLAotICAgICAgICAgICAgIlNTeXN0ZW1FdmVudHNMaWJyYXJ5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIUlTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfQmFzZV9QYWNrYWdlKCksCi0gICAgICAgICAgICB0aGVVTUxQYWNrYWdlLmdldFBhY2thZ2UoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9QYWNrYWdlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TU3lzdGVtRXZlbnRUeXBlc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1N5c3RlbUV2ZW50VHlwZSgpLAotICAgICAgICAgICAgdGhpcy5nZXRTU3lzdGVtRXZlbnRUeXBlX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCksCi0gICAgICAgICAgICAic1N5c3RlbUV2ZW50VHlwZXNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTU3lzdGVtRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0xvY2FsQW5hbHlzaXNfU1N5c3RlbUV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgICJzTG9jYWxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTU3lzdGVtRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzU3lzdGVtRXZlbnRzTGlicmFyeUVDbGFzcywKKwkJCUlTU3lzdGVtRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCSJTU3lzdGVtRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X0Jhc2VfUGFja2FnZSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksCisJCQludWxsLAorCQkJImJhc2VfUGFja2FnZSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTU3lzdGVtRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU1N5c3RlbUV2ZW50VHlwZXNMaXN0KCksCisJCQl0aGlzLmdldFNTeXN0ZW1FdmVudFR5cGUoKSwKKwkJCXRoaXMuZ2V0U1N5c3RlbUV2ZW50VHlwZV9TU3lzdGVtRXZlbnRzTGlicmFyeSgpLAorCQkJInNTeXN0ZW1FdmVudFR5cGVzTGlzdCIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkwLAorCQkJLTEsCisJCQlJU1N5c3RlbUV2ZW50c0xpYnJhcnkuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NMb2NhbEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNMb2NhbEFuYWx5c2lzKCksCisJCQl0aGlzLmdldFNMb2NhbEFuYWx5c2lzX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCksCisJCQkic0xvY2FsQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1N5c3RlbUV2ZW50c0xpYnJhcnkuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzU3lzdGVtRXZlbnRUeXBlRUNsYXNzLAotICAgICAgICAgICAgSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MsCi0gICAgICAgICAgICAiU1N5c3RlbUV2ZW50VHlwZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNTeXN0ZW1FdmVudFR5cGVfQmFzZV9DbGFzcygpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRDbGFzc18oKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9DbGFzcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTU3lzdGVtRXZlbnRUeXBlLmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTU3lzdGVtRXZlbnRUeXBlX1NGYWlsdXJlRXZlbnQoKSwKLSAgICAgICAgICAgIHRoZVNEeXNmdW5jdGlvbnNQYWNrYWdlLmdldFNGYWlsdXJlRXZlbnQoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAic0ZhaWx1cmVFdmVudCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTU3lzdGVtRXZlbnRUeXBlLmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTU3lzdGVtRXZlbnRUeXBlX0luc3RhbmNlc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U1N5c3RlbUV2ZW50KCksCi0gICAgICAgICAgICB0aGlzLmdldFNTeXN0ZW1FdmVudF9UeXBlKCksCi0gICAgICAgICAgICAiaW5zdGFuY2VzTGlzdCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICBJU1N5c3RlbUV2ZW50VHlwZS5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U1N5c3RlbUV2ZW50VHlwZV9TU3lzdGVtRXZlbnRzTGlicmFyeSgpLAotICAgICAgICAgICAgdGhpcy5nZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpLAotICAgICAgICAgICAgdGhpcy5nZXRTU3lzdGVtRXZlbnRzTGlicmFyeV9TU3lzdGVtRXZlbnRUeXBlc0xpc3QoKSwKLSAgICAgICAgICAgICJzU3lzdGVtRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTU3lzdGVtRXZlbnRUeXBlLmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCXNTeXN0ZW1FdmVudFR5cGVFQ2xhc3MsCisJCQlJU1N5c3RlbUV2ZW50VHlwZS5jbGFzcywKKwkJCSJTU3lzdGVtRXZlbnRUeXBlIiwgLy8kTk9OLU5MUy0xJAorCQkJIUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U1N5c3RlbUV2ZW50VHlwZV9CYXNlX0NsYXNzKCksCisJCQl0aGVVTUxQYWNrYWdlLmdldENsYXNzXygpLAorCQkJbnVsbCwKKwkJCSJiYXNlX0NsYXNzIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTeXN0ZW1FdmVudFR5cGVfU0ZhaWx1cmVFdmVudCgpLAorCQkJdGhlU0R5c2Z1bmN0aW9uc1BhY2thZ2UuZ2V0U0ZhaWx1cmVFdmVudCgpLAorCQkJbnVsbCwKKwkJCSJzRmFpbHVyZUV2ZW50IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQkxLAorCQkJSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTeXN0ZW1FdmVudFR5cGVfSW5zdGFuY2VzTGlzdCgpLAorCQkJdGhpcy5nZXRTU3lzdGVtRXZlbnQoKSwKKwkJCXRoaXMuZ2V0U1N5c3RlbUV2ZW50X1R5cGUoKSwKKwkJCSJpbnN0YW5jZXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTU3lzdGVtRXZlbnRUeXBlLmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTU3lzdGVtRXZlbnRUeXBlX1NTeXN0ZW1FdmVudHNMaWJyYXJ5KCksCisJCQl0aGlzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCksCisJCQl0aGlzLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NTeXN0ZW1FdmVudFR5cGVzTGlzdCgpLAorCQkJInNTeXN0ZW1FdmVudHNMaWJyYXJ5IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzU3lzdGVtRXZlbnRFQ2xhc3MsCi0gICAgICAgICAgICBJU1N5c3RlbUV2ZW50LmNsYXNzLAotICAgICAgICAgICAgIlNTeXN0ZW1FdmVudCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNTeXN0ZW1FdmVudF9CYXNlX1Byb3BlcnR5KCksCi0gICAgICAgICAgICB0aGVVTUxQYWNrYWdlLmdldFByb3BlcnR5KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgImJhc2VfUHJvcGVydHkiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU1N5c3RlbUV2ZW50LmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTU3lzdGVtRXZlbnRfVHlwZSgpLAotICAgICAgICAgICAgdGhpcy5nZXRTU3lzdGVtRXZlbnRUeXBlKCksCi0gICAgICAgICAgICB0aGlzLmdldFNTeXN0ZW1FdmVudFR5cGVfSW5zdGFuY2VzTGlzdCgpLAotICAgICAgICAgICAgInR5cGUiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU1N5c3RlbUV2ZW50LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCXNTeXN0ZW1FdmVudEVDbGFzcywKKwkJCUlTU3lzdGVtRXZlbnQuY2xhc3MsCisJCQkiU1N5c3RlbUV2ZW50IiwgLy8kTk9OLU5MUy0xJAorCQkJIUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U1N5c3RlbUV2ZW50X0Jhc2VfUHJvcGVydHkoKSwKKwkJCXRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKKwkJCW51bGwsCisJCQkiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTU3lzdGVtRXZlbnQuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTeXN0ZW1FdmVudF9UeXBlKCksCisJCQl0aGlzLmdldFNTeXN0ZW1FdmVudFR5cGUoKSwKKwkJCXRoaXMuZ2V0U1N5c3RlbUV2ZW50VHlwZV9JbnN0YW5jZXNMaXN0KCksCisJCQkidHlwZSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTU3lzdGVtRXZlbnQuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcywKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgICJTRmVhcmVkRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X0Jhc2VfUGFja2FnZSgpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgImJhc2VfUGFja2FnZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpLAotICAgICAgICAgICAgdGhpcy5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCksCi0gICAgICAgICAgICB0aGlzLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgICJzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCi0gICAgICAgICAgICB0aGlzLmdldFNGZWFyZWRFdmVudF9TRmVhcmVkRXZlbnRzTGlicmFyeSgpLAotICAgICAgICAgICAgInNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0xvY2FsQW5hbHlzaXMoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKLSAgICAgICAgICAgICJzTG9jYWxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzRmVhcmVkRXZlbnRzTGlicmFyeUVDbGFzcywKKwkJCUlTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCSJTRmVhcmVkRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X0Jhc2VfUGFja2FnZSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQYWNrYWdlKCksCisJCQludWxsLAorCQkJImJhc2VfUGFja2FnZSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpLAorCQkJdGhpcy5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5KCksCisJCQl0aGlzLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKKwkJCSJzRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCisJCQl0aGlzLmdldFNGZWFyZWRFdmVudF9TRmVhcmVkRXZlbnRzTGlicmFyeSgpLAorCQkJInNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnlfU0xvY2FsQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0U0xvY2FsQW5hbHlzaXMoKSwKKwkJCXRoaXMuZ2V0U0xvY2FsQW5hbHlzaXNfU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSwKKwkJCSJzTG9jYWxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIHNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsCi0gICAgICAgICAgICBJU0ZlYXJlZEV2ZW50c0ZhbWlseS5jbGFzcywKLSAgICAgICAgICAgICJTRmVhcmVkRXZlbnRzRmFtaWx5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIUlTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9CYXNlX0NsYXNzKCksCi0gICAgICAgICAgICB0aGVVTUxQYWNrYWdlLmdldENsYXNzXygpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJiYXNlX0NsYXNzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoCi0gICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X0lzU2VsZWN0ZWQoKSwKLSAgICAgICAgICAgIHRoZVR5cGVzUGFja2FnZS5nZXRCb29sZWFuKCksCi0gICAgICAgICAgICAiaXNTZWxlY3RlZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJmYWxzZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgICFJU19JRCwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TdWJGYW1pbGllc0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJzdWJGYW1pbGllc0xpc3QiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNGYW1pbHlfQWxsU0ZlYXJlZEV2ZW50c0xpc3QoKSwKLSAgICAgICAgICAgIHRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgImFsbFNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICB0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCksCi0gICAgICAgICAgICB0aGlzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCksCi0gICAgICAgICAgICB0aGlzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSwKLSAgICAgICAgICAgICJzRmVhcmVkRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCXNGZWFyZWRFdmVudHNGYW1pbHlFQ2xhc3MsCisJCQlJU0ZlYXJlZEV2ZW50c0ZhbWlseS5jbGFzcywKKwkJCSJTRmVhcmVkRXZlbnRzRmFtaWx5IiwgLy8kTk9OLU5MUy0xJAorCQkJIUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9CYXNlX0NsYXNzKCksCisJCQl0aGVVTUxQYWNrYWdlLmdldENsYXNzXygpLAorCQkJbnVsbCwKKwkJCSJiYXNlX0NsYXNzIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCisJCQludWxsLAorCQkJInNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoCisJCQlnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X0lzU2VsZWN0ZWQoKSwKKwkJCXRoZVR5cGVzUGFja2FnZS5nZXRCb29sZWFuKCksCisJCQkiaXNTZWxlY3RlZCIsIC8vJE5PTi1OTFMtMSQKKwkJCSJmYWxzZSIsIC8vJE5PTi1OTFMtMSQKKwkJCTEsCisJCQkxLAorCQkJSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCSFJU19JRCwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TdWJGYW1pbGllc0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseSgpLAorCQkJbnVsbCwKKwkJCSJzdWJGYW1pbGllc0xpc3QiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCS0xLAorCQkJSVNGZWFyZWRFdmVudHNGYW1pbHkuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNGZWFyZWRFdmVudHNGYW1pbHlfQWxsU0ZlYXJlZEV2ZW50c0xpc3QoKSwKKwkJCXRoaXMuZ2V0U0ZlYXJlZEV2ZW50KCksCisJCQludWxsLAorCQkJImFsbFNGZWFyZWRFdmVudHNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQl0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCksCisJCQludWxsLAorCQkJInNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCksCisJCQl0aGlzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCksCisJCQl0aGlzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSwKKwkJCSJzRmVhcmVkRXZlbnRzTGlicmFyeSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKIAotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgc0ZlYXJlZEV2ZW50RUNsYXNzLAotICAgICAgICAgICAgSVNGZWFyZWRFdmVudC5jbGFzcywKLSAgICAgICAgICAgICJTRmVhcmVkRXZlbnQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAhSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoCi0gICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRfSXNTZWxlY3RlZCgpLAotICAgICAgICAgICAgdGhlVHlwZXNQYWNrYWdlLmdldEJvb2xlYW4oKSwKLSAgICAgICAgICAgICJpc1NlbGVjdGVkIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImZhbHNlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU0ZlYXJlZEV2ZW50LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICAhSVNfSUQsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudF9CYXNlX0NsYXNzKCksCi0gICAgICAgICAgICB0aGVVTUxQYWNrYWdlLmdldENsYXNzXygpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJiYXNlX0NsYXNzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNGZWFyZWRFdmVudC5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICB0aGlzLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTRmVhcmVkRXZlbnQuY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudF9TRmVhcmVkRXZlbnRzTGlicmFyeSgpLAotICAgICAgICAgICAgdGhpcy5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpLAotICAgICAgICAgICAgdGhpcy5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzTGlzdCgpLAotICAgICAgICAgICAgInNGZWFyZWRFdmVudHNMaWJyYXJ5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNGZWFyZWRFdmVudC5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzRmVhcmVkRXZlbnRFQ2xhc3MsCisJCQlJU0ZlYXJlZEV2ZW50LmNsYXNzLAorCQkJIlNGZWFyZWRFdmVudCIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZSgKKwkJCWdldFNGZWFyZWRFdmVudF9Jc1NlbGVjdGVkKCksCisJCQl0aGVUeXBlc1BhY2thZ2UuZ2V0Qm9vbGVhbigpLAorCQkJImlzU2VsZWN0ZWQiLCAvLyROT04tTkxTLTEkCisJCQkiZmFsc2UiLCAvLyROT04tTkxTLTEkCisJCQkxLAorCQkJMSwKKwkJCUlTRmVhcmVkRXZlbnQuY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCSFJU19JRCwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50X0Jhc2VfQ2xhc3MoKSwKKwkJCXRoZVVNTFBhY2thZ2UuZ2V0Q2xhc3NfKCksCisJCQludWxsLAorCQkJImJhc2VfQ2xhc3MiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0ZlYXJlZEV2ZW50LmNsYXNzLAorCQkJIUlTX1RSQU5TSUVOVCwKKwkJCSFJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTRmVhcmVkRXZlbnRfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSwKKwkJCXRoaXMuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSwKKwkJCW51bGwsCisJCQkic0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMCwKKwkJCS0xLAorCQkJSVNGZWFyZWRFdmVudC5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0ZlYXJlZEV2ZW50X1NGZWFyZWRFdmVudHNMaWJyYXJ5KCksCisJCQl0aGlzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCksCisJCQl0aGlzLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNMaXN0KCksCisJCQkic0ZlYXJlZEV2ZW50c0xpYnJhcnkiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0ZlYXJlZEV2ZW50LmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKIAotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcywKLSAgICAgICAgICAgIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmNsYXNzLAotICAgICAgICAgICAgIlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAhSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoCi0gICAgICAgICAgICBnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZUxBbmFseXNpcygpLAotICAgICAgICAgICAgdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJzRmFpbHVyZU1vZGVMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcywKLSAgICAgICAgICAgIElTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgIElTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgIElTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9CYXNlX0Nvbm5lY3RvcigpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRDb25uZWN0b3IoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9Db25uZWN0b3IiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVPd25lcigpLAotICAgICAgICAgICAgdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgInNGYWlsdXJlTW9kZU93bmVyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uY2xhc3MsCi0gICAgICAgICAgICBJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICBJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOworCQlpbml0RUNsYXNzKAorCQkJc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkVDbGFzcywKKwkJCUlTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmNsYXNzLAorCQkJIlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24iLCAvLyROT04tTkxTLTEkCisJCQkhSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uX1NGYWlsdXJlTW9kZUxBbmFseXNpcygpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpLAorCQkJbnVsbCwKKwkJCSJzRmFpbHVyZU1vZGVMQW5hbHlzaXMiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcywKKwkJCUlTX1RSQU5TSUVOVCwKKwkJCUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9CYXNlX0Nvbm5lY3RvcigpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRDb25uZWN0b3IoKSwKKwkJCW51bGwsCisJCQkiYmFzZV9Db25uZWN0b3IiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbl9TRmFpbHVyZU1vZGVPd25lcigpLAorCQkJdGhpcy5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKCksCisJCQludWxsLAorCQkJInNGYWlsdXJlTW9kZU93bmVyIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uY2xhc3MsCisJCQlJU19UUkFOU0lFTlQsCisJCQlJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzQW5kR2F0ZUxBbmFseXNpc0VDbGFzcywKLSAgICAgICAgICAgIElTQW5kR2F0ZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICJTQW5kR2F0ZUxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNBbmRHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKSwKLSAgICAgICAgICAgIHRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTQW5kR2F0ZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzQW5kR2F0ZUxBbmFseXNpc0VDbGFzcywKKwkJCUlTQW5kR2F0ZUxBbmFseXNpcy5jbGFzcywKKwkJCSJTQW5kR2F0ZUxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNBbmRHYXRlTEFuYWx5c2lzX0Jhc2VfUHJvcGVydHkoKSwKKwkJCXRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKKwkJCW51bGwsCisJCQkiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTQW5kR2F0ZUxBbmFseXNpcy5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIHNPckdhdGVMQW5hbHlzaXNFQ2xhc3MsCi0gICAgICAgICAgICBJU09yR2F0ZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICJTT3JHYXRlTEFuYWx5c2lzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIUlTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U09yR2F0ZUxBbmFseXNpc19CYXNlX1Byb3BlcnR5KCksCi0gICAgICAgICAgICB0aGVVTUxQYWNrYWdlLmdldFByb3BlcnR5KCksCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgImJhc2VfUHJvcGVydHkiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU09yR2F0ZUxBbmFseXNpcy5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzT3JHYXRlTEFuYWx5c2lzRUNsYXNzLAorCQkJSVNPckdhdGVMQW5hbHlzaXMuY2xhc3MsCisJCQkiU09yR2F0ZUxBbmFseXNpcyIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNPckdhdGVMQW5hbHlzaXNfQmFzZV9Qcm9wZXJ0eSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLAorCQkJbnVsbCwKKwkJCSJiYXNlX1Byb3BlcnR5IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNPckdhdGVMQW5hbHlzaXMuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOwogCi0gICAgICAgIGluaXRFQ2xhc3MoCi0gICAgICAgICAgICBzVW50aW1lbHlGYWlsdXJlTW9kZUVDbGFzcywKLSAgICAgICAgICAgIElTVW50aW1lbHlGYWlsdXJlTW9kZS5jbGFzcywKLSAgICAgICAgICAgICJTVW50aW1lbHlGYWlsdXJlTW9kZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICFJU19BQlNUUkFDVCwKLSAgICAgICAgICAgICFJU19JTlRFUkZBQ0UsCi0gICAgICAgICAgICBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNVbnRpbWVseUZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKSwKLSAgICAgICAgICAgIHRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTVW50aW1lbHlGYWlsdXJlTW9kZS5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoCisJCQlzVW50aW1lbHlGYWlsdXJlTW9kZUVDbGFzcywKKwkJCUlTVW50aW1lbHlGYWlsdXJlTW9kZS5jbGFzcywKKwkJCSJTVW50aW1lbHlGYWlsdXJlTW9kZSIsIC8vJE5PTi1OTFMtMSQKKwkJCSFJU19BQlNUUkFDVCwKKwkJCSFJU19JTlRFUkZBQ0UsCisJCQlJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNVbnRpbWVseUZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKSwKKwkJCXRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKKwkJCW51bGwsCisJCQkiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKKwkJCW51bGwsCisJCQkxLAorCQkJMSwKKwkJCUlTVW50aW1lbHlGYWlsdXJlTW9kZS5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIHNBYnNlbnRGYWlsdXJlTW9kZUVDbGFzcywKLSAgICAgICAgICAgIElTQWJzZW50RmFpbHVyZU1vZGUuY2xhc3MsCi0gICAgICAgICAgICAiU0Fic2VudEZhaWx1cmVNb2RlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIUlTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0Fic2VudEZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKSwKLSAgICAgICAgICAgIHRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTQWJzZW50RmFpbHVyZU1vZGUuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOworCQlpbml0RUNsYXNzKAorCQkJc0Fic2VudEZhaWx1cmVNb2RlRUNsYXNzLAorCQkJSVNBYnNlbnRGYWlsdXJlTW9kZS5jbGFzcywKKwkJCSJTQWJzZW50RmFpbHVyZU1vZGUiLCAvLyROT04tTkxTLTEkCisJCQkhSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTQWJzZW50RmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLAorCQkJbnVsbCwKKwkJCSJiYXNlX1Byb3BlcnR5IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNBYnNlbnRGYWlsdXJlTW9kZS5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIHNFcnJvbmVvdXNGYWlsdXJlTW9kZUVDbGFzcywKLSAgICAgICAgICAgIElTRXJyb25lb3VzRmFpbHVyZU1vZGUuY2xhc3MsCi0gICAgICAgICAgICAiU0Vycm9uZW91c0ZhaWx1cmVNb2RlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIUlTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0Vycm9uZW91c0ZhaWx1cmVNb2RlX0Jhc2VfUHJvcGVydHkoKSwKLSAgICAgICAgICAgIHRoZVVNTFBhY2thZ2UuZ2V0UHJvcGVydHkoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAiYmFzZV9Qcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIElTRXJyb25lb3VzRmFpbHVyZU1vZGUuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOworCQlpbml0RUNsYXNzKAorCQkJc0Vycm9uZW91c0ZhaWx1cmVNb2RlRUNsYXNzLAorCQkJSVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5jbGFzcywKKwkJCSJTRXJyb25lb3VzRmFpbHVyZU1vZGUiLCAvLyROT04tTkxTLTEkCisJCQkhSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoCisJCQlnZXRTRXJyb25lb3VzRmFpbHVyZU1vZGVfQmFzZV9Qcm9wZXJ0eSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLAorCQkJbnVsbCwKKwkJCSJiYXNlX1Byb3BlcnR5IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgaW5pdEVDbGFzcygKLSAgICAgICAgICAgIHNMb2NhbEV2ZW50RUNsYXNzLAotICAgICAgICAgICAgSVNMb2NhbEV2ZW50LmNsYXNzLAotICAgICAgICAgICAgIlNMb2NhbEV2ZW50IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIUlTX0FCU1RSQUNULAotICAgICAgICAgICAgIUlTX0lOVEVSRkFDRSwKLSAgICAgICAgICAgIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKAotICAgICAgICAgICAgZ2V0U0xvY2FsRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpLAotICAgICAgICAgICAgdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJiYXNlX1Byb3BlcnR5IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNMb2NhbEV2ZW50LmNsYXNzLAotICAgICAgICAgICAgIUlTX1RSQU5TSUVOVCwKLSAgICAgICAgICAgICFJU19WT0xBVElMRSwKLSAgICAgICAgICAgIElTX0NIQU5HRUFCTEUsCi0gICAgICAgICAgICAhSVNfQ09NUE9TSVRFLAotICAgICAgICAgICAgSVNfUkVTT0xWRV9QUk9YSUVTLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICAhSVNfREVSSVZFRCwKLSAgICAgICAgICAgICFJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcygKKwkJCXNMb2NhbEV2ZW50RUNsYXNzLAorCQkJSVNMb2NhbEV2ZW50LmNsYXNzLAorCQkJIlNMb2NhbEV2ZW50IiwgLy8kTk9OLU5MUy0xJAorCQkJIUlTX0FCU1RSQUNULAorCQkJIUlTX0lOVEVSRkFDRSwKKwkJCUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKAorCQkJZ2V0U0xvY2FsRXZlbnRfQmFzZV9Qcm9wZXJ0eSgpLAorCQkJdGhlVU1MUGFja2FnZS5nZXRQcm9wZXJ0eSgpLAorCQkJbnVsbCwKKwkJCSJiYXNlX1Byb3BlcnR5IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNMb2NhbEV2ZW50LmNsYXNzLAorCQkJIUlTX1RSQU5TSUVOVCwKKwkJCSFJU19WT0xBVElMRSwKKwkJCUlTX0NIQU5HRUFCTEUsCisJCQkhSVNfQ09NUE9TSVRFLAorCQkJSVNfUkVTT0xWRV9QUk9YSUVTLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQlJU19VTklRVUUsCisJCQkhSVNfREVSSVZFRCwKKwkJCSFJU19PUkRFUkVEKTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotICAgICAgICBpbml0RUVudW0oc0RpcmVjdGlvbkxBbmFseXNpc0VFbnVtLCBTRGlyZWN0aW9uTEFuYWx5c2lzLmNsYXNzLCAiU0RpcmVjdGlvbkxBbmFseXNpcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEVFbnVtTGl0ZXJhbChzRGlyZWN0aW9uTEFuYWx5c2lzRUVudW0sIFNEaXJlY3Rpb25MQW5hbHlzaXMuSU4pOwotICAgICAgICBhZGRFRW51bUxpdGVyYWwoc0RpcmVjdGlvbkxBbmFseXNpc0VFbnVtLCBTRGlyZWN0aW9uTEFuYWx5c2lzLk9VVCk7Ci0gICAgICAgIGFkZEVFbnVtTGl0ZXJhbChzRGlyZWN0aW9uTEFuYWx5c2lzRUVudW0sIFNEaXJlY3Rpb25MQW5hbHlzaXMuVU5ERUZJTkVEKTsKKwkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKKwkJaW5pdEVFbnVtKHNEaXJlY3Rpb25MQW5hbHlzaXNFRW51bSwgU0RpcmVjdGlvbkxBbmFseXNpcy5jbGFzcywgIlNEaXJlY3Rpb25MQW5hbHlzaXMiKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFRW51bUxpdGVyYWwoc0RpcmVjdGlvbkxBbmFseXNpc0VFbnVtLCBTRGlyZWN0aW9uTEFuYWx5c2lzLklOKTsKKwkJYWRkRUVudW1MaXRlcmFsKHNEaXJlY3Rpb25MQW5hbHlzaXNFRW51bSwgU0RpcmVjdGlvbkxBbmFseXNpcy5PVVQpOworCQlhZGRFRW51bUxpdGVyYWwoc0RpcmVjdGlvbkxBbmFseXNpc0VFbnVtLCBTRGlyZWN0aW9uTEFuYWx5c2lzLlVOREVGSU5FRCk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIGFubm90YXRpb25zCi0gICAgICAgIC8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwKLSAgICAgICAgY3JlYXRlVU1MQW5ub3RhdGlvbnMoKTsKLSAgICB9CisJCS8vIENyZWF0ZSBhbm5vdGF0aW9ucworCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MCisJCWNyZWF0ZVVNTEFubm90YXRpb25zKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MPC9iPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVTUxBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRBbm5vdGF0aW9uKHRoaXMsIHNvdXJjZSwgbmV3IFN0cmluZ1tdIHsib3JpZ2luYWxOYW1lIiwgIkVTRkxvY2FsQW5hbHlzaXMiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9KTsKLSAgICAgICAgYWRkQW5ub3RhdGlvbigKLSAgICAgICAgICAgIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb25FQ2xhc3MsCi0gICAgICAgICAgICBzb3VyY2UsCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyJvcmlnaW5hbE5hbWUiLCAiU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgfSk7Ci0gICAgfQorCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTDwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVU1MQW5ub3RhdGlvbnMoKSB7CisJCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI7IC8vJE5PTi1OTFMtMSQKKwkJYWRkQW5ub3RhdGlvbih0aGlzLCBzb3VyY2UsIG5ldyBTdHJpbmdbXSB7Im9yaWdpbmFsTmFtZSIsICJFU0ZMb2NhbEFuYWx5c2lzIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfSk7CisJCWFkZEFubm90YXRpb24oCisJCQlzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uRUNsYXNzLAorCQkJc291cmNlLAorCQkJbmV3IFN0cmluZ1tdIHsib3JpZ2luYWxOYW1lIiwgIlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0pOworCX0KIAogfSAvLyBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NBYnNlbnRGYWlsdXJlTW9kZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCmluZGV4IGQyODZmYWYuLmI3YjY1NzggMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TQWJzZW50RmFpbHVyZU1vZGUuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0Fic2VudEZhaWx1cmVNb2RlLmphdmEKQEAgLTM2LDE1NiArMzYsMTU2IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBTQWJzZW50RmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgaW1wbGVtZW50cyBJU0Fic2VudEZhaWx1cmVNb2RlIHsKKwlleHRlbmRzIEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJaW1wbGVtZW50cyBJU0Fic2VudEZhaWx1cmVNb2RlIHsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9Qcm9wZXJ0eSgpIDxlbT5CYXNlIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHkgYmFzZV9Qcm9wZXJ0eTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTQWJzZW50RmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTQWJzZW50RmFpbHVyZU1vZGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0FCU0VOVF9GQUlMVVJFX01PREU7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNBQlNFTlRfRkFJTFVSRV9NT0RFOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OwotICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKLSAgICAgICAgICAgIGlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Qcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgeworCQlpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OworCQkJYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKKwkJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCisJCQkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJCQliYXNlX1Byb3BlcnR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBiYXNpY0dldEJhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiBiYXNlX1Byb3BlcnR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgewotICAgICAgICBQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfUHJvcGVydHkpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7CisJCVByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OworCQliYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQUJTRU5UX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSwKKwkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBQlNFTlRfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX1Byb3BlcnR5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQUJTRU5UX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBQlNFTlRfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBQlNFTlRfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5ICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNBYnNlbnRGYWlsdXJlTW9kZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NBbmRHYXRlTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0FuZEdhdGVMQW5hbHlzaXMuamF2YQppbmRleCA1YzEyZjY0Li44ZGE5MDBiIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0FuZEdhdGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0FuZEdhdGVMQW5hbHlzaXMuamF2YQpAQCAtMzYsMTU2ICszNiwxNTYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIFNBbmRHYXRlTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcwotICAgIGltcGxlbWVudHMgSVNBbmRHYXRlTEFuYWx5c2lzIHsKKwlleHRlbmRzIEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCisJaW1wbGVtZW50cyBJU0FuZEdhdGVMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9Qcm9wZXJ0eSgpIDxlbT5CYXNlIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHkgYmFzZV9Qcm9wZXJ0eTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1Byb3BlcnR5KCkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eSBiYXNlX1Byb3BlcnR5OwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNBbmRHYXRlTEFuYWx5c2lzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0FuZEdhdGVMQW5hbHlzaXMoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0FORF9HQVRFX0xBTkFMWVNJUzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0FORF9HQVRFX0xBTkFMWVNJUzsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgaWYgKGJhc2VfUHJvcGVydHkgIT0gbnVsbCAmJiBiYXNlX1Byb3BlcnR5LmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX1Byb3BlcnR5ID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgICAgIGJhc2VfUHJvcGVydHkgPSAoUHJvcGVydHkpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9Qcm9wZXJ0eSk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBvbGRCYXNlX1Byb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBTkRfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Qcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgeworCQlpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OworCQkJYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKKwkJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FORF9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSwKKwkJCQkJCQlvbGRCYXNlX1Byb3BlcnR5LAorCQkJCQkJCWJhc2VfUHJvcGVydHkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7Ci0gICAgICAgIFByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OwotICAgICAgICBiYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgeworCQlQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKKwkJYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FORF9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSwKKwkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBTkRfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCYXNlX1Byb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FORF9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FORF9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKKwkJCQlzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBTkRfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQU5EX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgorCQkJCXJldHVybiBiYXNlX1Byb3BlcnR5ICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTQW5kR2F0ZUxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NCYXJyaWVyTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0JhcnJpZXJMQW5hbHlzaXMuamF2YQppbmRleCBlNTQ0NzJmLi41YjNkNDQ2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0JhcnJpZXJMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0JhcnJpZXJMQW5hbHlzaXMuamF2YQpAQCAtNDIsMjgyICs0MiwyODIgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIFNCYXJyaWVyTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCi0gICAgaW1wbGVtZW50cyBJU0JhcnJpZXJMQW5hbHlzaXMgeworCWV4dGVuZHMgQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcgorCWltcGxlbWVudHMgSVNCYXJyaWVyTEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNCYXJyaWVyKCkgPGVtPlNCYXJyaWVyPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRTQmFycmllcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTQmFycmllciBzQmFycmllcjsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTQmFycmllcigpIDxlbT5TQmFycmllcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0U0JhcnJpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJU0JhcnJpZXIgc0JhcnJpZXI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1Byb3BlcnR5KCkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBQcm9wZXJ0eSBiYXNlX1Byb3BlcnR5OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0JhcnJpZXJMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTQmFycmllckxBbmFseXNpcygpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TQkFSUklFUl9MQU5BTFlTSVM7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNCQVJSSUVSX0xBTkFMWVNJUzsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCYXJyaWVyIGdldFNCYXJyaWVyKCkgewotICAgICAgICBpZiAoc0JhcnJpZXIgIT0gbnVsbCAmJiBzQmFycmllci5lSXNQcm94eSgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkU0JhcnJpZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBzQmFycmllcjsKLSAgICAgICAgICAgIHNCYXJyaWVyID0gKElTQmFycmllcikgZVJlc29sdmVQcm94eShvbGRTQmFycmllcik7Ci0gICAgICAgICAgICBpZiAoc0JhcnJpZXIgIT0gb2xkU0JhcnJpZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JBUlJJRVJfTEFOQUxZU0lTX19TQkFSUklFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTQmFycmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQmFycmllcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzQmFycmllcjsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmFycmllciBnZXRTQmFycmllcigpIHsKKwkJaWYgKHNCYXJyaWVyICE9IG51bGwgJiYgc0JhcnJpZXIuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNCYXJyaWVyID0gKEludGVybmFsRU9iamVjdCkgc0JhcnJpZXI7CisJCQlzQmFycmllciA9IChJU0JhcnJpZXIpIGVSZXNvbHZlUHJveHkob2xkU0JhcnJpZXIpOworCQkJaWYgKHNCYXJyaWVyICE9IG9sZFNCYXJyaWVyKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KAorCQkJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCisJCQkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVIsCisJCQkJCQkJb2xkU0JhcnJpZXIsCisJCQkJCQkJc0JhcnJpZXIpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc0JhcnJpZXI7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmFycmllciBiYXNpY0dldFNCYXJyaWVyKCkgewotICAgICAgICByZXR1cm4gc0JhcnJpZXI7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0JhcnJpZXIgYmFzaWNHZXRTQmFycmllcigpIHsKKwkJcmV0dXJuIHNCYXJyaWVyOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNCYXJyaWVyKElTQmFycmllciBuZXdTQmFycmllcikgewotICAgICAgICBJU0JhcnJpZXIgb2xkU0JhcnJpZXIgPSBzQmFycmllcjsKLSAgICAgICAgc0JhcnJpZXIgPSBuZXdTQmFycmllcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX1NCQVJSSUVSLAotICAgICAgICAgICAgICAgICAgICBvbGRTQmFycmllciwKLSAgICAgICAgICAgICAgICAgICAgc0JhcnJpZXIpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0JhcnJpZXIoSVNCYXJyaWVyIG5ld1NCYXJyaWVyKSB7CisJCUlTQmFycmllciBvbGRTQmFycmllciA9IHNCYXJyaWVyOworCQlzQmFycmllciA9IG5ld1NCYXJyaWVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KAorCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJdGhpcywKKwkJCQkJTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVIsCisJCQkJCW9sZFNCYXJyaWVyLAorCQkJCQlzQmFycmllcikpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OwotICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKLSAgICAgICAgICAgIGlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JBUlJJRVJfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpIHsKKwkJaWYgKGJhc2VfUHJvcGVydHkgIT0gbnVsbCAmJiBiYXNlX1Byb3BlcnR5LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRCYXNlX1Byb3BlcnR5ID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9Qcm9wZXJ0eTsKKwkJCWJhc2VfUHJvcGVydHkgPSAoUHJvcGVydHkpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9Qcm9wZXJ0eSk7CisJCQlpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBvbGRCYXNlX1Byb3BlcnR5KSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KAorCQkJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCisJCQkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSwKKwkJCQkJCQlvbGRCYXNlX1Byb3BlcnR5LAorCQkJCQkJCWJhc2VfUHJvcGVydHkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7Ci0gICAgICAgIFByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OwotICAgICAgICBiYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfUHJvcGVydHkpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7CisJCVByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OworCQliYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFksCisJCQkJCW9sZEJhc2VfUHJvcGVydHksCisJCQkJCWJhc2VfUHJvcGVydHkpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIElTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNCbG9ja0xBbmFseXNpcyAhPSBudWxsICYmIHNCbG9ja0xBbmFseXNpcy5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJU0Jsb2NrTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNCbG9ja0xBbmFseXNpcykKLSAgICAgICAgICAgIDogc0Jsb2NrTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7CisJCUlTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHNCbG9ja0xBbmFseXNpcyAhPSBudWxsICYmIHNCbG9ja0xBbmFseXNpcy5lSXNQcm94eSgpCisJCQk/IChJU0Jsb2NrTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNCbG9ja0xBbmFseXNpcykKKwkJCTogc0Jsb2NrTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgbmV3U0Jsb2NrTEFuYWx5c2lzKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTQmxvY2sgTEFuYWx5c2lzJyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIG5ld1NCbG9ja0xBbmFseXNpcykgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTQmFycmllcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNCYXJyaWVyKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCYXNlX1Byb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JBUlJJRVJfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRTQmFycmllcigpOworCQkJCXJldHVybiBiYXNpY0dldFNCYXJyaWVyKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX1Byb3BlcnR5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JBUlJJRVJfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6Ci0gICAgICAgICAgICAgICAgc2V0U0JhcnJpZXIoKElTQmFycmllcikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6CisJCQkJc2V0U0JhcnJpZXIoKElTQmFycmllcikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKKwkJCQlzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JBUlJJRVJfTEFOQUxZU0lTX19TQkFSUklFUjoKLSAgICAgICAgICAgICAgICBzZXRTQmFycmllcigoSVNCYXJyaWVyKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6CisJCQkJc2V0U0JhcnJpZXIoKElTQmFycmllcikgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JBUlJJRVJfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJc2V0U0Jsb2NrTEFuYWx5c2lzKChJU0Jsb2NrTEFuYWx5c2lzKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNCYXJyaWVyICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JBUlJJRVI6CisJCQkJcmV0dXJuIHNCYXJyaWVyICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlyZXR1cm4gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CiAKIH0gLy8gU0JhcnJpZXJMQW5hbHlzaXMKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TQmxvY2tMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TQmxvY2tMQW5hbHlzaXMuamF2YQppbmRleCBmNzI3MGZlLi43ZTVlOGI0IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0Jsb2NrTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NCbG9ja0xBbmFseXNpcy5qYXZhCkBAIC02MSw0MjIgKzYxLDQyMiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU0Jsb2NrTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAotICAgIGltcGxlbWVudHMgSVNCbG9ja0xBbmFseXNpcyB7CisJZXh0ZW5kcyBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAorCWltcGxlbWVudHMgSVNCbG9ja0xBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTQmxvY2soKSA8ZW0+U0Jsb2NrPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRTQmxvY2soKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBJU0Jsb2NrIHNCbG9jazsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTQmxvY2soKSA8ZW0+U0Jsb2NrPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRTQmxvY2soKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJU0Jsb2NrIHNCbG9jazsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfQ2xhc3MoKSA8ZW0+QmFzZSBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2VfQ2xhc3M7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9DbGFzcygpIDxlbT5CYXNlIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzZV9DbGFzczsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTQmxvY2tMQW5hbHlzaXMoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0JMT0NLX0xBTkFMWVNJUzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0JMT0NLX0xBTkFMWVNJUzsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9jayBnZXRTQmxvY2soKSB7Ci0gICAgICAgIGlmIChzQmxvY2sgIT0gbnVsbCAmJiBzQmxvY2suZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZFNCbG9jayA9IChJbnRlcm5hbEVPYmplY3QpIHNCbG9jazsKLSAgICAgICAgICAgIHNCbG9jayA9IChJU0Jsb2NrKSBlUmVzb2x2ZVByb3h5KG9sZFNCbG9jayk7Ci0gICAgICAgICAgICBpZiAoc0Jsb2NrICE9IG9sZFNCbG9jaykgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU0Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCbG9jaykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzQmxvY2s7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0Jsb2NrIGdldFNCbG9jaygpIHsKKwkJaWYgKHNCbG9jayAhPSBudWxsICYmIHNCbG9jay5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU0Jsb2NrID0gKEludGVybmFsRU9iamVjdCkgc0Jsb2NrOworCQkJc0Jsb2NrID0gKElTQmxvY2spIGVSZXNvbHZlUHJveHkob2xkU0Jsb2NrKTsKKwkJCWlmIChzQmxvY2sgIT0gb2xkU0Jsb2NrKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KAorCQkJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCisJCQkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NCTE9DSywKKwkJCQkJCQlvbGRTQmxvY2ssCisJCQkJCQkJc0Jsb2NrKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNCbG9jazsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9jayBiYXNpY0dldFNCbG9jaygpIHsKLSAgICAgICAgcmV0dXJuIHNCbG9jazsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmxvY2sgYmFzaWNHZXRTQmxvY2soKSB7CisJCXJldHVybiBzQmxvY2s7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0Jsb2NrKElTQmxvY2sgbmV3U0Jsb2NrKSB7Ci0gICAgICAgIElTQmxvY2sgb2xkU0Jsb2NrID0gc0Jsb2NrOwotICAgICAgICBzQmxvY2sgPSBuZXdTQmxvY2s7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JMT0NLLAotICAgICAgICAgICAgICAgICAgICBvbGRTQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgIHNCbG9jaykpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTQmxvY2soSVNCbG9jayBuZXdTQmxvY2spIHsKKwkJSVNCbG9jayBvbGRTQmxvY2sgPSBzQmxvY2s7CisJCXNCbG9jayA9IG5ld1NCbG9jazsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0ssCisJCQkJCW9sZFNCbG9jaywKKwkJCQkJc0Jsb2NrKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+IGdldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIEV2ZW50cyBMQW5hbHlzaXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzPiBnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmFpbHVyZSBFdmVudHMgTEFuYWx5c2lzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJU1BvcnRMQW5hbHlzaXM+IGdldFNQb3J0c0xBbmFseXNpc0xpc3QoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTUG9ydHMgTEFuYWx5c2lzIExpc3QnIHJlZmVyZW5jZSBsaXN0Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SVNQb3J0TEFuYWx5c2lzPiBnZXRTUG9ydHNMQW5hbHlzaXNMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU1BvcnRzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgaWYgKGJhc2VfQ2xhc3MgIT0gbnVsbCAmJiBiYXNlX0NsYXNzLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX0NsYXNzID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9DbGFzczsKLSAgICAgICAgICAgIGJhc2VfQ2xhc3MgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9DbGFzcyAhPSBvbGRCYXNlX0NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX0JBU0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCkgeworCQlpZiAoYmFzZV9DbGFzcyAhPSBudWxsICYmIGJhc2VfQ2xhc3MuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX0NsYXNzOworCQkJYmFzZV9DbGFzcyA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgZVJlc29sdmVQcm94eShvbGRCYXNlX0NsYXNzKTsKKwkJCWlmIChiYXNlX0NsYXNzICE9IG9sZEJhc2VfQ2xhc3MpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUywKKwkJCQkJCQlvbGRCYXNlX0NsYXNzLAorCQkJCQkJCWJhc2VfQ2xhc3MpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFzZV9DbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzaWNHZXRCYXNlX0NsYXNzKCkgewotICAgICAgICByZXR1cm4gYmFzZV9DbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2ljR2V0QmFzZV9DbGFzcygpIHsKKwkJcmV0dXJuIGJhc2VfQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBuZXdCYXNlX0NsYXNzKSB7Ci0gICAgICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIG9sZEJhc2VfQ2xhc3MgPSBiYXNlX0NsYXNzOwotICAgICAgICBiYXNlX0NsYXNzID0gbmV3QmFzZV9DbGFzczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX0NsYXNzLAotICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgeworCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKKwkJYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUywKKwkJCQkJb2xkQmFzZV9DbGFzcywKKwkJCQkJYmFzZV9DbGFzcykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXM+IGdldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0xvZ2ljYWwgR2F0ZXMgTEFuYWx5c2lzIExpc3QnIHJlZmVyZW5jZSBsaXN0Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPiBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NMb2dpY2FsIEdhdGVzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmFpbHVyZSBNb2RlcyBMQW5hbHlzaXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTQmFycmllckxBbmFseXNpcz4gZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NCYXJyaWVycyBMQW5hbHlzaXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0JhcnJpZXJMQW5hbHlzaXM+IGdldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmFycmllcnMgTEFuYWx5c2lzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgZ2V0U0xvY2FsQW5hbHlzaXMoKSB7Ci0gICAgICAgIElTTG9jYWxBbmFseXNpcyBzTG9jYWxBbmFseXNpcyA9IGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNMb2NhbEFuYWx5c2lzICE9IG51bGwgJiYgc0xvY2FsQW5hbHlzaXMuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSVNMb2NhbEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNMb2NhbEFuYWx5c2lzKQotICAgICAgICAgICAgOiBzTG9jYWxBbmFseXNpczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTTG9jYWxBbmFseXNpcyBnZXRTTG9jYWxBbmFseXNpcygpIHsKKwkJSVNMb2NhbEFuYWx5c2lzIHNMb2NhbEFuYWx5c2lzID0gYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpOworCQlyZXR1cm4gc0xvY2FsQW5hbHlzaXMgIT0gbnVsbCAmJiBzTG9jYWxBbmFseXNpcy5lSXNQcm94eSgpCisJCQk/IChJU0xvY2FsQW5hbHlzaXMpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc0xvY2FsQW5hbHlzaXMpCisJCQk6IHNMb2NhbEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NMb2NhbCBBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NMb2NhbCBBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIG5ld1NMb2NhbEFuYWx5c2lzKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTTG9jYWwgQW5hbHlzaXMnIHJlZmVyZW5jZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIG5ld1NMb2NhbEFuYWx5c2lzKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTTG9jYWwgQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NQcm9wYWdhdGlvbiBMaW5rcyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTUHJvcGFnYXRpb24gTGlua3MgTGlzdCcgcmVmZXJlbmNlIGxpc3QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JMT0NLOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0Jsb2NrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVFNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU1BPUlRTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTUG9ydHNMQW5hbHlzaXNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9DbGFzcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkFSUklFUlNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0NBTF9BTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNMb2NhbEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JMT0NLOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0Jsb2NrKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0Jsb2NrKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVFNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU1BPUlRTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiBnZXRTUG9ydHNMQW5hbHlzaXNMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0QmFzZV9DbGFzcygpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfQ2xhc3MoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkFSUklFUlNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0NBTF9BTkFMWVNJUzoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNMb2NhbEFuYWx5c2lzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOgorCQkJCXJldHVybiBnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JMT0NLOgotICAgICAgICAgICAgICAgIHNldFNCbG9jaygoSVNCbG9jaykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU1BPUlRTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNQb3J0c0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNQb3J0c0xBbmFseXNpc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTUG9ydExBbmFseXNpcz4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0xPR0lDQUxfR0FURVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JBUlJJRVJTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTQmFycmllckxBbmFseXNpcz4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TTE9DQUxfQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgc2V0U0xvY2FsQW5hbHlzaXMoKElTTG9jYWxBbmFseXNpcykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU1Byb3BhZ2F0aW9uTGluaz4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NCTE9DSzoKKwkJCQlzZXRTQmxvY2soKElTQmxvY2spIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVFNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKQorCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzPikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NQT1JUU19MQU5BTFlTSVNfTElTVDoKKwkJCQlnZXRTUG9ydHNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTUG9ydHNMQW5hbHlzaXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU1BvcnRMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUzoKKwkJCQlzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUOgorCQkJCWdldFNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgorCQkJCWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NCQVJSSUVSU19MQU5BTFlTSVNfTElTVDoKKwkJCQlnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0JhcnJpZXJMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0xPQ0FMX0FOQUxZU0lTOgorCQkJCXNldFNMb2NhbEFuYWx5c2lzKChJU0xvY2FsQW5hbHlzaXMpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKKwkJCQlnZXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKS5jbGVhcigpOworCQkJCWdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNQcm9wYWdhdGlvbkxpbms+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NCTE9DSzoKLSAgICAgICAgICAgICAgICBzZXRTQmxvY2soKElTQmxvY2spIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX0VWRU5UU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NQT1JUU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTUG9ydHNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TTE9HSUNBTF9HQVRFU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NCQVJSSUVSU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TTE9DQUxfQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgc2V0U0xvY2FsQW5hbHlzaXMoKElTTG9jYWxBbmFseXNpcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU1BST1BBR0FUSU9OX0xJTktTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0s6CisJCQkJc2V0U0Jsb2NrKChJU0Jsb2NrKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TRkFJTFVSRV9FVkVOVFNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TUE9SVFNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fQkFTRV9DTEFTUzoKKwkJCQlzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0xPR0lDQUxfR0FURVNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgorCQkJCWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkFSUklFUlNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0xPQ0FMX0FOQUxZU0lTOgorCQkJCXNldFNMb2NhbEFuYWx5c2lzKChJU0xvY2FsQW5hbHlzaXMpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NQUk9QQUdBVElPTl9MSU5LU19MSVNUOgorCQkJCWdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0s6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNCbG9jayAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU1BPUlRTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX0JBU0VfQ0xBU1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3MgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKS5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JBUlJJRVJTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0NBTF9BTkFMWVNJUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIWdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TQkxPQ0s6CisJCQkJcmV0dXJuIHNCbG9jayAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0ZBSUxVUkVfRVZFTlRTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU1BPUlRTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX0JBU0VfQ0xBU1M6CisJCQkJcmV0dXJuIGJhc2VfQ2xhc3MgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0dJQ0FMX0dBVEVTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKS5pc0VtcHR5KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlyZXR1cm4gIWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0JMT0NLX0xBTkFMWVNJU19fU0JBUlJJRVJTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVNfX1NMT0NBTF9BTkFMWVNJUzoKKwkJCQlyZXR1cm4gYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTX19TUFJPUEFHQVRJT05fTElOS1NfTElTVDoKKwkJCQlyZXR1cm4gIWdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNCbG9ja0xBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmphdmEKaW5kZXggOTgxMjFjMS4uZmQyOTMzMyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5qYXZhCkBAIC00MywyNTYgKzQzLDI1NiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgIGV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICBpbXBsZW1lbnRzIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uIHsKKwlleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJaW1wbGVtZW50cyBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX0Nvbm5lY3RvcigpIDxlbT5CYXNlIENvbm5lY3RvcjwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Db25uZWN0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBDb25uZWN0b3IgYmFzZV9Db25uZWN0b3I7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9Db25uZWN0b3IoKSA8ZW0+QmFzZSBDb25uZWN0b3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEJhc2VfQ29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29ubmVjdG9yIGJhc2VfQ29ubmVjdG9yOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIGdldFNGYWlsdXJlTW9kZUxBbmFseXNpcygpIHsKLSAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHNGYWlsdXJlTW9kZUxBbmFseXNpcyA9IGJhc2ljR2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7Ci0gICAgICAgIHJldHVybiBzRmFpbHVyZU1vZGVMQW5hbHlzaXMgIT0gbnVsbCAmJiBzRmFpbHVyZU1vZGVMQW5hbHlzaXMuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNGYWlsdXJlTW9kZUxBbmFseXNpcykKLSAgICAgICAgICAgIDogc0ZhaWx1cmVNb2RlTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIGdldFNGYWlsdXJlTW9kZUxBbmFseXNpcygpIHsKKwkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHNGYWlsdXJlTW9kZUxBbmFseXNpcyA9IGJhc2ljR2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CisJCXJldHVybiBzRmFpbHVyZU1vZGVMQW5hbHlzaXMgIT0gbnVsbCAmJiBzRmFpbHVyZU1vZGVMQW5hbHlzaXMuZUlzUHJveHkoKQorCQkJPyAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNGYWlsdXJlTW9kZUxBbmFseXNpcykKKwkJCTogc0ZhaWx1cmVNb2RlTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgYmFzaWNHZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmFpbHVyZSBNb2RlIExBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgYmFzaWNHZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmFpbHVyZSBNb2RlIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyBuZXdTRmFpbHVyZU1vZGVMQW5hbHlzaXMpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NGYWlsdXJlIE1vZGUgTEFuYWx5c2lzJyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNGYWlsdXJlTW9kZUxBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgbmV3U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTRmFpbHVyZSBNb2RlIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0QmFzZV9Db25uZWN0b3IoKSB7Ci0gICAgICAgIGlmIChiYXNlX0Nvbm5lY3RvciAhPSBudWxsICYmIGJhc2VfQ29ubmVjdG9yLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX0Nvbm5lY3RvciA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfQ29ubmVjdG9yOwotICAgICAgICAgICAgYmFzZV9Db25uZWN0b3IgPSAoQ29ubmVjdG9yKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfQ29ubmVjdG9yKTsKLSAgICAgICAgICAgIGlmIChiYXNlX0Nvbm5lY3RvciAhPSBvbGRCYXNlX0Nvbm5lY3RvcikgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Db25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9Db25uZWN0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9Db25uZWN0b3I7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25uZWN0b3IgZ2V0QmFzZV9Db25uZWN0b3IoKSB7CisJCWlmIChiYXNlX0Nvbm5lY3RvciAhPSBudWxsICYmIGJhc2VfQ29ubmVjdG9yLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRCYXNlX0Nvbm5lY3RvciA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfQ29ubmVjdG9yOworCQkJYmFzZV9Db25uZWN0b3IgPSAoQ29ubmVjdG9yKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfQ29ubmVjdG9yKTsKKwkJCWlmIChiYXNlX0Nvbm5lY3RvciAhPSBvbGRCYXNlX0Nvbm5lY3RvcikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1IsCisJCQkJCQkJb2xkQmFzZV9Db25uZWN0b3IsCisJCQkJCQkJYmFzZV9Db25uZWN0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFzZV9Db25uZWN0b3I7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENvbm5lY3RvciBiYXNpY0dldEJhc2VfQ29ubmVjdG9yKCkgewotICAgICAgICByZXR1cm4gYmFzZV9Db25uZWN0b3I7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25uZWN0b3IgYmFzaWNHZXRCYXNlX0Nvbm5lY3RvcigpIHsKKwkJcmV0dXJuIGJhc2VfQ29ubmVjdG9yOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfQ29ubmVjdG9yKENvbm5lY3RvciBuZXdCYXNlX0Nvbm5lY3RvcikgewotICAgICAgICBDb25uZWN0b3Igb2xkQmFzZV9Db25uZWN0b3IgPSBiYXNlX0Nvbm5lY3RvcjsKLSAgICAgICAgYmFzZV9Db25uZWN0b3IgPSBuZXdCYXNlX0Nvbm5lY3RvcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1IsCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfQ29ubmVjdG9yLAotICAgICAgICAgICAgICAgICAgICBiYXNlX0Nvbm5lY3RvcikpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX0Nvbm5lY3RvcihDb25uZWN0b3IgbmV3QmFzZV9Db25uZWN0b3IpIHsKKwkJQ29ubmVjdG9yIG9sZEJhc2VfQ29ubmVjdG9yID0gYmFzZV9Db25uZWN0b3I7CisJCWJhc2VfQ29ubmVjdG9yID0gbmV3QmFzZV9Db25uZWN0b3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SLAorCQkJCQlvbGRCYXNlX0Nvbm5lY3RvciwKKwkJCQkJYmFzZV9Db25uZWN0b3IpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgZ2V0U0ZhaWx1cmVNb2RlT3duZXIoKSB7Ci0gICAgICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIHNGYWlsdXJlTW9kZU93bmVyID0gYmFzaWNHZXRTRmFpbHVyZU1vZGVPd25lcigpOwotICAgICAgICByZXR1cm4gc0ZhaWx1cmVNb2RlT3duZXIgIT0gbnVsbCAmJiBzRmFpbHVyZU1vZGVPd25lci5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcikgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzRmFpbHVyZU1vZGVPd25lcikKLSAgICAgICAgICAgIDogc0ZhaWx1cmVNb2RlT3duZXI7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBnZXRTRmFpbHVyZU1vZGVPd25lcigpIHsKKwkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgc0ZhaWx1cmVNb2RlT3duZXIgPSBiYXNpY0dldFNGYWlsdXJlTW9kZU93bmVyKCk7CisJCXJldHVybiBzRmFpbHVyZU1vZGVPd25lciAhPSBudWxsICYmIHNGYWlsdXJlTW9kZU93bmVyLmVJc1Byb3h5KCkKKwkJCT8gKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNGYWlsdXJlTW9kZU93bmVyKQorCQkJOiBzRmFpbHVyZU1vZGVPd25lcjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRTRmFpbHVyZU1vZGVPd25lcigpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGUgT3duZXInIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRTRmFpbHVyZU1vZGVPd25lcigpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGUgT3duZXInIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNGYWlsdXJlTW9kZU93bmVyKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIG5ld1NGYWlsdXJlTW9kZU93bmVyKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTRmFpbHVyZSBNb2RlIE93bmVyJyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNGYWlsdXJlTW9kZU93bmVyKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIG5ld1NGYWlsdXJlTW9kZU93bmVyKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTRmFpbHVyZSBNb2RlIE93bmVyJyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1I6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCYXNlX0Nvbm5lY3RvcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfQ29ubmVjdG9yKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fU0ZBSUxVUkVfTU9ERV9PV05FUjoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGYWlsdXJlTW9kZU93bmVyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlT3duZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1I6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX0Nvbm5lY3RvcigpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfQ29ubmVjdG9yKCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fU0ZBSUxVUkVfTU9ERV9PV05FUjoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNGYWlsdXJlTW9kZU93bmVyKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlT3duZXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNGYWlsdXJlTW9kZUxBbmFseXNpcygoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ29ubmVjdG9yKChDb25uZWN0b3IpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fU0ZBSUxVUkVfTU9ERV9PV05FUjoKLSAgICAgICAgICAgICAgICBzZXRTRmFpbHVyZU1vZGVPd25lcigoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUzoKKwkJCQlzZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcykgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19CQVNFX0NPTk5FQ1RPUjoKKwkJCQlzZXRCYXNlX0Nvbm5lY3RvcigoQ29ubmVjdG9yKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfT1dORVI6CisJCQkJc2V0U0ZhaWx1cmVNb2RlT3duZXIoKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ29ubmVjdG9yKChDb25uZWN0b3IpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX09XTkVSOgotICAgICAgICAgICAgICAgIHNldFNGYWlsdXJlTW9kZU93bmVyKChJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcikgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfTEFOQUxZU0lTOgorCQkJCXNldFNGYWlsdXJlTW9kZUxBbmFseXNpcygoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTl9fQkFTRV9DT05ORUNUT1I6CisJCQkJc2V0QmFzZV9Db25uZWN0b3IoKENvbm5lY3RvcikgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfT1dORVI6CisJCQkJc2V0U0ZhaWx1cmVNb2RlT3duZXIoKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX0Nvbm5lY3RvciAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfT1dORVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlT3duZXIoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OX19TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUzoKKwkJCQlyZXR1cm4gYmFzaWNHZXRTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX0JBU0VfQ09OTkVDVE9SOgorCQkJCXJldHVybiBiYXNlX0Nvbm5lY3RvciAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0RZU0ZVTkNUSU9OQUxfQVNTT0NJQVRJT05fX1NGQUlMVVJFX01PREVfT1dORVI6CisJCQkJcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVNb2RlT3duZXIoKSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CiAKIH0gLy8gU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhCmluZGV4IGQ1ZjgyM2YuLjhmODEyYzIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TRXJyb25lb3VzRmFpbHVyZU1vZGUuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0Vycm9uZW91c0ZhaWx1cmVNb2RlLmphdmEKQEAgLTM2LDE1NiArMzYsMTU2IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBTRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgaW1wbGVtZW50cyBJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIHsKKwlleHRlbmRzIEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJaW1wbGVtZW50cyBJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIHsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9Qcm9wZXJ0eSgpIDxlbT5CYXNlIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHkgYmFzZV9Qcm9wZXJ0eTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTRXJyb25lb3VzRmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTRXJyb25lb3VzRmFpbHVyZU1vZGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0VSUk9ORU9VU19GQUlMVVJFX01PREU7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OwotICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKLSAgICAgICAgICAgIGlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Qcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgeworCQlpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OworCQkJYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKKwkJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCisJCQkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJCQliYXNlX1Byb3BlcnR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBiYXNpY0dldEJhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiBiYXNlX1Byb3BlcnR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgewotICAgICAgICBQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfUHJvcGVydHkpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7CisJCVByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OworCQliYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSwKKwkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX1Byb3BlcnR5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRVJST05FT1VTX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5ICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0VSUk9ORU9VU19GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNFcnJvbmVvdXNGYWlsdXJlTW9kZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NGZWFyZWRFdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NGZWFyZWRFdmVudC5qYXZhCmluZGV4IDM1OWVkNmEuLjNhOTRhYjEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TRmVhcmVkRXZlbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0ZlYXJlZEV2ZW50LmphdmEKQEAgLTQ1LDI3NSArNDUsMjc1IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBTRmVhcmVkRXZlbnQKLSAgICBleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50Ci0gICAgaW1wbGVtZW50cyBJU0ZlYXJlZEV2ZW50IHsKKwlleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJaW1wbGVtZW50cyBJU0ZlYXJlZEV2ZW50IHsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NlbGVjdGVkKCkgPGVtPklzIFNlbGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNpc1NlbGVjdGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU0VMRUNURURfRURFRkFVTFQgPSBmYWxzZTsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTZWxlY3RlZCgpIDxlbT5JcyBTZWxlY3RlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjaXNTZWxlY3RlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NFTEVDVEVEX0VERUZBVUxUID0gZmFsc2U7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX0NsYXNzKCkgPGVtPkJhc2UgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEJhc2VfQ2xhc3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNlX0NsYXNzOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfQ2xhc3MoKSA8ZW0+QmFzZSBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QmFzZV9DbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2VfQ2xhc3M7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0ZlYXJlZEV2ZW50KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0ZlYXJlZEV2ZW50KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNGRUFSRURfRVZFTlQ7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNGRUFSRURfRVZFTlQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0lzIFNlbGVjdGVkJyBhdHRyaWJ1dGUKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdJcyBTZWxlY3RlZCcgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElzU2VsZWN0ZWQoYm9vbGVhbiBuZXdJc1NlbGVjdGVkKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdJcyBTZWxlY3RlZCcgYXR0cmlidXRlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJc1NlbGVjdGVkKGJvb2xlYW4gbmV3SXNTZWxlY3RlZCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnSXMgU2VsZWN0ZWQnIGF0dHJpYnV0ZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgaWYgKGJhc2VfQ2xhc3MgIT0gbnVsbCAmJiBiYXNlX0NsYXNzLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX0NsYXNzID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9DbGFzczsKLSAgICAgICAgICAgIGJhc2VfQ2xhc3MgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9DbGFzcyAhPSBvbGRCYXNlX0NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX0JBU0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCkgeworCQlpZiAoYmFzZV9DbGFzcyAhPSBudWxsICYmIGJhc2VfQ2xhc3MuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX0NsYXNzOworCQkJYmFzZV9DbGFzcyA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgZVJlc29sdmVQcm94eShvbGRCYXNlX0NsYXNzKTsKKwkJCWlmIChiYXNlX0NsYXNzICE9IG9sZEJhc2VfQ2xhc3MpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUywKKwkJCQkJCQlvbGRCYXNlX0NsYXNzLAorCQkJCQkJCWJhc2VfQ2xhc3MpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFzZV9DbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzaWNHZXRCYXNlX0NsYXNzKCkgewotICAgICAgICByZXR1cm4gYmFzZV9DbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2ljR2V0QmFzZV9DbGFzcygpIHsKKwkJcmV0dXJuIGJhc2VfQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBuZXdCYXNlX0NsYXNzKSB7Ci0gICAgICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIG9sZEJhc2VfQ2xhc3MgPSBiYXNlX0NsYXNzOwotICAgICAgICBiYXNlX0NsYXNzID0gbmV3QmFzZV9DbGFzczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX0NsYXNzLAotICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgeworCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKKwkJYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUywKKwkJCQkJb2xkQmFzZV9DbGFzcywKKwkJCQkJYmFzZV9DbGFzcykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3QnIHJlZmVyZW5jZSBsaXN0Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgewotICAgICAgICBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgc0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgIHJldHVybiBzRmVhcmVkRXZlbnRzTGlicmFyeSAhPSBudWxsICYmIHNGZWFyZWRFdmVudHNMaWJyYXJ5LmVJc1Byb3h5KCkKLSAgICAgICAgICAgID8gKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzRmVhcmVkRXZlbnRzTGlicmFyeSkKLSAgICAgICAgICAgIDogc0ZlYXJlZEV2ZW50c0xpYnJhcnk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCUlTRmVhcmVkRXZlbnRzTGlicmFyeSBzRmVhcmVkRXZlbnRzTGlicmFyeSA9IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJcmV0dXJuIHNGZWFyZWRFdmVudHNMaWJyYXJ5ICE9IG51bGwgJiYgc0ZlYXJlZEV2ZW50c0xpYnJhcnkuZUlzUHJveHkoKQorCQkJPyAoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNGZWFyZWRFdmVudHNMaWJyYXJ5KQorCQkJOiBzRmVhcmVkRXZlbnRzTGlicmFyeTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmVhcmVkIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKLSAgICAgICAgLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTRmVhcmVkRXZlbnRzTGlicmFyeSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlicmFyeScgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IG5ld1NGZWFyZWRFdmVudHNMaWJyYXJ5KSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTRmVhcmVkIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KElTRmVhcmVkRXZlbnRzTGlicmFyeSBuZXdTRmVhcmVkRXZlbnRzTGlicmFyeSkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlicmFyeScgcmVmZXJlbmNlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX0lTX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdGVkKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9DbGFzcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fSVNfU0VMRUNURUQ6CisJCQkJcmV0dXJuIGlzU2VsZWN0ZWQoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX0JBU0VfQ0xBU1M6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX0NsYXNzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9DbGFzcygpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19JU19TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICBzZXRJc1NlbGVjdGVkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fSVNfU0VMRUNURUQ6CisJCQkJc2V0SXNTZWxlY3RlZCgoQm9vbGVhbikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7CisJCQkJZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4pIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgorCQkJCXNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fSVNfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgc2V0SXNTZWxlY3RlZChJU19TRUxFQ1RFRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fSVNfU0VMRUNURUQ6CisJCQkJc2V0SXNTZWxlY3RlZChJU19TRUxFQ1RFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUzoKKwkJCQlzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6CisJCQkJc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19JU19TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTZWxlY3RlZCgpICE9IElTX1NFTEVDVEVEX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9DbGFzcyAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRfX0lTX1NFTEVDVEVEOgorCQkJCXJldHVybiBpc1NlbGVjdGVkKCkgIT0gSVNfU0VMRUNURURfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19CQVNFX0NMQVNTOgorCQkJCXJldHVybiBiYXNlX0NsYXNzICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlyZXR1cm4gIWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVF9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKKwkJCQlyZXR1cm4gYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTRmVhcmVkRXZlbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TRmVhcmVkRXZlbnRzRmFtaWx5LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0ZlYXJlZEV2ZW50c0ZhbWlseS5qYXZhCmluZGV4IGNjMmJhNjMuLjc0YjMyY2UgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TRmVhcmVkRXZlbnRzRmFtaWx5LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NGZWFyZWRFdmVudHNGYW1pbHkuamF2YQpAQCAtNTIsMzQ0ICs1MiwzNDQgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIFNGZWFyZWRFdmVudHNGYW1pbHkKLSAgICBleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50Ci0gICAgaW1wbGVtZW50cyBJU0ZlYXJlZEV2ZW50c0ZhbWlseSB7CisJZXh0ZW5kcyBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAorCWltcGxlbWVudHMgSVNGZWFyZWRFdmVudHNGYW1pbHkgewogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9DbGFzcygpIDxlbT5CYXNlIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzZV9DbGFzczsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX0NsYXNzKCkgPGVtPkJhc2UgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEJhc2VfQ2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNlX0NsYXNzOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2VsZWN0ZWQoKSA8ZW0+SXMgU2VsZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2lzU2VsZWN0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TRUxFQ1RFRF9FREVGQVVMVCA9IGZhbHNlOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NlbGVjdGVkKCkgPGVtPklzIFNlbGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNpc1NlbGVjdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU0VMRUNURURfRURFRkFVTFQgPSBmYWxzZTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTRmVhcmVkRXZlbnRzRmFtaWx5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0ZlYXJlZEV2ZW50c0ZhbWlseSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TRkVBUkVEX0VWRU5UU19GQU1JTFk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNGRUFSRURfRVZFTlRTX0ZBTUlMWTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgaWYgKGJhc2VfQ2xhc3MgIT0gbnVsbCAmJiBiYXNlX0NsYXNzLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX0NsYXNzID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9DbGFzczsKLSAgICAgICAgICAgIGJhc2VfQ2xhc3MgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9DbGFzcyAhPSBvbGRCYXNlX0NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQkFTRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX0NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfQ2xhc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9DbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGdldEJhc2VfQ2xhc3MoKSB7CisJCWlmIChiYXNlX0NsYXNzICE9IG51bGwgJiYgYmFzZV9DbGFzcy5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9DbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfQ2xhc3M7CisJCQliYXNlX0NsYXNzID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfQ2xhc3MpOworCQkJaWYgKGJhc2VfQ2xhc3MgIT0gb2xkQmFzZV9DbGFzcykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0JBU0VfQ0xBU1MsCisJCQkJCQkJb2xkQmFzZV9DbGFzcywKKwkJCQkJCQliYXNlX0NsYXNzKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2ljR2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNpY0dldEJhc2VfQ2xhc3MoKSB7CisJCXJldHVybiBiYXNlX0NsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgewotICAgICAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKLSAgICAgICAgYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX0NsYXNzLAotICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgeworCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKKwkJYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTLAorCQkJCQlvbGRCYXNlX0NsYXNzLAorCQkJCQliYXNlX0NsYXNzKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnQ+IGdldFNGZWFyZWRFdmVudHNMaXN0KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGZWFyZWQgRXZlbnRzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdJcyBTZWxlY3RlZCcgYXR0cmlidXRlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnSXMgU2VsZWN0ZWQnIGF0dHJpYnV0ZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc1NlbGVjdGVkKGJvb2xlYW4gbmV3SXNTZWxlY3RlZCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnSXMgU2VsZWN0ZWQnIGF0dHJpYnV0ZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SXNTZWxlY3RlZChib29sZWFuIG5ld0lzU2VsZWN0ZWQpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ0lzIFNlbGVjdGVkJyBhdHRyaWJ1dGUKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBnZXRTdWJGYW1pbGllc0xpc3QoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTdWIgRmFtaWxpZXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gZ2V0U3ViRmFtaWxpZXNMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU3ViIEZhbWlsaWVzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0FsbCBTRmVhcmVkIEV2ZW50cyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnQ+IGdldEFsbFNGZWFyZWRFdmVudHNMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnQWxsIFNGZWFyZWQgRXZlbnRzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZhaWx1cmUgTW9kZXMgTEFuYWx5c2lzIExpc3QnIHJlZmVyZW5jZSBsaXN0Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGYWlsdXJlIE1vZGVzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgewotICAgICAgICBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgc0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgIHJldHVybiBzRmVhcmVkRXZlbnRzTGlicmFyeSAhPSBudWxsICYmIHNGZWFyZWRFdmVudHNMaWJyYXJ5LmVJc1Byb3h5KCkKLSAgICAgICAgICAgID8gKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzRmVhcmVkRXZlbnRzTGlicmFyeSkKLSAgICAgICAgICAgIDogc0ZlYXJlZEV2ZW50c0xpYnJhcnk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCUlTRmVhcmVkRXZlbnRzTGlicmFyeSBzRmVhcmVkRXZlbnRzTGlicmFyeSA9IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJcmV0dXJuIHNGZWFyZWRFdmVudHNMaWJyYXJ5ICE9IG51bGwgJiYgc0ZlYXJlZEV2ZW50c0xpYnJhcnkuZUlzUHJveHkoKQorCQkJPyAoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNGZWFyZWRFdmVudHNMaWJyYXJ5KQorCQkJOiBzRmVhcmVkRXZlbnRzTGlicmFyeTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmVhcmVkIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKLSAgICAgICAgLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTRmVhcmVkRXZlbnRzTGlicmFyeSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlicmFyeScgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IG5ld1NGZWFyZWRFdmVudHNMaWJyYXJ5KSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTRmVhcmVkIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KElTRmVhcmVkRXZlbnRzTGlicmFyeSBuZXdTRmVhcmVkRXZlbnRzTGlicmFyeSkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlicmFyeScgcmVmZXJlbmNlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX0NsYXNzKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0lTX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdGVkKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NVQl9GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTdWJGYW1pbGllc0xpc3QoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQUxMX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFsbFNGZWFyZWRFdmVudHNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0JBU0VfQ0xBU1M6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX0NsYXNzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9DbGFzcygpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSVNUOgorCQkJCXJldHVybiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19JU19TRUxFQ1RFRDoKKwkJCQlyZXR1cm4gaXNTZWxlY3RlZCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TVUJfRkFNSUxJRVNfTElTVDoKKwkJCQlyZXR1cm4gZ2V0U3ViRmFtaWxpZXNMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0FMTF9TRkVBUkVEX0VWRU5UU19MSVNUOgorCQkJCXJldHVybiBnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlyZXR1cm4gZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNGZWFyZWRFdmVudD4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0lTX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgIHNldElzU2VsZWN0ZWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NVQl9GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFN1YkZhbWlsaWVzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U3ViRmFtaWxpZXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50c0ZhbWlseT4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0FMTF9TRkVBUkVEX0VWRU5UU19MSVNUOgotICAgICAgICAgICAgICAgIGdldEFsbFNGZWFyZWRFdmVudHNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNGZWFyZWRFdmVudD4pIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICBzZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOworCQkJCWdldFNGZWFyZWRFdmVudHNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50PikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fSVNfU0VMRUNURUQ6CisJCQkJc2V0SXNTZWxlY3RlZCgoQm9vbGVhbikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU1VCX0ZBTUlMSUVTX0xJU1Q6CisJCQkJZ2V0U3ViRmFtaWxpZXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTdWJGYW1pbGllc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTRmVhcmVkRXZlbnRzRmFtaWx5PikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQUxMX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOworCQkJCWdldEFsbFNGZWFyZWRFdmVudHNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50PikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6CisJCQkJZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOworCQkJCWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgorCQkJCXNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fSVNfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgc2V0SXNTZWxlY3RlZChJU19TRUxFQ1RFRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TVUJfRkFNSUxJRVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTdWJGYW1pbGllc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQUxMX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZBSUxVUkVfTU9ERVNfTEFOQUxZU0lTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICBzZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU0ZFQVJFRF9FVkVOVFNfTElTVDoKKwkJCQlnZXRTRmVhcmVkRXZlbnRzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19JU19TRUxFQ1RFRDoKKwkJCQlzZXRJc1NlbGVjdGVkKElTX1NFTEVDVEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NVQl9GQU1JTElFU19MSVNUOgorCQkJCWdldFN1YkZhbWlsaWVzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19BTExfU0ZFQVJFRF9FVkVOVFNfTElTVDoKKwkJCQlnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgorCQkJCXNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIG51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX0NsYXNzICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFnZXRTRmVhcmVkRXZlbnRzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fSVNfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQoKSAhPSBJU19TRUxFQ1RFRF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fU1VCX0ZBTUlMSUVTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFnZXRTdWJGYW1pbGllc0xpc3QoKS5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0FMTF9TRkVBUkVEX0VWRU5UU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoKS5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGQUlMVVJFX01PREVTX0xBTkFMWVNJU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWV9fQkFTRV9DTEFTUzoKKwkJCQlyZXR1cm4gYmFzZV9DbGFzcyAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5pc0VtcHR5KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX0lTX1NFTEVDVEVEOgorCQkJCXJldHVybiBpc1NlbGVjdGVkKCkgIT0gSVNfU0VMRUNURURfRURFRkFVTFQ7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFlfX1NVQl9GQU1JTElFU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U3ViRmFtaWxpZXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19BTExfU0ZFQVJFRF9FVkVOVFNfTElTVDoKKwkJCQlyZXR1cm4gIWdldEFsbFNGZWFyZWRFdmVudHNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkFJTFVSRV9NT0RFU19MQU5BTFlTSVNfTElTVDoKKwkJCQlyZXR1cm4gIWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfRkFNSUxZX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgorCQkJCXJldHVybiBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNGZWFyZWRFdmVudHNGYW1pbHkKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TRmVhcmVkRXZlbnRzTGlicmFyeS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKaW5kZXggZTAzOTI4YS4uNzE2YmMyMyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKQEAgLTQ3LDI1MyArNDcsMjUzIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBTRmVhcmVkRXZlbnRzTGlicmFyeQotICAgIGV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICBpbXBsZW1lbnRzIElTRmVhcmVkRXZlbnRzTGlicmFyeSB7CisJZXh0ZW5kcyBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAorCWltcGxlbWVudHMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUGFja2FnZSgpIDxlbT5CYXNlIFBhY2thZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEJhc2VfUGFja2FnZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgYmFzZV9QYWNrYWdlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUGFja2FnZSgpIDxlbT5CYXNlIFBhY2thZ2U8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEJhc2VfUGFja2FnZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgYmFzZV9QYWNrYWdlOwogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBnZXRCYXNlX1BhY2thZ2UoKSB7Ci0gICAgICAgIGlmIChiYXNlX1BhY2thZ2UgIT0gbnVsbCAmJiBiYXNlX1BhY2thZ2UuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUGFja2FnZSA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUGFja2FnZTsKLSAgICAgICAgICAgIGJhc2VfUGFja2FnZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUGFja2FnZSk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9QYWNrYWdlICE9IG9sZEJhc2VfUGFja2FnZSkgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9QYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfUGFja2FnZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlX1BhY2thZ2U7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGdldEJhc2VfUGFja2FnZSgpIHsKKwkJaWYgKGJhc2VfUGFja2FnZSAhPSBudWxsICYmIGJhc2VfUGFja2FnZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9QYWNrYWdlID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9QYWNrYWdlOworCQkJYmFzZV9QYWNrYWdlID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9QYWNrYWdlKTsKKwkJCWlmIChiYXNlX1BhY2thZ2UgIT0gb2xkQmFzZV9QYWNrYWdlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KAorCQkJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCisJCQkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRSwKKwkJCQkJCQlvbGRCYXNlX1BhY2thZ2UsCisJCQkJCQkJYmFzZV9QYWNrYWdlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUGFja2FnZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBiYXNpY0dldEJhc2VfUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUGFja2FnZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgYmFzaWNHZXRCYXNlX1BhY2thZ2UoKSB7CisJCXJldHVybiBiYXNlX1BhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgbmV3QmFzZV9QYWNrYWdlKSB7Ci0gICAgICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb2xkQmFzZV9QYWNrYWdlID0gYmFzZV9QYWNrYWdlOwotICAgICAgICBiYXNlX1BhY2thZ2UgPSBuZXdCYXNlX1BhY2thZ2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1BhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfUGFja2FnZSkpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX1BhY2thZ2Uob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBuZXdCYXNlX1BhY2thZ2UpIHsKKwkJb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvbGRCYXNlX1BhY2thZ2UgPSBiYXNlX1BhY2thZ2U7CisJCWJhc2VfUGFja2FnZSA9IG5ld0Jhc2VfUGFja2FnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UsCisJCQkJCW9sZEJhc2VfUGFja2FnZSwKKwkJCQkJYmFzZV9QYWNrYWdlKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZlYXJlZCBFdmVudHMgRmFtaWxpZXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGZWFyZWQgRXZlbnRzIEZhbWlsaWVzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGZWFyZWQgRXZlbnRzIExpc3QnIHJlZmVyZW5jZSBsaXN0Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTRmVhcmVkIEV2ZW50cyBMaXN0JyByZWZlcmVuY2UgbGlzdAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNMb2NhbEFuYWx5c2lzIGdldFNMb2NhbEFuYWx5c2lzKCkgewotICAgICAgICBJU0xvY2FsQW5hbHlzaXMgc0xvY2FsQW5hbHlzaXMgPSBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCk7Ci0gICAgICAgIHJldHVybiBzTG9jYWxBbmFseXNpcyAhPSBudWxsICYmIHNMb2NhbEFuYWx5c2lzLmVJc1Byb3h5KCkKLSAgICAgICAgICAgID8gKElTTG9jYWxBbmFseXNpcykgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzTG9jYWxBbmFseXNpcykKLSAgICAgICAgICAgIDogc0xvY2FsQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgZ2V0U0xvY2FsQW5hbHlzaXMoKSB7CisJCUlTTG9jYWxBbmFseXNpcyBzTG9jYWxBbmFseXNpcyA9IGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHNMb2NhbEFuYWx5c2lzICE9IG51bGwgJiYgc0xvY2FsQW5hbHlzaXMuZUlzUHJveHkoKQorCQkJPyAoSVNMb2NhbEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNMb2NhbEFuYWx5c2lzKQorCQkJOiBzTG9jYWxBbmFseXNpczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNMb2NhbEFuYWx5c2lzIGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTTG9jYWwgQW5hbHlzaXMnIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNMb2NhbEFuYWx5c2lzIGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTTG9jYWwgQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcyBuZXdTTG9jYWxBbmFseXNpcykgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0xvY2FsIEFuYWx5c2lzJyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcyBuZXdTTG9jYWxBbmFseXNpcykgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0xvY2FsIEFuYWx5c2lzJyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9QYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0QmFzZV9QYWNrYWdlKCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0xvY2FsQW5hbHlzaXMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX1BhY2thZ2UoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlX1BhY2thZ2UoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVM6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRTTG9jYWxBbmFseXNpcygpOworCQkJCXJldHVybiBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1BhY2thZ2UoKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTRmVhcmVkRXZlbnRzRmFtaWx5PikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50PikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTTG9jYWxBbmFseXNpcygoSVNMb2NhbEFuYWx5c2lzKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6CisJCQkJc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0ZFQVJFRF9FVkVOVFNfRkFNSUxJRVNfTElTVDoKKwkJCQlnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50c0ZhbWlseT4pIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19MSVNUOgorCQkJCWdldFNGZWFyZWRFdmVudHNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTRmVhcmVkRXZlbnRzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNGZWFyZWRFdmVudD4pIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVM6CisJCQkJc2V0U0xvY2FsQW5hbHlzaXMoKElTTG9jYWxBbmFseXNpcykgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTTG9jYWxBbmFseXNpcygoSVNMb2NhbEFuYWx5c2lzKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6CisJCQkJc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgorCQkJCWdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1Q6CisJCQkJZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKKwkJCQlzZXRTTG9jYWxBbmFseXNpcygoSVNMb2NhbEFuYWx5c2lzKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9QYWNrYWdlICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZX19TRkVBUkVEX0VWRU5UU19GQU1JTElFU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0xJU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFnZXRTRmVhcmVkRXZlbnRzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFOgorCQkJCXJldHVybiBiYXNlX1BhY2thZ2UgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0xJQlJBUllfX1NGRUFSRURfRVZFTlRTX0ZBTUlMSUVTX0xJU1Q6CisJCQkJcmV0dXJuICFnZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0ZFQVJFRF9FVkVOVFNfTElTVDoKKwkJCQlyZXR1cm4gIWdldFNGZWFyZWRFdmVudHNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTOgorCQkJCXJldHVybiBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNGZWFyZWRFdmVudHNMaWJyYXJ5CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0xvY2FsQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TTG9jYWxBbmFseXNpcy5qYXZhCmluZGV4IDI2MDRhMjMuLjYwYTE1MGQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TTG9jYWxBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TTG9jYWxBbmFseXNpcy5qYXZhCkBAIC00OSwyODAgKzQ5LDI4MCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU0xvY2FsQW5hbHlzaXMKLSAgICBleHRlbmRzIEFic3RyYWN0U1NhZmV0eUFuYWx5c2lzCi0gICAgaW1wbGVtZW50cyBJU0xvY2FsQW5hbHlzaXMgeworCWV4dGVuZHMgQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMKKwlpbXBsZW1lbnRzIElTTG9jYWxBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1BhY2thZ2UoKSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGJhc2VfUGFja2FnZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1BhY2thZ2UoKSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGJhc2VfUGFja2FnZTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNMb2NhbEFuYWx5c2lzKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNMT0NBTF9BTkFMWVNJUzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU0xPQ0FMX0FOQUxZU0lTOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGdldEJhc2VfUGFja2FnZSgpIHsKLSAgICAgICAgaWYgKGJhc2VfUGFja2FnZSAhPSBudWxsICYmIGJhc2VfUGFja2FnZS5lSXNQcm94eSgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9QYWNrYWdlID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9QYWNrYWdlOwotICAgICAgICAgICAgYmFzZV9QYWNrYWdlID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9QYWNrYWdlKTsKLSAgICAgICAgICAgIGlmIChiYXNlX1BhY2thZ2UgIT0gb2xkQmFzZV9QYWNrYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fQkFTRV9QQUNLQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1BhY2thZ2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9QYWNrYWdlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBnZXRCYXNlX1BhY2thZ2UoKSB7CisJCWlmIChiYXNlX1BhY2thZ2UgIT0gbnVsbCAmJiBiYXNlX1BhY2thZ2UuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUGFja2FnZSA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUGFja2FnZTsKKwkJCWJhc2VfUGFja2FnZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUGFja2FnZSk7CisJCQlpZiAoYmFzZV9QYWNrYWdlICE9IG9sZEJhc2VfUGFja2FnZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX0JBU0VfUEFDS0FHRSwKKwkJCQkJCQlvbGRCYXNlX1BhY2thZ2UsCisJCQkJCQkJYmFzZV9QYWNrYWdlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUGFja2FnZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBiYXNpY0dldEJhc2VfUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUGFja2FnZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgYmFzaWNHZXRCYXNlX1BhY2thZ2UoKSB7CisJCXJldHVybiBiYXNlX1BhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgbmV3QmFzZV9QYWNrYWdlKSB7Ci0gICAgICAgIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb2xkQmFzZV9QYWNrYWdlID0gYmFzZV9QYWNrYWdlOwotICAgICAgICBiYXNlX1BhY2thZ2UgPSBuZXdCYXNlX1BhY2thZ2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0UsCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZV9QYWNrYWdlKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIG5ld0Jhc2VfUGFja2FnZSkgeworCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIG9sZEJhc2VfUGFja2FnZSA9IGJhc2VfUGFja2FnZTsKKwkJYmFzZV9QYWNrYWdlID0gbmV3QmFzZV9QYWNrYWdlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KAorCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJdGhpcywKKwkJCQkJTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fQkFTRV9QQUNLQUdFLAorCQkJCQlvbGRCYXNlX1BhY2thZ2UsCisJCQkJCWJhc2VfUGFja2FnZSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIElTU3lzdGVtRXZlbnRzTGlicmFyeSBzU3lzdGVtRXZlbnRzTGlicmFyeSA9IGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgcmV0dXJuIHNTeXN0ZW1FdmVudHNMaWJyYXJ5ICE9IG51bGwgJiYgc1N5c3RlbUV2ZW50c0xpYnJhcnkuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNTeXN0ZW1FdmVudHNMaWJyYXJ5KQotICAgICAgICAgICAgOiBzU3lzdGVtRXZlbnRzTGlicmFyeTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTU3lzdGVtRXZlbnRzTGlicmFyeSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKKwkJSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHNTeXN0ZW1FdmVudHNMaWJyYXJ5ID0gYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCQlyZXR1cm4gc1N5c3RlbUV2ZW50c0xpYnJhcnkgIT0gbnVsbCAmJiBzU3lzdGVtRXZlbnRzTGlicmFyeS5lSXNQcm94eSgpCisJCQk/IChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc1N5c3RlbUV2ZW50c0xpYnJhcnkpCisJCQk6IHNTeXN0ZW1FdmVudHNMaWJyYXJ5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NTeXN0ZW0gRXZlbnRzIExpYnJhcnknIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTU3lzdGVtIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKKwkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTU3lzdGVtRXZlbnRzTGlicmFyeShJU1N5c3RlbUV2ZW50c0xpYnJhcnkgbmV3U1N5c3RlbUV2ZW50c0xpYnJhcnkpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NTeXN0ZW0gRXZlbnRzIExpYnJhcnknIHJlZmVyZW5jZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IG5ld1NTeXN0ZW1FdmVudHNMaWJyYXJ5KSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTU3lzdGVtIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmVhcmVkRXZlbnRzTGlicmFyeSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOwotICAgICAgICByZXR1cm4gc0ZlYXJlZEV2ZW50c0xpYnJhcnkgIT0gbnVsbCAmJiBzRmVhcmVkRXZlbnRzTGlicmFyeS5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc0ZlYXJlZEV2ZW50c0xpYnJhcnkpCi0gICAgICAgICAgICA6IHNGZWFyZWRFdmVudHNMaWJyYXJ5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQlJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgc0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJCXJldHVybiBzRmVhcmVkRXZlbnRzTGlicmFyeSAhPSBudWxsICYmIHNGZWFyZWRFdmVudHNMaWJyYXJ5LmVJc1Byb3h5KCkKKwkJCT8gKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBzRmVhcmVkRXZlbnRzTGlicmFyeSkKKwkJCTogc0ZlYXJlZEV2ZW50c0xpYnJhcnk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTRmVhcmVkRXZlbnRzTGlicmFyeSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlicmFyeScgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NGZWFyZWQgRXZlbnRzIExpYnJhcnknIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KElTRmVhcmVkRXZlbnRzTGlicmFyeSBuZXdTRmVhcmVkRXZlbnRzTGlicmFyeSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0ZlYXJlZCBFdmVudHMgTGlicmFyeScgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTRmVhcmVkRXZlbnRzTGlicmFyeShJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgbmV3U0ZlYXJlZEV2ZW50c0xpYnJhcnkpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NGZWFyZWQgRXZlbnRzIExpYnJhcnknIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4gZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmxvY2tzIExBbmFseXNpcyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElTQmxvY2tMQW5hbHlzaXM+IGdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrcyBMQW5hbHlzaXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU1NZU1RFTV9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0U6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX1BhY2thZ2UoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlX1BhY2thZ2UoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU1NZU1RFTV9FVkVOVFNfTElCUkFSWToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVDoKKwkJCQlyZXR1cm4gZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIHNldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgc2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTQmxvY2tMQW5hbHlzaXM+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX0JBU0VfUEFDS0FHRToKKwkJCQlzZXRCYXNlX1BhY2thZ2UoKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlk6CisJCQkJc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKElTU3lzdGVtRXZlbnRzTGlicmFyeSkgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0ZFQVJFRF9FVkVOVFNfTElCUkFSWToKKwkJCQlzZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19TQkxPQ0tTX0xBTkFMWVNJU19MSVNUOgorCQkJCWdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNCbG9ja0xBbmFseXNpcz4pIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKElTU3lzdGVtRXZlbnRzTGlicmFyeSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIHNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19CQVNFX1BBQ0tBR0U6CisJCQkJc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlk6CisJCQkJc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKElTU3lzdGVtRXZlbnRzTGlicmFyeSkgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgorCQkJCXNldFNGZWFyZWRFdmVudHNMaWJyYXJ5KChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVDoKKwkJCQlnZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX0JBU0VfUEFDS0FHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9QYWNrYWdlICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19TRkVBUkVEX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU0JMT0NLU19MQU5BTFlTSVNfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIWdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fQkFTRV9QQUNLQUdFOgorCQkJCXJldHVybiBiYXNlX1BhY2thZ2UgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9BTkFMWVNJU19fU1NZU1RFTV9FVkVOVFNfTElCUkFSWToKKwkJCQlyZXR1cm4gYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVNfX1NGRUFSRURfRVZFTlRTX0xJQlJBUlk6CisJCQkJcmV0dXJuIGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTX19TQkxPQ0tTX0xBTkFMWVNJU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKS5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTTG9jYWxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NMb2NhbEV2ZW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0xvY2FsRXZlbnQuamF2YQppbmRleCAwM2I3YWJjLi40YzY1NGI3IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0xvY2FsRXZlbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU0xvY2FsRXZlbnQuamF2YQpAQCAtMzYsMTU2ICszNiwxNTYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIFNMb2NhbEV2ZW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKLSAgICBpbXBsZW1lbnRzIElTTG9jYWxFdmVudCB7CisJZXh0ZW5kcyBBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKKwlpbXBsZW1lbnRzIElTTG9jYWxFdmVudCB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1Byb3BlcnR5KCkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBQcm9wZXJ0eSBiYXNlX1Byb3BlcnR5OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0xvY2FsRXZlbnQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTTG9jYWxFdmVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TTE9DQUxfRVZFTlQ7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNMT0NBTF9FVkVOVDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgaWYgKGJhc2VfUHJvcGVydHkgIT0gbnVsbCAmJiBiYXNlX1Byb3BlcnR5LmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX1Byb3BlcnR5ID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgICAgIGJhc2VfUHJvcGVydHkgPSAoUHJvcGVydHkpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9Qcm9wZXJ0eSk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBvbGRCYXNlX1Byb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNMT0NBTF9FVkVOVF9fQkFTRV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfUHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKSB7CisJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG51bGwgJiYgYmFzZV9Qcm9wZXJ0eS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9Qcm9wZXJ0eSA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUHJvcGVydHk7CisJCQliYXNlX1Byb3BlcnR5ID0gKFByb3BlcnR5KSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUHJvcGVydHkpOworCQkJaWYgKGJhc2VfUHJvcGVydHkgIT0gb2xkQmFzZV9Qcm9wZXJ0eSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfRVZFTlRfX0JBU0VfUFJPUEVSVFksCisJCQkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJCQliYXNlX1Byb3BlcnR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBiYXNpY0dldEJhc2VfUHJvcGVydHkoKSB7CisJCXJldHVybiBiYXNlX1Byb3BlcnR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgewotICAgICAgICBQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgeworCQlQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKKwkJYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZLAorCQkJCQlvbGRCYXNlX1Byb3BlcnR5LAorCQkJCQliYXNlX1Byb3BlcnR5KSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfRVZFTlRfX0JBU0VfUFJPUEVSVFk6CisJCQkJc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfRVZFTlRfX0JBU0VfUFJPUEVSVFk6CisJCQkJc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5ICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UX19CQVNFX1BST1BFUlRZOgorCQkJCXJldHVybiBiYXNlX1Byb3BlcnR5ICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTTG9jYWxFdmVudApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NPckdhdGVMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TT3JHYXRlTEFuYWx5c2lzLmphdmEKaW5kZXggMWE3OThhMS4uZWQxZjViYyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NPckdhdGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU09yR2F0ZUxBbmFseXNpcy5qYXZhCkBAIC0zNiwxNTYgKzM2LDE1NiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU09yR2F0ZUxBbmFseXNpcwotICAgIGV4dGVuZHMgQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKLSAgICBpbXBsZW1lbnRzIElTT3JHYXRlTEFuYWx5c2lzIHsKKwlleHRlbmRzIEFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzCisJaW1wbGVtZW50cyBJU09yR2F0ZUxBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1Byb3BlcnR5KCkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBQcm9wZXJ0eSBiYXNlX1Byb3BlcnR5OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU09yR2F0ZUxBbmFseXNpcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNPckdhdGVMQW5hbHlzaXMoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU09SX0dBVEVfTEFOQUxZU0lTOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TT1JfR0FURV9MQU5BTFlTSVM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIGlmIChiYXNlX1Byb3BlcnR5ICE9IG51bGwgJiYgYmFzZV9Qcm9wZXJ0eS5lSXNQcm94eSgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9Qcm9wZXJ0eSA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUHJvcGVydHk7Ci0gICAgICAgICAgICBiYXNlX1Byb3BlcnR5ID0gKFByb3BlcnR5KSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUHJvcGVydHkpOwotICAgICAgICAgICAgaWYgKGJhc2VfUHJvcGVydHkgIT0gb2xkQmFzZV9Qcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TT1JfR0FURV9MQU5BTFlTSVNfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Qcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgeworCQlpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OworCQkJYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKKwkJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU09SX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZLAorCQkJCQkJCW9sZEJhc2VfUHJvcGVydHksCisJCQkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlX1Byb3BlcnR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eSBiYXNpY0dldEJhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJvcGVydHkgYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCkgeworCQlyZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IG5ld0Jhc2VfUHJvcGVydHkpIHsKLSAgICAgICAgUHJvcGVydHkgb2xkQmFzZV9Qcm9wZXJ0eSA9IGJhc2VfUHJvcGVydHk7Ci0gICAgICAgIGJhc2VfUHJvcGVydHkgPSBuZXdCYXNlX1Byb3BlcnR5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Qcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSkpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IG5ld0Jhc2VfUHJvcGVydHkpIHsKKwkJUHJvcGVydHkgb2xkQmFzZV9Qcm9wZXJ0eSA9IGJhc2VfUHJvcGVydHk7CisJCWJhc2VfUHJvcGVydHkgPSBuZXdCYXNlX1Byb3BlcnR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KAorCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJdGhpcywKKwkJCQkJTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWSwKKwkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldEJhc2VfUHJvcGVydHkoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU09SX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU09SX0dBVEVfTEFOQUxZU0lTX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJU19fQkFTRV9QUk9QRVJUWToKKwkJCQlyZXR1cm4gYmFzZV9Qcm9wZXJ0eSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CiAKIH0gLy8gU09yR2F0ZUxBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NQb3J0TEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1BvcnRMQW5hbHlzaXMuamF2YQppbmRleCBiMTBlYzIzLi41Yzk2N2Q5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1BvcnRMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1BvcnRMQW5hbHlzaXMuamF2YQpAQCAtNDQsMzYxICs0NCwzNjEgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIFNQb3J0TEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCi0gICAgaW1wbGVtZW50cyBJU1BvcnRMQW5hbHlzaXMgeworCWV4dGVuZHMgQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcgorCWltcGxlbWVudHMgSVNQb3J0TEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNQb3J0KCkgPGVtPlNQb3J0PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRTUG9ydCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTUG9ydCBzUG9ydDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTUG9ydCgpIDxlbT5TUG9ydDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0U1BvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJU1BvcnQgc1BvcnQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1BvcnQoKSA8ZW0+QmFzZSBQb3J0PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX1BvcnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBQb3J0IGJhc2VfUG9ydDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1BvcnQoKSA8ZW0+QmFzZSBQb3J0PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX1BvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQb3J0IGJhc2VfUG9ydDsKIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkgPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNEaXJlY3Rpb25MQW5hbHlzaXMgU0RJUkVDVElPTl9MQU5BTFlTSVNfRURFRkFVTFQgPSBTRGlyZWN0aW9uTEFuYWx5c2lzLklOOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkgPGVtPlNEaXJlY3Rpb24gTEFuYWx5c2lzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNEaXJlY3Rpb25MQW5hbHlzaXMgU0RJUkVDVElPTl9MQU5BTFlTSVNfRURFRkFVTFQgPSBTRGlyZWN0aW9uTEFuYWx5c2lzLklOOwogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpIDxlbT5TRGlyZWN0aW9uIExBbmFseXNpczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNEaXJlY3Rpb25MQW5hbHlzaXMgc0RpcmVjdGlvbkxBbmFseXNpcyA9IFNESVJFQ1RJT05fTEFOQUxZU0lTX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMoKSA8ZW0+U0RpcmVjdGlvbiBMQW5hbHlzaXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFNEaXJlY3Rpb25MQW5hbHlzaXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTRGlyZWN0aW9uTEFuYWx5c2lzIHNEaXJlY3Rpb25MQW5hbHlzaXMgPSBTRElSRUNUSU9OX0xBTkFMWVNJU19FREVGQVVMVDsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTUG9ydExBbmFseXNpcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNQb3J0TEFuYWx5c2lzKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNQT1JUX0xBTkFMWVNJUzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU1BPUlRfTEFOQUxZU0lTOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgSVNCbG9ja0xBbmFseXNpcyBzQmxvY2tMQW5hbHlzaXMgPSBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICByZXR1cm4gc0Jsb2NrTEFuYWx5c2lzICE9IG51bGwgJiYgc0Jsb2NrTEFuYWx5c2lzLmVJc1Byb3h5KCkKLSAgICAgICAgICAgID8gKElTQmxvY2tMQW5hbHlzaXMpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc0Jsb2NrTEFuYWx5c2lzKQotICAgICAgICAgICAgOiBzQmxvY2tMQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJSVNCbG9ja0xBbmFseXNpcyBzQmxvY2tMQW5hbHlzaXMgPSBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOworCQlyZXR1cm4gc0Jsb2NrTEFuYWx5c2lzICE9IG51bGwgJiYgc0Jsb2NrTEFuYWx5c2lzLmVJc1Byb3h5KCkKKwkJCT8gKElTQmxvY2tMQW5hbHlzaXMpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc0Jsb2NrTEFuYWx5c2lzKQorCQkJOiBzQmxvY2tMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTQmxvY2tMQW5hbHlzaXMgYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmxvY2sgTEFuYWx5c2lzJyByZWZlcmVuY2UKLSAgICAgICAgLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTQmxvY2tMQW5hbHlzaXMgYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTQmxvY2sgTEFuYWx5c2lzJyByZWZlcmVuY2UKKwkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyBuZXdTQmxvY2tMQW5hbHlzaXMpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NCbG9jayBMQW5hbHlzaXMnIHJlZmVyZW5jZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgbmV3U0Jsb2NrTEFuYWx5c2lzKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTQmxvY2sgTEFuYWx5c2lzJyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElTUG9ydCBnZXRTUG9ydCgpIHsKLSAgICAgICAgaWYgKHNQb3J0ICE9IG51bGwgJiYgc1BvcnQuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZFNQb3J0ID0gKEludGVybmFsRU9iamVjdCkgc1BvcnQ7Ci0gICAgICAgICAgICBzUG9ydCA9IChJU1BvcnQpIGVSZXNvbHZlUHJveHkob2xkU1BvcnQpOwotICAgICAgICAgICAgaWYgKHNQb3J0ICE9IG9sZFNQb3J0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BvcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc1BvcnQ7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU1BvcnQgZ2V0U1BvcnQoKSB7CisJCWlmIChzUG9ydCAhPSBudWxsICYmIHNQb3J0LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTUG9ydCA9IChJbnRlcm5hbEVPYmplY3QpIHNQb3J0OworCQkJc1BvcnQgPSAoSVNQb3J0KSBlUmVzb2x2ZVByb3h5KG9sZFNQb3J0KTsKKwkJCWlmIChzUG9ydCAhPSBvbGRTUG9ydCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NQT1JULAorCQkJCQkJCW9sZFNQb3J0LAorCQkJCQkJCXNQb3J0KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNQb3J0OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1BvcnQgYmFzaWNHZXRTUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHNQb3J0OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNQb3J0IGJhc2ljR2V0U1BvcnQoKSB7CisJCXJldHVybiBzUG9ydDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTUG9ydChJU1BvcnQgbmV3U1BvcnQpIHsKLSAgICAgICAgSVNQb3J0IG9sZFNQb3J0ID0gc1BvcnQ7Ci0gICAgICAgIHNQb3J0ID0gbmV3U1BvcnQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgb2xkU1BvcnQsCi0gICAgICAgICAgICAgICAgICAgIHNQb3J0KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNQb3J0KElTUG9ydCBuZXdTUG9ydCkgeworCQlJU1BvcnQgb2xkU1BvcnQgPSBzUG9ydDsKKwkJc1BvcnQgPSBuZXdTUG9ydDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NQT1JULAorCQkJCQlvbGRTUG9ydCwKKwkJCQkJc1BvcnQpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUG9ydCBnZXRCYXNlX1BvcnQoKSB7Ci0gICAgICAgIGlmIChiYXNlX1BvcnQgIT0gbnVsbCAmJiBiYXNlX1BvcnQuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUG9ydCA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUG9ydDsKLSAgICAgICAgICAgIGJhc2VfUG9ydCA9IChQb3J0KSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUG9ydCk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9Qb3J0ICE9IG9sZEJhc2VfUG9ydCkgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9Qb3J0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUG9ydDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBvcnQgZ2V0QmFzZV9Qb3J0KCkgeworCQlpZiAoYmFzZV9Qb3J0ICE9IG51bGwgJiYgYmFzZV9Qb3J0LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRCYXNlX1BvcnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1BvcnQ7CisJCQliYXNlX1BvcnQgPSAoUG9ydCkgZVJlc29sdmVQcm94eShvbGRCYXNlX1BvcnQpOworCQkJaWYgKGJhc2VfUG9ydCAhPSBvbGRCYXNlX1BvcnQpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19CQVNFX1BPUlQsCisJCQkJCQkJb2xkQmFzZV9Qb3J0LAorCQkJCQkJCWJhc2VfUG9ydCkpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlX1BvcnQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFBvcnQgYmFzaWNHZXRCYXNlX1BvcnQoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlX1BvcnQ7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3J0IGJhc2ljR2V0QmFzZV9Qb3J0KCkgeworCQlyZXR1cm4gYmFzZV9Qb3J0OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfUG9ydChQb3J0IG5ld0Jhc2VfUG9ydCkgewotICAgICAgICBQb3J0IG9sZEJhc2VfUG9ydCA9IGJhc2VfUG9ydDsKLSAgICAgICAgYmFzZV9Qb3J0ID0gbmV3QmFzZV9Qb3J0OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fQkFTRV9QT1JULAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1BvcnQsCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfUG9ydCkpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX1BvcnQoUG9ydCBuZXdCYXNlX1BvcnQpIHsKKwkJUG9ydCBvbGRCYXNlX1BvcnQgPSBiYXNlX1BvcnQ7CisJCWJhc2VfUG9ydCA9IG5ld0Jhc2VfUG9ydDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVCwKKwkJCQkJb2xkQmFzZV9Qb3J0LAorCQkJCQliYXNlX1BvcnQpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU0RpcmVjdGlvbkxBbmFseXNpcyBnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gc0RpcmVjdGlvbkxBbmFseXNpczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNEaXJlY3Rpb25MQW5hbHlzaXMgZ2V0U0RpcmVjdGlvbkxBbmFseXNpcygpIHsKKwkJcmV0dXJuIHNEaXJlY3Rpb25MQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0RpcmVjdGlvbkxBbmFseXNpcyhTRGlyZWN0aW9uTEFuYWx5c2lzIG5ld1NEaXJlY3Rpb25MQW5hbHlzaXMpIHsKLSAgICAgICAgU0RpcmVjdGlvbkxBbmFseXNpcyBvbGRTRGlyZWN0aW9uTEFuYWx5c2lzID0gc0RpcmVjdGlvbkxBbmFseXNpczsKLSAgICAgICAgc0RpcmVjdGlvbkxBbmFseXNpcyA9IG5ld1NEaXJlY3Rpb25MQW5hbHlzaXMgPT0gbnVsbCA/IFNESVJFQ1RJT05fTEFOQUxZU0lTX0VERUZBVUxUIDogbmV3U0RpcmVjdGlvbkxBbmFseXNpczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTLAotICAgICAgICAgICAgICAgICAgICBvbGRTRGlyZWN0aW9uTEFuYWx5c2lzLAotICAgICAgICAgICAgICAgICAgICBzRGlyZWN0aW9uTEFuYWx5c2lzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNEaXJlY3Rpb25MQW5hbHlzaXMoU0RpcmVjdGlvbkxBbmFseXNpcyBuZXdTRGlyZWN0aW9uTEFuYWx5c2lzKSB7CisJCVNEaXJlY3Rpb25MQW5hbHlzaXMgb2xkU0RpcmVjdGlvbkxBbmFseXNpcyA9IHNEaXJlY3Rpb25MQW5hbHlzaXM7CisJCXNEaXJlY3Rpb25MQW5hbHlzaXMgPSBuZXdTRGlyZWN0aW9uTEFuYWx5c2lzID09IG51bGwgPyBTRElSRUNUSU9OX0xBTkFMWVNJU19FREVGQVVMVCA6IG5ld1NEaXJlY3Rpb25MQW5hbHlzaXM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TRElSRUNUSU9OX0xBTkFMWVNJUywKKwkJCQkJb2xkU0RpcmVjdGlvbkxBbmFseXNpcywKKwkJCQkJc0RpcmVjdGlvbkxBbmFseXNpcykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TUE9SVDoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNQb3J0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U1BvcnQoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fQkFTRV9QT1JUOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9Qb3J0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0QmFzZV9Qb3J0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNCbG9ja0xBbmFseXNpcygpOworCQkJCXJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TUE9SVDoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNQb3J0KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U1BvcnQoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fQkFTRV9QT1JUOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0QmFzZV9Qb3J0KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9Qb3J0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTOgorCQkJCXJldHVybiBnZXRTRGlyZWN0aW9uTEFuYWx5c2lzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NQT1JUOgotICAgICAgICAgICAgICAgIHNldFNQb3J0KChJU1BvcnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVDoKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1BvcnQoKFBvcnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNEaXJlY3Rpb25MQW5hbHlzaXMoKFNEaXJlY3Rpb25MQW5hbHlzaXMpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NQT1JUOgorCQkJCXNldFNQb3J0KChJU1BvcnQpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVDoKKwkJCQlzZXRCYXNlX1BvcnQoKFBvcnQpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTOgorCQkJCXNldFNEaXJlY3Rpb25MQW5hbHlzaXMoKFNEaXJlY3Rpb25MQW5hbHlzaXMpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TUE9SVDoKLSAgICAgICAgICAgICAgICBzZXRTUG9ydCgoSVNQb3J0KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVDoKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1BvcnQoKFBvcnQpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0RJUkVDVElPTl9MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgc2V0U0RpcmVjdGlvbkxBbmFseXNpcyhTRElSRUNUSU9OX0xBTkFMWVNJU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCXNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TUE9SVDoKKwkJCQlzZXRTUG9ydCgoSVNQb3J0KSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVDoKKwkJCQlzZXRCYXNlX1BvcnQoKFBvcnQpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0RJUkVDVElPTl9MQU5BTFlTSVM6CisJCQkJc2V0U0RpcmVjdGlvbkxBbmFseXNpcyhTRElSRUNUSU9OX0xBTkFMWVNJU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU1BPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNQb3J0ICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX0JBU0VfUE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9Qb3J0ICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVNfX1NESVJFQ1RJT05fTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHJldHVybiBzRGlyZWN0aW9uTEFuYWx5c2lzICE9IFNESVJFQ1RJT05fTEFOQUxZU0lTX0VERUZBVUxUOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlyZXR1cm4gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BPUlRfTEFOQUxZU0lTX19TUE9SVDoKKwkJCQlyZXR1cm4gc1BvcnQgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fQkFTRV9QT1JUOgorCQkJCXJldHVybiBiYXNlX1BvcnQgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJU19fU0RJUkVDVElPTl9MQU5BTFlTSVM6CisJCQkJcmV0dXJuIHNEaXJlY3Rpb25MQW5hbHlzaXMgIT0gU0RJUkVDVElPTl9MQU5BTFlTSVNfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChzRGlyZWN0aW9uTEFuYWx5c2lzOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXN1bHQuYXBwZW5kKHNEaXJlY3Rpb25MQW5hbHlzaXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9CisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNEaXJlY3Rpb25MQW5hbHlzaXM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc0RpcmVjdGlvbkxBbmFseXNpcyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KIAogfSAvLyBTUG9ydExBbmFseXNpcwpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NQcm9wYWdhdGlvbkxpbmsuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TUHJvcGFnYXRpb25MaW5rLmphdmEKaW5kZXggYTg3OGU4OS4uYTFiMzAxMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NQcm9wYWdhdGlvbkxpbmsuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1Byb3BhZ2F0aW9uTGluay5qYXZhCkBAIC00MSwzMDYgKzQxLDMwNiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU1Byb3BhZ2F0aW9uTGluawotICAgIGV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKLSAgICBpbXBsZW1lbnRzIElTUHJvcGFnYXRpb25MaW5rIHsKKwlleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJaW1wbGVtZW50cyBJU1Byb3BhZ2F0aW9uTGluayB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX0RlcGVuZGVuY3koKSA8ZW0+QmFzZSBEZXBlbmRlbmN5PC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX0RlcGVuZGVuY3koKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBEZXBlbmRlbmN5IGJhc2VfRGVwZW5kZW5jeTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX0RlcGVuZGVuY3koKSA8ZW0+QmFzZSBEZXBlbmRlbmN5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX0RlcGVuZGVuY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBEZXBlbmRlbmN5IGJhc2VfRGVwZW5kZW5jeTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTUHJvcGFnYXRpb25MaW5rKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1Byb3BhZ2F0aW9uTGluaygpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TUFJPUEFHQVRJT05fTElOSzsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU1BST1BBR0FUSU9OX0xJTks7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudFRhcmdldCgpIHsKLSAgICAgICAgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBlbGVtZW50VGFyZ2V0ID0gYmFzaWNHZXRFbGVtZW50VGFyZ2V0KCk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50VGFyZ2V0ICE9IG51bGwgJiYgZWxlbWVudFRhcmdldC5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnRUYXJnZXQpCi0gICAgICAgICAgICA6IGVsZW1lbnRUYXJnZXQ7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IGdldEVsZW1lbnRUYXJnZXQoKSB7CisJCUlBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgZWxlbWVudFRhcmdldCA9IGJhc2ljR2V0RWxlbWVudFRhcmdldCgpOworCQlyZXR1cm4gZWxlbWVudFRhcmdldCAhPSBudWxsICYmIGVsZW1lbnRUYXJnZXQuZUlzUHJveHkoKQorCQkJPyAoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50VGFyZ2V0KQorCQkJOiBlbGVtZW50VGFyZ2V0OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IGJhc2ljR2V0RWxlbWVudFRhcmdldCgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0VsZW1lbnQgVGFyZ2V0JyByZWZlcmVuY2UKLSAgICAgICAgLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgYmFzaWNHZXRFbGVtZW50VGFyZ2V0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnRWxlbWVudCBUYXJnZXQnIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRUYXJnZXQoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBuZXdFbGVtZW50VGFyZ2V0KSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdFbGVtZW50IFRhcmdldCcgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VGFyZ2V0KElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgbmV3RWxlbWVudFRhcmdldCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnRWxlbWVudCBUYXJnZXQnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIElTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNCbG9ja0xBbmFseXNpcyAhPSBudWxsICYmIHNCbG9ja0xBbmFseXNpcy5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJU0Jsb2NrTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNCbG9ja0xBbmFseXNpcykKLSAgICAgICAgICAgIDogc0Jsb2NrTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoKSB7CisJCUlTQmxvY2tMQW5hbHlzaXMgc0Jsb2NrTEFuYWx5c2lzID0gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHNCbG9ja0xBbmFseXNpcyAhPSBudWxsICYmIHNCbG9ja0xBbmFseXNpcy5lSXNQcm94eSgpCisJCQk/IChJU0Jsb2NrTEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNCbG9ja0xBbmFseXNpcykKKwkJCTogc0Jsb2NrTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0Jsb2NrTEFuYWx5c2lzKElTQmxvY2tMQW5hbHlzaXMgbmV3U0Jsb2NrTEFuYWx5c2lzKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTQmxvY2sgTEFuYWx5c2lzJyByZWZlcmVuY2UKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIG5ld1NCbG9ja0xBbmFseXNpcykgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnU0Jsb2NrIExBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBEZXBlbmRlbmN5IGdldEJhc2VfRGVwZW5kZW5jeSgpIHsKLSAgICAgICAgaWYgKGJhc2VfRGVwZW5kZW5jeSAhPSBudWxsICYmIGJhc2VfRGVwZW5kZW5jeS5lSXNQcm94eSgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9EZXBlbmRlbmN5ID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9EZXBlbmRlbmN5OwotICAgICAgICAgICAgYmFzZV9EZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9EZXBlbmRlbmN5KTsKLSAgICAgICAgICAgIGlmIChiYXNlX0RlcGVuZGVuY3kgIT0gb2xkQmFzZV9EZXBlbmRlbmN5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9EZXBlbmRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfRGVwZW5kZW5jeSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlX0RlcGVuZGVuY3k7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZXBlbmRlbmN5IGdldEJhc2VfRGVwZW5kZW5jeSgpIHsKKwkJaWYgKGJhc2VfRGVwZW5kZW5jeSAhPSBudWxsICYmIGJhc2VfRGVwZW5kZW5jeS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9EZXBlbmRlbmN5ID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9EZXBlbmRlbmN5OworCQkJYmFzZV9EZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9EZXBlbmRlbmN5KTsKKwkJCWlmIChiYXNlX0RlcGVuZGVuY3kgIT0gb2xkQmFzZV9EZXBlbmRlbmN5KSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KAorCQkJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQkJCXRoaXMsCisJCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCisJCQkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1ksCisJCQkJCQkJb2xkQmFzZV9EZXBlbmRlbmN5LAorCQkJCQkJCWJhc2VfRGVwZW5kZW5jeSkpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlX0RlcGVuZGVuY3k7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERlcGVuZGVuY3kgYmFzaWNHZXRCYXNlX0RlcGVuZGVuY3koKSB7Ci0gICAgICAgIHJldHVybiBiYXNlX0RlcGVuZGVuY3k7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZXBlbmRlbmN5IGJhc2ljR2V0QmFzZV9EZXBlbmRlbmN5KCkgeworCQlyZXR1cm4gYmFzZV9EZXBlbmRlbmN5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfRGVwZW5kZW5jeShEZXBlbmRlbmN5IG5ld0Jhc2VfRGVwZW5kZW5jeSkgewotICAgICAgICBEZXBlbmRlbmN5IG9sZEJhc2VfRGVwZW5kZW5jeSA9IGJhc2VfRGVwZW5kZW5jeTsKLSAgICAgICAgYmFzZV9EZXBlbmRlbmN5ID0gbmV3QmFzZV9EZXBlbmRlbmN5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1ksCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfRGVwZW5kZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZV9EZXBlbmRlbmN5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfRGVwZW5kZW5jeShEZXBlbmRlbmN5IG5ld0Jhc2VfRGVwZW5kZW5jeSkgeworCQlEZXBlbmRlbmN5IG9sZEJhc2VfRGVwZW5kZW5jeSA9IGJhc2VfRGVwZW5kZW5jeTsKKwkJYmFzZV9EZXBlbmRlbmN5ID0gbmV3QmFzZV9EZXBlbmRlbmN5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KAorCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJdGhpcywKKwkJCQkJTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1ksCisJCQkJCW9sZEJhc2VfRGVwZW5kZW5jeSwKKwkJCQkJYmFzZV9EZXBlbmRlbmN5KSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudFNvdXJjZSgpIHsKLSAgICAgICAgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBlbGVtZW50U291cmNlID0gYmFzaWNHZXRFbGVtZW50U291cmNlKCk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50U291cmNlICE9IG51bGwgJiYgZWxlbWVudFNvdXJjZS5lSXNQcm94eSgpCi0gICAgICAgICAgICA/IChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnRTb3VyY2UpCi0gICAgICAgICAgICA6IGVsZW1lbnRTb3VyY2U7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IGdldEVsZW1lbnRTb3VyY2UoKSB7CisJCUlBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgZWxlbWVudFNvdXJjZSA9IGJhc2ljR2V0RWxlbWVudFNvdXJjZSgpOworCQlyZXR1cm4gZWxlbWVudFNvdXJjZSAhPSBudWxsICYmIGVsZW1lbnRTb3VyY2UuZUlzUHJveHkoKQorCQkJPyAoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkgZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50U291cmNlKQorCQkJOiBlbGVtZW50U291cmNlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IGJhc2ljR2V0RWxlbWVudFNvdXJjZSgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0VsZW1lbnQgU291cmNlJyByZWZlcmVuY2UKLSAgICAgICAgLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgYmFzaWNHZXRFbGVtZW50U291cmNlKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnRWxlbWVudCBTb3VyY2UnIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRTb3VyY2UoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBuZXdFbGVtZW50U291cmNlKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdFbGVtZW50IFNvdXJjZScgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbGVtZW50U291cmNlKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgbmV3RWxlbWVudFNvdXJjZSkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnRWxlbWVudCBTb3VyY2UnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fRUxFTUVOVF9UQVJHRVQ6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50VGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0RWxlbWVudFRhcmdldCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1k6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCYXNlX0RlcGVuZGVuY3koKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX0RlcGVuZGVuY3koKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRFbGVtZW50U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1RBUkdFVDoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldEVsZW1lbnRUYXJnZXQoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50VGFyZ2V0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fU0JMT0NLX0xBTkFMWVNJUzoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNCbG9ja0xBbmFseXNpcygpOworCQkJCXJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0JBU0VfREVQRU5ERU5DWToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldEJhc2VfRGVwZW5kZW5jeSgpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfRGVwZW5kZW5jeSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0RWxlbWVudFNvdXJjZSgpOworCQkJCXJldHVybiBiYXNpY0dldEVsZW1lbnRTb3VyY2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUOgotICAgICAgICAgICAgICAgIHNldEVsZW1lbnRUYXJnZXQoKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fU0JMT0NLX0xBTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTQmxvY2tMQW5hbHlzaXMoKElTQmxvY2tMQW5hbHlzaXMpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fQkFTRV9ERVBFTkRFTkNZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfRGVwZW5kZW5jeSgoRGVwZW5kZW5jeSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgICAgICAgICBzZXRFbGVtZW50U291cmNlKChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fRUxFTUVOVF9UQVJHRVQ6CisJCQkJc2V0RWxlbWVudFRhcmdldCgoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCXNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1k6CisJCQkJc2V0QmFzZV9EZXBlbmRlbmN5KChEZXBlbmRlbmN5KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFOgorCQkJCXNldEVsZW1lbnRTb3VyY2UoKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUOgotICAgICAgICAgICAgICAgIHNldEVsZW1lbnRUYXJnZXQoKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19TQkxPQ0tfTEFOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNCbG9ja0xBbmFseXNpcygoSVNCbG9ja0xBbmFseXNpcykgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0JBU0VfREVQRU5ERU5DWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX0RlcGVuZGVuY3koKERlcGVuZGVuY3kpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgICAgICAgICBzZXRFbGVtZW50U291cmNlKChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fRUxFTUVOVF9UQVJHRVQ6CisJCQkJc2V0RWxlbWVudFRhcmdldCgoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX1NCTE9DS19MQU5BTFlTSVM6CisJCQkJc2V0U0Jsb2NrTEFuYWx5c2lzKChJU0Jsb2NrTEFuYWx5c2lzKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fQkFTRV9ERVBFTkRFTkNZOgorCQkJCXNldEJhc2VfRGVwZW5kZW5jeSgoRGVwZW5kZW5jeSkgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFOgorCQkJCXNldEVsZW1lbnRTb3VyY2UoKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIG51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfVEFSR0VUOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEVsZW1lbnRUYXJnZXQoKSAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX1NCTE9DS19MQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19CQVNFX0RFUEVOREVOQ1k6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfRGVwZW5kZW5jeSAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTktfX0VMRU1FTlRfU09VUkNFOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEVsZW1lbnRTb3VyY2UoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1RBUkdFVDoKKwkJCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50VGFyZ2V0KCkgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19TQkxPQ0tfTEFOQUxZU0lTOgorCQkJCXJldHVybiBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUFJPUEFHQVRJT05fTElOS19fQkFTRV9ERVBFTkRFTkNZOgorCQkJCXJldHVybiBiYXNlX0RlcGVuZGVuY3kgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LX19FTEVNRU5UX1NPVVJDRToKKwkJCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50U291cmNlKCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNQcm9wYWdhdGlvbkxpbmsKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnQuamF2YQppbmRleCA1NTliYmRhLi4yODI0M2JlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1N5c3RlbUV2ZW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NTeXN0ZW1FdmVudC5qYXZhCkBAIC0zOCwyMDQgKzM4LDIwNCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU1N5c3RlbUV2ZW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMKLSAgICBpbXBsZW1lbnRzIElTU3lzdGVtRXZlbnQgeworCWV4dGVuZHMgQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCisJaW1wbGVtZW50cyBJU1N5c3RlbUV2ZW50IHsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9Qcm9wZXJ0eSgpIDxlbT5CYXNlIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHkgYmFzZV9Qcm9wZXJ0eTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTU3lzdGVtRXZlbnQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTU3lzdGVtRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU1NZU1RFTV9FVkVOVDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU1NZU1RFTV9FVkVOVDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgZ2V0QmFzZV9Qcm9wZXJ0eSgpIHsKLSAgICAgICAgaWYgKGJhc2VfUHJvcGVydHkgIT0gbnVsbCAmJiBiYXNlX1Byb3BlcnR5LmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX1Byb3BlcnR5ID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgICAgIGJhc2VfUHJvcGVydHkgPSAoUHJvcGVydHkpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9Qcm9wZXJ0eSk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBvbGRCYXNlX1Byb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9Qcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfUHJvcGVydHk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgeworCQlpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OworCQkJYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKKwkJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWSwKKwkJCQkJCQlvbGRCYXNlX1Byb3BlcnR5LAorCQkJCQkJCWJhc2VfUHJvcGVydHkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHkgYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIGJhc2VfUHJvcGVydHk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7Ci0gICAgICAgIFByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OwotICAgICAgICBiYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5TRVQsCi0gICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX19CQVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICBiYXNlX1Byb3BlcnR5KSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfUHJvcGVydHkoUHJvcGVydHkgbmV3QmFzZV9Qcm9wZXJ0eSkgeworCQlQcm9wZXJ0eSBvbGRCYXNlX1Byb3BlcnR5ID0gYmFzZV9Qcm9wZXJ0eTsKKwkJYmFzZV9Qcm9wZXJ0eSA9IG5ld0Jhc2VfUHJvcGVydHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWSwKKwkJCQkJb2xkQmFzZV9Qcm9wZXJ0eSwKKwkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50VHlwZSBnZXRUeXBlKCkgewotICAgICAgICBJU1N5c3RlbUV2ZW50VHlwZSB0eXBlID0gYmFzaWNHZXRUeXBlKCk7Ci0gICAgICAgIHJldHVybiB0eXBlICE9IG51bGwgJiYgdHlwZS5lSXNQcm94eSgpID8gKElTU3lzdGVtRXZlbnRUeXBlKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHR5cGUpIDogdHlwZTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTU3lzdGVtRXZlbnRUeXBlIGdldFR5cGUoKSB7CisJCUlTU3lzdGVtRXZlbnRUeXBlIHR5cGUgPSBiYXNpY0dldFR5cGUoKTsKKwkJcmV0dXJuIHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVJc1Byb3h5KCkgPyAoSVNTeXN0ZW1FdmVudFR5cGUpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgdHlwZSkgOiB0eXBlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50VHlwZSBiYXNpY0dldFR5cGUoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdUeXBlJyByZWZlcmVuY2UKLSAgICAgICAgLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTU3lzdGVtRXZlbnRUeXBlIGJhc2ljR2V0VHlwZSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1R5cGUnIHJlZmVyZW5jZQorCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoSVNTeXN0ZW1FdmVudFR5cGUgbmV3VHlwZSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnVHlwZScgcmVmZXJlbmNlCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKElTU3lzdGVtRXZlbnRUeXBlIG5ld1R5cGUpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1R5cGUnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfX1RZUEU6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX19CQVNFX1BST1BFUlRZOgorCQkJCWlmIChyZXNvbHZlKQorCQkJCQlyZXR1cm4gZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfUHJvcGVydHkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfX1RZUEU6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRUeXBlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VHlwZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fVFlQRToKLSAgICAgICAgICAgICAgICBzZXRUeXBlKChJU1N5c3RlbUV2ZW50VHlwZSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWToKKwkJCQlzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfX1RZUEU6CisJCQkJc2V0VHlwZSgoSVNTeXN0ZW1FdmVudFR5cGUpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fVFlQRToKLSAgICAgICAgICAgICAgICBzZXRUeXBlKChJU1N5c3RlbUV2ZW50VHlwZSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fQkFTRV9QUk9QRVJUWToKKwkJCQlzZXRCYXNlX1Byb3BlcnR5KChQcm9wZXJ0eSkgbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9fVFlQRToKKwkJCQlzZXRUeXBlKChJU1N5c3RlbUV2ZW50VHlwZSkgbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5ICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX19UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFR5cGUoKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfX0JBU0VfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfX1RZUEU6CisJCQkJcmV0dXJuIGJhc2ljR2V0VHlwZSgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTU3lzdGVtRXZlbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnRUeXBlLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1N5c3RlbUV2ZW50VHlwZS5qYXZhCmluZGV4IDA2NGY3ZTcuLmVlMWQxNWUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnRUeXBlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL1NTeXN0ZW1FdmVudFR5cGUuamF2YQpAQCAtNDYsMzA2ICs0NiwzMDYgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIFNTeXN0ZW1FdmVudFR5cGUKLSAgICBleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50Ci0gICAgaW1wbGVtZW50cyBJU1N5c3RlbUV2ZW50VHlwZSB7CisJZXh0ZW5kcyBBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAorCWltcGxlbWVudHMgSVNTeXN0ZW1FdmVudFR5cGUgewogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9DbGFzcygpIDxlbT5CYXNlIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzZV9DbGFzczsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX0NsYXNzKCkgPGVtPkJhc2UgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEJhc2VfQ2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNlX0NsYXNzOwogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZhaWx1cmVFdmVudCgpIDxlbT5TRmFpbHVyZSBFdmVudDwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0U0ZhaWx1cmVFdmVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElTRmFpbHVyZUV2ZW50IHNGYWlsdXJlRXZlbnQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZhaWx1cmVFdmVudCgpIDxlbT5TRmFpbHVyZSBFdmVudDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVFdmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIElTRmFpbHVyZUV2ZW50IHNGYWlsdXJlRXZlbnQ7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU1N5c3RlbUV2ZW50VHlwZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNTeXN0ZW1FdmVudFR5cGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuU1NZU1RFTV9FVkVOVF9UWVBFOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TU1lTVEVNX0VWRU5UX1RZUEU7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGdldEJhc2VfQ2xhc3MoKSB7Ci0gICAgICAgIGlmIChiYXNlX0NsYXNzICE9IG51bGwgJiYgYmFzZV9DbGFzcy5lSXNQcm94eSgpKSB7Ci0gICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9DbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfQ2xhc3M7Ci0gICAgICAgICAgICBiYXNlX0NsYXNzID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfQ2xhc3MpOwotICAgICAgICAgICAgaWYgKGJhc2VfQ2xhc3MgIT0gb2xkQmFzZV9DbGFzcykgewotICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZU5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0JBU0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCkgeworCQlpZiAoYmFzZV9DbGFzcyAhPSBudWxsICYmIGJhc2VfQ2xhc3MuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX0NsYXNzOworCQkJYmFzZV9DbGFzcyA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgZVJlc29sdmVQcm94eShvbGRCYXNlX0NsYXNzKTsKKwkJCWlmIChiYXNlX0NsYXNzICE9IG9sZEJhc2VfQ2xhc3MpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkoCisJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCQkJdGhpcywKKwkJCQkJCQlOb3RpZmljYXRpb24uUkVTT0xWRSwKKwkJCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTLAorCQkJCQkJCW9sZEJhc2VfQ2xhc3MsCisJCQkJCQkJYmFzZV9DbGFzcykpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlX0NsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNpY0dldEJhc2VfQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlX0NsYXNzOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzaWNHZXRCYXNlX0NsYXNzKCkgeworCQlyZXR1cm4gYmFzZV9DbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIG5ld0Jhc2VfQ2xhc3MpIHsKLSAgICAgICAgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3Mgb2xkQmFzZV9DbGFzcyA9IGJhc2VfQ2xhc3M7Ci0gICAgICAgIGJhc2VfQ2xhc3MgPSBuZXdCYXNlX0NsYXNzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgYmFzZV9DbGFzcykpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIG5ld0Jhc2VfQ2xhc3MpIHsKKwkJb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3Mgb2xkQmFzZV9DbGFzcyA9IGJhc2VfQ2xhc3M7CisJCWJhc2VfQ2xhc3MgPSBuZXdCYXNlX0NsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KAorCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJdGhpcywKKwkJCQkJTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUywKKwkJCQkJb2xkQmFzZV9DbGFzcywKKwkJCQkJYmFzZV9DbGFzcykpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0ZhaWx1cmVFdmVudCBnZXRTRmFpbHVyZUV2ZW50KCkgewotICAgICAgICBpZiAoc0ZhaWx1cmVFdmVudCAhPSBudWxsICYmIHNGYWlsdXJlRXZlbnQuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZFNGYWlsdXJlRXZlbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBzRmFpbHVyZUV2ZW50OwotICAgICAgICAgICAgc0ZhaWx1cmVFdmVudCA9IChJU0ZhaWx1cmVFdmVudCkgZVJlc29sdmVQcm94eShvbGRTRmFpbHVyZUV2ZW50KTsKLSAgICAgICAgICAgIGlmIChzRmFpbHVyZUV2ZW50ICE9IG9sZFNGYWlsdXJlRXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19TRkFJTFVSRV9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTRmFpbHVyZUV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNGYWlsdXJlRXZlbnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0ZhaWx1cmVFdmVudDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTRmFpbHVyZUV2ZW50IGdldFNGYWlsdXJlRXZlbnQoKSB7CisJCWlmIChzRmFpbHVyZUV2ZW50ICE9IG51bGwgJiYgc0ZhaWx1cmVFdmVudC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU0ZhaWx1cmVFdmVudCA9IChJbnRlcm5hbEVPYmplY3QpIHNGYWlsdXJlRXZlbnQ7CisJCQlzRmFpbHVyZUV2ZW50ID0gKElTRmFpbHVyZUV2ZW50KSBlUmVzb2x2ZVByb3h5KG9sZFNGYWlsdXJlRXZlbnQpOworCQkJaWYgKHNGYWlsdXJlRXZlbnQgIT0gb2xkU0ZhaWx1cmVFdmVudCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5ULAorCQkJCQkJCW9sZFNGYWlsdXJlRXZlbnQsCisJCQkJCQkJc0ZhaWx1cmVFdmVudCkpOworCQkJfQorCQl9CisJCXJldHVybiBzRmFpbHVyZUV2ZW50OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0ZhaWx1cmVFdmVudCBiYXNpY0dldFNGYWlsdXJlRXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiBzRmFpbHVyZUV2ZW50OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNGYWlsdXJlRXZlbnQgYmFzaWNHZXRTRmFpbHVyZUV2ZW50KCkgeworCQlyZXR1cm4gc0ZhaWx1cmVFdmVudDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTRmFpbHVyZUV2ZW50KElTRmFpbHVyZUV2ZW50IG5ld1NGYWlsdXJlRXZlbnQpIHsKLSAgICAgICAgSVNGYWlsdXJlRXZlbnQgb2xkU0ZhaWx1cmVFdmVudCA9IHNGYWlsdXJlRXZlbnQ7Ci0gICAgICAgIHNGYWlsdXJlRXZlbnQgPSBuZXdTRmFpbHVyZUV2ZW50OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU0ZBSUxVUkVfRVZFTlQsCi0gICAgICAgICAgICAgICAgICAgIG9sZFNGYWlsdXJlRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIHNGYWlsdXJlRXZlbnQpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0ZhaWx1cmVFdmVudChJU0ZhaWx1cmVFdmVudCBuZXdTRmFpbHVyZUV2ZW50KSB7CisJCUlTRmFpbHVyZUV2ZW50IG9sZFNGYWlsdXJlRXZlbnQgPSBzRmFpbHVyZUV2ZW50OworCQlzRmFpbHVyZUV2ZW50ID0gbmV3U0ZhaWx1cmVFdmVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5ULAorCQkJCQlvbGRTRmFpbHVyZUV2ZW50LAorCQkJCQlzRmFpbHVyZUV2ZW50KSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0PElTU3lzdGVtRXZlbnQ+IGdldEluc3RhbmNlc0xpc3QoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdJbnN0YW5jZXMgTGlzdCcgcmVmZXJlbmNlIGxpc3QKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxJU1N5c3RlbUV2ZW50PiBnZXRJbnN0YW5jZXNMaXN0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnSW5zdGFuY2VzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIElTU3lzdGVtRXZlbnRzTGlicmFyeSBzU3lzdGVtRXZlbnRzTGlicmFyeSA9IGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgcmV0dXJuIHNTeXN0ZW1FdmVudHNMaWJyYXJ5ICE9IG51bGwgJiYgc1N5c3RlbUV2ZW50c0xpYnJhcnkuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNTeXN0ZW1FdmVudHNMaWJyYXJ5KQotICAgICAgICAgICAgOiBzU3lzdGVtRXZlbnRzTGlicmFyeTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTU3lzdGVtRXZlbnRzTGlicmFyeSBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKKwkJSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHNTeXN0ZW1FdmVudHNMaWJyYXJ5ID0gYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCQlyZXR1cm4gc1N5c3RlbUV2ZW50c0xpYnJhcnkgIT0gbnVsbCAmJiBzU3lzdGVtRXZlbnRzTGlicmFyeS5lSXNQcm94eSgpCisJCQk/IChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc1N5c3RlbUV2ZW50c0xpYnJhcnkpCisJCQk6IHNTeXN0ZW1FdmVudHNMaWJyYXJ5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NTeXN0ZW0gRXZlbnRzIExpYnJhcnknIHJlZmVyZW5jZQotICAgICAgICAvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IGJhc2ljR2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTU3lzdGVtIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKKwkJLy8gLT4gZG8gbm90IHBlcmZvcm0gcHJveHkgcmVzb2x1dGlvbgorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTU3lzdGVtRXZlbnRzTGlicmFyeShJU1N5c3RlbUV2ZW50c0xpYnJhcnkgbmV3U1N5c3RlbUV2ZW50c0xpYnJhcnkpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgJ1NTeXN0ZW0gRXZlbnRzIExpYnJhcnknIHJlZmVyZW5jZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IG5ld1NTeXN0ZW1FdmVudHNMaWJyYXJ5KSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTU3lzdGVtIEV2ZW50cyBMaWJyYXJ5JyByZWZlcmVuY2UKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZV9DbGFzcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU0ZBSUxVUkVfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmFpbHVyZUV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0U0ZhaWx1cmVFdmVudCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19JTlNUQU5DRVNfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2VzTGlzdCgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0JBU0VfQ0xBU1M6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX0NsYXNzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9DbGFzcygpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19TRkFJTFVSRV9FVkVOVDoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNGYWlsdXJlRXZlbnQoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTRmFpbHVyZUV2ZW50KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUOgorCQkJCXJldHVybiBnZXRJbnN0YW5jZXNMaXN0KCk7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX1NTWVNURU1fRVZFTlRTX0xJQlJBUlk6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCQkJCXJldHVybiBiYXNpY0dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU0ZBSUxVUkVfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgc2V0U0ZhaWx1cmVFdmVudCgoSVNGYWlsdXJlRXZlbnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUOgotICAgICAgICAgICAgICAgIGdldEluc3RhbmNlc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldEluc3RhbmNlc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTU3lzdGVtRXZlbnQ+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgotICAgICAgICAgICAgICAgIHNldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fQkFTRV9DTEFTUzoKKwkJCQlzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU0ZBSUxVUkVfRVZFTlQ6CisJCQkJc2V0U0ZhaWx1cmVFdmVudCgoSVNGYWlsdXJlRXZlbnQpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUOgorCQkJCWdldEluc3RhbmNlc0xpc3QoKS5jbGVhcigpOworCQkJCWdldEluc3RhbmNlc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTU3lzdGVtRXZlbnQ+KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgorCQkJCXNldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5UOgotICAgICAgICAgICAgICAgIHNldFNGYWlsdXJlRXZlbnQoKElTRmFpbHVyZUV2ZW50KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUOgotICAgICAgICAgICAgICAgIGdldEluc3RhbmNlc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU1NZU1RFTV9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICBzZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU0ZBSUxVUkVfRVZFTlQ6CisJCQkJc2V0U0ZhaWx1cmVFdmVudCgoSVNGYWlsdXJlRXZlbnQpIG51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fSU5TVEFOQ0VTX0xJU1Q6CisJCQkJZ2V0SW5zdGFuY2VzTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19TU1lTVEVNX0VWRU5UU19MSUJSQVJZOgorCQkJCXNldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIG51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlX0NsYXNzICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBzRmFpbHVyZUV2ZW50ICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0SW5zdGFuY2VzTGlzdCgpLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU1NZU1RFTV9FVkVOVFNfTElCUkFSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFX19CQVNFX0NMQVNTOgorCQkJCXJldHVybiBiYXNlX0NsYXNzICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX1NGQUlMVVJFX0VWRU5UOgorCQkJCXJldHVybiBzRmFpbHVyZUV2ZW50ICE9IG51bGw7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEVfX0lOU1RBTkNFU19MSVNUOgorCQkJCXJldHVybiAhZ2V0SW5zdGFuY2VzTGlzdCgpLmlzRW1wdHkoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRfVFlQRV9fU1NZU1RFTV9FVkVOVFNfTElCUkFSWToKKwkJCQlyZXR1cm4gYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTU3lzdGVtRXZlbnRUeXBlCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnRzTGlicmFyeS5qYXZhCmluZGV4IDFkZWY2N2UuLmI5ODAyYzUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnRzTGlicmFyeS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TU3lzdGVtRXZlbnRzTGlicmFyeS5qYXZhCkBAIC00NCwyMzAgKzQ0LDIzMCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU1N5c3RlbUV2ZW50c0xpYnJhcnkKLSAgICBleHRlbmRzIEFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50Ci0gICAgaW1wbGVtZW50cyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgeworCWV4dGVuZHMgQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQKKwlpbXBsZW1lbnRzIElTU3lzdGVtRXZlbnRzTGlicmFyeSB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1BhY2thZ2UoKSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGJhc2VfUGFja2FnZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1BhY2thZ2UoKSA8ZW0+QmFzZSBQYWNrYWdlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX1BhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGJhc2VfUGFja2FnZTsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNTWVNURU1fRVZFTlRTX0xJQlJBUlk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNTWVNURU1fRVZFTlRTX0xJQlJBUlk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgZ2V0QmFzZV9QYWNrYWdlKCkgewotICAgICAgICBpZiAoYmFzZV9QYWNrYWdlICE9IG51bGwgJiYgYmFzZV9QYWNrYWdlLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX1BhY2thZ2UgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1BhY2thZ2U7Ci0gICAgICAgICAgICBiYXNlX1BhY2thZ2UgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1BhY2thZ2UpOwotICAgICAgICAgICAgaWYgKGJhc2VfUGFja2FnZSAhPSBvbGRCYXNlX1BhY2thZ2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX1BhY2thZ2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9QYWNrYWdlOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBnZXRCYXNlX1BhY2thZ2UoKSB7CisJCWlmIChiYXNlX1BhY2thZ2UgIT0gbnVsbCAmJiBiYXNlX1BhY2thZ2UuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUGFja2FnZSA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUGFja2FnZTsKKwkJCWJhc2VfUGFja2FnZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUGFja2FnZSk7CisJCQlpZiAoYmFzZV9QYWNrYWdlICE9IG9sZEJhc2VfUGFja2FnZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0UsCisJCQkJCQkJb2xkQmFzZV9QYWNrYWdlLAorCQkJCQkJCWJhc2VfUGFja2FnZSkpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlX1BhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgYmFzaWNHZXRCYXNlX1BhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlX1BhY2thZ2U7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIGJhc2ljR2V0QmFzZV9QYWNrYWdlKCkgeworCQlyZXR1cm4gYmFzZV9QYWNrYWdlOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfUGFja2FnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIG5ld0Jhc2VfUGFja2FnZSkgewotICAgICAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIG9sZEJhc2VfUGFja2FnZSA9IGJhc2VfUGFja2FnZTsKLSAgICAgICAgYmFzZV9QYWNrYWdlID0gbmV3QmFzZV9QYWNrYWdlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRSwKLSAgICAgICAgICAgICAgICAgICAgb2xkQmFzZV9QYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICBiYXNlX1BhY2thZ2UpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFzZV9QYWNrYWdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UgbmV3QmFzZV9QYWNrYWdlKSB7CisJCW9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb2xkQmFzZV9QYWNrYWdlID0gYmFzZV9QYWNrYWdlOworCQliYXNlX1BhY2thZ2UgPSBuZXdCYXNlX1BhY2thZ2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFLAorCQkJCQlvbGRCYXNlX1BhY2thZ2UsCisJCQkJCWJhc2VfUGFja2FnZSkpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJU1N5c3RlbUV2ZW50VHlwZT4gZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU1N5c3RlbSBFdmVudCBUeXBlcyBMaXN0JyByZWZlcmVuY2UgbGlzdAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PElTU3lzdGVtRXZlbnRUeXBlPiBnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdTU3lzdGVtIEV2ZW50IFR5cGVzIExpc3QnIHJlZmVyZW5jZSBsaXN0CisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgZ2V0U0xvY2FsQW5hbHlzaXMoKSB7Ci0gICAgICAgIElTTG9jYWxBbmFseXNpcyBzTG9jYWxBbmFseXNpcyA9IGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHNMb2NhbEFuYWx5c2lzICE9IG51bGwgJiYgc0xvY2FsQW5hbHlzaXMuZUlzUHJveHkoKQotICAgICAgICAgICAgPyAoSVNMb2NhbEFuYWx5c2lzKSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHNMb2NhbEFuYWx5c2lzKQotICAgICAgICAgICAgOiBzTG9jYWxBbmFseXNpczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTTG9jYWxBbmFseXNpcyBnZXRTTG9jYWxBbmFseXNpcygpIHsKKwkJSVNMb2NhbEFuYWx5c2lzIHNMb2NhbEFuYWx5c2lzID0gYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpOworCQlyZXR1cm4gc0xvY2FsQW5hbHlzaXMgIT0gbnVsbCAmJiBzTG9jYWxBbmFseXNpcy5lSXNQcm94eSgpCisJCQk/IChJU0xvY2FsQW5hbHlzaXMpIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgc0xvY2FsQW5hbHlzaXMpCisJCQk6IHNMb2NhbEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NMb2NhbCBBbmFseXNpcycgcmVmZXJlbmNlCi0gICAgICAgIC8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1NMb2NhbCBBbmFseXNpcycgcmVmZXJlbmNlCisJCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIG5ld1NMb2NhbEFuYWx5c2lzKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTTG9jYWwgQW5hbHlzaXMnIHJlZmVyZW5jZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIG5ld1NMb2NhbEFuYWx5c2lzKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdTTG9jYWwgQW5hbHlzaXMnIHJlZmVyZW5jZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NTWVNURU1fRVZFTlRfVFlQRVNfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVM6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTTG9jYWxBbmFseXNpcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRToKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldEJhc2VfUGFja2FnZSgpOworCQkJCXJldHVybiBiYXNpY0dldEJhc2VfUGFja2FnZSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU1NZU1RFTV9FVkVOVF9UWVBFU19MSVNUOgorCQkJCXJldHVybiBnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKTsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKKwkJCQlpZiAocmVzb2x2ZSkKKwkJCQkJcmV0dXJuIGdldFNMb2NhbEFuYWx5c2lzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fQkFTRV9QQUNLQUdFOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUGFja2FnZSgob3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NTWVNURU1fRVZFTlRfVFlQRVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldFNTeXN0ZW1FdmVudFR5cGVzTGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVNTeXN0ZW1FdmVudFR5cGU+KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTOgotICAgICAgICAgICAgICAgIHNldFNMb2NhbEFuYWx5c2lzKChJU0xvY2FsQW5hbHlzaXMpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRToKKwkJCQlzZXRCYXNlX1BhY2thZ2UoKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TU1lTVEVNX0VWRU5UX1RZUEVTX0xJU1Q6CisJCQkJZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTU3lzdGVtRXZlbnRUeXBlPikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKKwkJCQlzZXRTTG9jYWxBbmFseXNpcygoSVNMb2NhbEFuYWx5c2lzKSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX0JBU0VfUEFDS0FHRToKLSAgICAgICAgICAgICAgICBzZXRCYXNlX1BhY2thZ2UoKG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2UpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NTWVNURU1fRVZFTlRfVFlQRVNfTElTVDoKLSAgICAgICAgICAgICAgICBnZXRTU3lzdGVtRXZlbnRUeXBlc0xpc3QoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUllfX1NMT0NBTF9BTkFMWVNJUzoKLSAgICAgICAgICAgICAgICBzZXRTTG9jYWxBbmFseXNpcygoSVNMb2NhbEFuYWx5c2lzKSBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6CisJCQkJc2V0QmFzZV9QYWNrYWdlKChvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TU1lTVEVNX0VWRU5UX1RZUEVTX0xJU1Q6CisJCQkJZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19TTE9DQUxfQU5BTFlTSVM6CisJCQkJc2V0U0xvY2FsQW5hbHlzaXMoKElTTG9jYWxBbmFseXNpcykgbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfUGFja2FnZSAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU1NZU1RFTV9FVkVOVF9UWVBFU19MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiAhZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTOgotICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UU19MSUJSQVJZX19CQVNFX1BBQ0tBR0U6CisJCQkJcmV0dXJuIGJhc2VfUGFja2FnZSAhPSBudWxsOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU1NZU1RFTV9FVkVOVF9UWVBFU19MSVNUOgorCQkJCXJldHVybiAhZ2V0U1N5c3RlbUV2ZW50VHlwZXNMaXN0KCkuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWV9fU0xPQ0FMX0FOQUxZU0lTOgorCQkJCXJldHVybiBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNTeXN0ZW1FdmVudHNMaWJyYXJ5CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvU1VudGltZWx5RmFpbHVyZU1vZGUuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCmluZGV4IDZiNDkzNWEuLjZhN2E5NjkgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCkBAIC0zNiwxNTYgKzM2LDE1NiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU1VudGltZWx5RmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIEFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgaW1wbGVtZW50cyBJU1VudGltZWx5RmFpbHVyZU1vZGUgeworCWV4dGVuZHMgQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKKwlpbXBsZW1lbnRzIElTVW50aW1lbHlGYWlsdXJlTW9kZSB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlX1Byb3BlcnR5KCkgPGVtPkJhc2UgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldEJhc2VfUHJvcGVydHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBQcm9wZXJ0eSBiYXNlX1Byb3BlcnR5OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfUHJvcGVydHkoKSA8ZW0+QmFzZSBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QmFzZV9Qcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5IGJhc2VfUHJvcGVydHk7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU1VudGltZWx5RmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTVW50aW1lbHlGYWlsdXJlTW9kZSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TVU5USU1FTFlfRkFJTFVSRV9NT0RFOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5TVU5USU1FTFlfRkFJTFVSRV9NT0RFOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eSBnZXRCYXNlX1Byb3BlcnR5KCkgewotICAgICAgICBpZiAoYmFzZV9Qcm9wZXJ0eSAhPSBudWxsICYmIGJhc2VfUHJvcGVydHkuZUlzUHJveHkoKSkgewotICAgICAgICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2VfUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBiYXNlX1Byb3BlcnR5OwotICAgICAgICAgICAgYmFzZV9Qcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZVJlc29sdmVQcm94eShvbGRCYXNlX1Byb3BlcnR5KTsKLSAgICAgICAgICAgIGlmIChiYXNlX1Byb3BlcnR5ICE9IG9sZEJhc2VfUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uUkVTT0xWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX1Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfUHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGdldEJhc2VfUHJvcGVydHkoKSB7CisJCWlmIChiYXNlX1Byb3BlcnR5ICE9IG51bGwgJiYgYmFzZV9Qcm9wZXJ0eS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9Qcm9wZXJ0eSA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfUHJvcGVydHk7CisJCQliYXNlX1Byb3BlcnR5ID0gKFByb3BlcnR5KSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfUHJvcGVydHkpOworCQkJaWYgKGJhc2VfUHJvcGVydHkgIT0gb2xkQmFzZV9Qcm9wZXJ0eSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TVU5USU1FTFlfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZLAorCQkJCQkJCW9sZEJhc2VfUHJvcGVydHksCisJCQkJCQkJYmFzZV9Qcm9wZXJ0eSkpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlX1Byb3BlcnR5OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eSBiYXNpY0dldEJhc2VfUHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlX1Byb3BlcnR5OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJvcGVydHkgYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCkgeworCQlyZXR1cm4gYmFzZV9Qcm9wZXJ0eTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlX1Byb3BlcnR5KFByb3BlcnR5IG5ld0Jhc2VfUHJvcGVydHkpIHsKLSAgICAgICAgUHJvcGVydHkgb2xkQmFzZV9Qcm9wZXJ0eSA9IGJhc2VfUHJvcGVydHk7Ci0gICAgICAgIGJhc2VfUHJvcGVydHkgPSBuZXdCYXNlX1Byb3BlcnR5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlNFVCwKLSAgICAgICAgICAgICAgICAgICAgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIG9sZEJhc2VfUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfUHJvcGVydHkpKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFzZV9Qcm9wZXJ0eShQcm9wZXJ0eSBuZXdCYXNlX1Byb3BlcnR5KSB7CisJCVByb3BlcnR5IG9sZEJhc2VfUHJvcGVydHkgPSBiYXNlX1Byb3BlcnR5OworCQliYXNlX1Byb3BlcnR5ID0gbmV3QmFzZV9Qcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeSgKKwkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCisJCQkJCXRoaXMsCisJCQkJCU5vdGlmaWNhdGlvbi5TRVQsCisJCQkJCUlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TVU5USU1FTFlfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZLAorCQkJCQlvbGRCYXNlX1Byb3BlcnR5LAorCQkJCQliYXNlX1Byb3BlcnR5KSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX1Byb3BlcnR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX1Byb3BlcnR5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9Qcm9wZXJ0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TVU5USU1FTFlfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgotICAgICAgICAgICAgICAgIHNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TVU5USU1FTFlfRkFJTFVSRV9NT0RFX19CQVNFX1BST1BFUlRZOgorCQkJCXNldEJhc2VfUHJvcGVydHkoKFByb3BlcnR5KSBuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJc2V0QmFzZV9Qcm9wZXJ0eSgoUHJvcGVydHkpIG51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1VOVElNRUxZX0ZBSUxVUkVfTU9ERV9fQkFTRV9QUk9QRVJUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZV9Qcm9wZXJ0eSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREVfX0JBU0VfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGJhc2VfUHJvcGVydHkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiB9IC8vIFNVbnRpbWVseUZhaWx1cmVNb2RlCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL3V0aWwvRVNGTG9jYWxBbmFseXNpc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL3V0aWwvRVNGTG9jYWxBbmFseXNpc0FkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggOTFjYzhlOS4uZDQ4ZDk2YyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy91dGlsL0VTRkxvY2FsQW5hbHlzaXNBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvdXRpbC9FU0ZMb2NhbEFuYWx5c2lzQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMzMsNjYyICszMyw2NjIgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNBZGFwdGVyRmFjdG9yeQotICAgIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwlleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZSBtb2RlbFBhY2thZ2U7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVTRkxvY2FsQW5hbHlzaXNBZGFwdGVyRmFjdG9yeSgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFOwotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVNGTG9jYWxBbmFseXNpc0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZQotICAgICAqIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2UKKwkgKiBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFU0ZMb2NhbEFuYWx5c2lzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNTd2l0Y2g8QWRhcHRlcj4oKSB7CisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFU0ZMb2NhbEFuYWx5c2lzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNTd2l0Y2g8QWRhcHRlcj4oKSB7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnRBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNQb3J0TEFuYWx5c2lzKElTUG9ydExBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTUG9ydExBbmFseXNpc0FkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNQb3J0TEFuYWx5c2lzKElTUG9ydExBbmFseXNpcyBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVTUG9ydExBbmFseXNpc0FkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyQWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcihJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyQWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudEFkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU1Byb3BhZ2F0aW9uTGluayhJU1Byb3BhZ2F0aW9uTGluayBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTUHJvcGFnYXRpb25MaW5rQWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlU1Byb3BhZ2F0aW9uTGluayhJU1Byb3BhZ2F0aW9uTGluayBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVTUHJvcGFnYXRpb25MaW5rQWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTQmxvY2tMQW5hbHlzaXNBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVTQmxvY2tMQW5hbHlzaXNBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0FkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyhJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0FkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzQWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzQWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTQmFycmllckxBbmFseXNpcyhJU0JhcnJpZXJMQW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU0JhcnJpZXJMQW5hbHlzaXNBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VTQmFycmllckxBbmFseXNpcyhJU0JhcnJpZXJMQW5hbHlzaXMgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlU0JhcnJpZXJMQW5hbHlzaXNBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTTG9jYWxBbmFseXNpc0FkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNMb2NhbEFuYWx5c2lzKElTTG9jYWxBbmFseXNpcyBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVTTG9jYWxBbmFseXNpc0FkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5QWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlU1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5QWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTU3lzdGVtRXZlbnRUeXBlKElTU3lzdGVtRXZlbnRUeXBlIG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNTeXN0ZW1FdmVudFR5cGVBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VTU3lzdGVtRXZlbnRUeXBlKElTU3lzdGVtRXZlbnRUeXBlIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNTeXN0ZW1FdmVudFR5cGVBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNTeXN0ZW1FdmVudChJU1N5c3RlbUV2ZW50IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNTeXN0ZW1FdmVudEFkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNTeXN0ZW1FdmVudChJU1N5c3RlbUV2ZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNTeXN0ZW1FdmVudEFkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5QWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlU0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5QWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTRmVhcmVkRXZlbnRzRmFtaWx5KElTRmVhcmVkRXZlbnRzRmFtaWx5IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHlBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VTRmVhcmVkRXZlbnRzRmFtaWx5KElTRmVhcmVkRXZlbnRzRmFtaWx5IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHlBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNGZWFyZWRFdmVudChJU0ZlYXJlZEV2ZW50IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudEFkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNGZWFyZWRFdmVudChJU0ZlYXJlZEV2ZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNGZWFyZWRFdmVudEFkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbihJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uQWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbihJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uQWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTQW5kR2F0ZUxBbmFseXNpcyhJU0FuZEdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXNBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VTQW5kR2F0ZUxBbmFseXNpcyhJU0FuZEdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXNBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNPckdhdGVMQW5hbHlzaXMoSVNPckdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU09yR2F0ZUxBbmFseXNpc0FkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNPckdhdGVMQW5hbHlzaXMoSVNPckdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlU09yR2F0ZUxBbmFseXNpc0FkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU1VudGltZWx5RmFpbHVyZU1vZGUoSVNVbnRpbWVseUZhaWx1cmVNb2RlIG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlQWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlU1VudGltZWx5RmFpbHVyZU1vZGUoSVNVbnRpbWVseUZhaWx1cmVNb2RlIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlQWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VTQWJzZW50RmFpbHVyZU1vZGUoSVNBYnNlbnRGYWlsdXJlTW9kZSBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGVBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VTQWJzZW50RmFpbHVyZU1vZGUoSVNBYnNlbnRGYWlsdXJlTW9kZSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGVBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNFcnJvbmVvdXNGYWlsdXJlTW9kZShJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNFcnJvbmVvdXNGYWlsdXJlTW9kZUFkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNFcnJvbmVvdXNGYWlsdXJlTW9kZShJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNFcnJvbmVvdXNGYWlsdXJlTW9kZUFkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlU0xvY2FsRXZlbnQoSVNMb2NhbEV2ZW50IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNMb2NhbEV2ZW50QWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlU0xvY2FsRXZlbnQoSVNMb2NhbEV2ZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNMb2NhbEV2ZW50QWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNFbGVtZW50KElBYnN0cmFjdFNFbGVtZW50IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0VsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNFbGVtZW50KElBYnN0cmFjdFNFbGVtZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U0VsZW1lbnRBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdEFkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdEFkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMoSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzIG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzQWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMoSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzQWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgICAgfQotICAgIH07CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCX0KKwl9OwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLSAgICAgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MKLSAgICAgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgPGVtPkFic3RyYWN0IFNMb2NhbCBBbmFseXNpcwotICAgICAqIEVsZW1lbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCA8ZW0+QWJzdHJhY3QgU0xvY2FsIEFuYWx5c2lzCisJICogRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzIDxlbT5TUG9ydAotICAgICAqIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQb3J0TEFuYWx5c2lzCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNQb3J0TEFuYWx5c2lzQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcyA8ZW0+U1BvcnQKKwkgKiBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUG9ydExBbmFseXNpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTUG9ydExBbmFseXNpc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCi0gICAgICogPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKKwkgKiA8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIDxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlCi0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXNBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUKKwkgKiBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCA8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzCisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCA8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsKLSAgICAgKiA8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNQcm9wYWdhdGlvbkxpbmtBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNQcm9wYWdhdGlvbkxpbmsKKwkgKiA8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTUHJvcGFnYXRpb25MaW5rCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNQcm9wYWdhdGlvbkxpbmtBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Jsb2NrTEFuYWx5c2lzCi0gICAgICogPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0Jsb2NrTEFuYWx5c2lzQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmxvY2tMQW5hbHlzaXMKKwkgKiA8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNCbG9ja0xBbmFseXNpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTQmxvY2tMQW5hbHlzaXNBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcwotICAgICAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgPGVtPkFic3RyYWN0IFNGYWlsdXJlIEV2ZW50Ci0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0FkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcworCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgPGVtPkFic3RyYWN0IFNGYWlsdXJlIEV2ZW50CisJICogTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzIDxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlCi0gICAgICogTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXNBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMgPGVtPkFic3RyYWN0IFNMb2dpY2FsIEdhdGUKKwkgKiBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcwotICAgICAqIDxlbT5TQmFycmllciBMQW5hbHlzaXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQmFycmllckxBbmFseXNpcwotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTQmFycmllckxBbmFseXNpc0FkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMKKwkgKiA8ZW0+U0JhcnJpZXIgTEFuYWx5c2lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0JhcnJpZXJMQW5hbHlzaXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0JhcnJpZXJMQW5hbHlzaXNBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMgPGVtPlNMb2NhbAotICAgICAqIEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0xvY2FsQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0xvY2FsQW5hbHlzaXNBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzIDxlbT5TTG9jYWwKKwkgKiBBbmFseXNpczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEFuYWx5c2lzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNMb2NhbEFuYWx5c2lzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgICogPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRzTGlicmFyeQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50c0xpYnJhcnkKKwkgKiA8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudHNMaWJyYXJ5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUKLSAgICAgKiA8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50VHlwZQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnRUeXBlCisJICogPGVtPlNTeXN0ZW0gRXZlbnQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1N5c3RlbUV2ZW50VHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTU3lzdGVtRXZlbnQgPGVtPlNTeXN0ZW0KLSAgICAgKiBFdmVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTU3lzdGVtRXZlbnRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNTeXN0ZW1FdmVudCA8ZW0+U1N5c3RlbQorCSAqIEV2ZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1N5c3RlbUV2ZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNTeXN0ZW1FdmVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAqIDxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0xpYnJhcnkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnlBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNMaWJyYXJ5CisJICogPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzTGlicmFyeQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5Ci0gICAgICogPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudHNGYW1pbHkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0ZlYXJlZEV2ZW50c0ZhbWlseUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50c0ZhbWlseQorCSAqIDxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnRzRmFtaWx5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0ZlYXJlZEV2ZW50IDxlbT5TRmVhcmVkCi0gICAgICogRXZlbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0ZlYXJlZEV2ZW50QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRmVhcmVkRXZlbnQgPGVtPlNGZWFyZWQKKwkgKiBFdmVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNGZWFyZWRFdmVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTRmVhcmVkRXZlbnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgICAqIDxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgorCSAqIDxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQW5kR2F0ZUxBbmFseXNpcwotICAgICAqIDxlbT5TQW5kIEdhdGUgTEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0FuZEdhdGVMQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXNBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNBbmRHYXRlTEFuYWx5c2lzCisJICogPGVtPlNBbmQgR2F0ZSBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTQW5kR2F0ZUxBbmFseXNpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTQW5kR2F0ZUxBbmFseXNpc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTT3JHYXRlTEFuYWx5c2lzIDxlbT5TT3IKLSAgICAgKiBHYXRlIExBbmFseXNpczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNPckdhdGVMQW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU09yR2F0ZUxBbmFseXNpc0FkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU09yR2F0ZUxBbmFseXNpcyA8ZW0+U09yCisJICogR2F0ZSBMQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTT3JHYXRlTEFuYWx5c2lzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXNBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUKLSAgICAgKiA8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNVbnRpbWVseUZhaWx1cmVNb2RlCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTVW50aW1lbHlGYWlsdXJlTW9kZQorCSAqIDxlbT5TVW50aW1lbHkgRmFpbHVyZSBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU1VudGltZWx5RmFpbHVyZU1vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1VudGltZWx5RmFpbHVyZU1vZGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlCi0gICAgICogPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNBYnNlbnRGYWlsdXJlTW9kZUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlCisJICogPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmbG9jYWxhbmFseXNpcy5JU0Fic2VudEZhaWx1cmVNb2RlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNBYnNlbnRGYWlsdXJlTW9kZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICAgKiA8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUKKwkgKiA8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTRXJyb25lb3VzRmFpbHVyZU1vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50IDxlbT5TTG9jYWwKLSAgICAgKiBFdmVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmxvY2FsYW5hbHlzaXMuSVNMb2NhbEV2ZW50Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNMb2NhbEV2ZW50QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxFdmVudCA8ZW0+U0xvY2FsCisJICogRXZlbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zsb2NhbGFuYWx5c2lzLklTTG9jYWxFdmVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTTG9jYWxFdmVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNFbGVtZW50IDxlbT5BYnN0cmFjdAotICAgICAqIFNFbGVtZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTRWxlbWVudAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNFbGVtZW50IDxlbT5BYnN0cmFjdAorCSAqIFNFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQKLSAgICAgKiA8ZW0+QWJzdHJhY3QgU1NhZmV0eSBDb25jZXB0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTU2FmZXR5Q29uY2VwdAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNTYWZldHlDb25jZXB0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNTYWZldHlDb25jZXB0CisJICogPGVtPkFic3RyYWN0IFNTYWZldHkgQ29uY2VwdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNTYWZldHlBbmFseXNpcwotICAgICAqIDxlbT5BYnN0cmFjdCBTU2FmZXR5IEFuYWx5c2lzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXNBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzCisJICogPGVtPkFic3RyYWN0IFNTYWZldHkgQW5hbHlzaXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNTYWZldHlBbmFseXNpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNTYWZldHlBbmFseXNpc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAogfSAvLyBFU0ZMb2NhbEFuYWx5c2lzQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvdXRpbC9FU0ZMb2NhbEFuYWx5c2lzU3dpdGNoLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL3V0aWwvRVNGTG9jYWxBbmFseXNpc1N3aXRjaC5qYXZhCmluZGV4IDNhMGYwOGMuLjk5NDc3N2QgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvdXRpbC9FU0ZMb2NhbEFuYWx5c2lzU3dpdGNoLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy91dGlsL0VTRkxvY2FsQW5hbHlzaXNTd2l0Y2guamF2YQpAQCAtMzYsODU4ICszNiw4NTggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNTd2l0Y2g8VD4KLSAgICBleHRlbmRzIFN3aXRjaDxUPiB7CisJZXh0ZW5kcyBTd2l0Y2g8VD4gewogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlIG1vZGVsUGFja2FnZTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1N3aXRjaCgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFOwotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1N3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZVBhY2thZ2UgdGhlIHBhY2thZ2UgaW4gcXVlc3Rpb24uCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N3aXRjaEZvcihFUGFja2FnZSBlUGFja2FnZSkgewotICAgICAgICByZXR1cm4gZVBhY2thZ2UgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGlzIGEgc3dpdGNoIGZvciB0aGUgZ2l2ZW4gcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBlUGFja2FnZSB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbi4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzU3dpdGNoRm9yKEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCXJldHVybiBlUGFja2FnZSA9PSBtb2RlbFBhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdAotICAgICAqIHJlc3VsdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotICAgICAgICBzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0xPQ0FMX0FOQUxZU0lTX0VMRU1FTlQ6IHsKLSAgICAgICAgICAgICAgICBJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAoSUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KGFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KGFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KGFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TUE9SVF9MQU5BTFlTSVM6IHsKLSAgICAgICAgICAgICAgICBJU1BvcnRMQW5hbHlzaXMgc1BvcnRMQW5hbHlzaXMgPSAoSVNQb3J0TEFuYWx5c2lzKSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNQb3J0TEFuYWx5c2lzKHNQb3J0TEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKHNQb3J0TEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzUG9ydExBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzUG9ydExBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzUG9ydExBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9PV05FUjogewotICAgICAgICAgICAgICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgPSAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpIHRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcihhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfTU9ERV9MQU5BTFlTSVM6IHsKLSAgICAgICAgICAgICAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgICAgICAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KGFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TUFJPUEFHQVRJT05fRUxFTUVOVDogewotICAgICAgICAgICAgICAgIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50ID0gKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQUk9QQUdBVElPTl9MSU5LOiB7Ci0gICAgICAgICAgICAgICAgSVNQcm9wYWdhdGlvbkxpbmsgc1Byb3BhZ2F0aW9uTGluayA9IChJU1Byb3BhZ2F0aW9uTGluaykgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTUHJvcGFnYXRpb25MaW5rKHNQcm9wYWdhdGlvbkxpbmspOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNQcm9wYWdhdGlvbkxpbmspOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc1Byb3BhZ2F0aW9uTGluayk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzUHJvcGFnYXRpb25MaW5rKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkxPQ0tfTEFOQUxZU0lTOiB7Ci0gICAgICAgICAgICAgICAgSVNCbG9ja0xBbmFseXNpcyBzQmxvY2tMQW5hbHlzaXMgPSAoSVNCbG9ja0xBbmFseXNpcykgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTQmxvY2tMQW5hbHlzaXMoc0Jsb2NrTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzQmxvY2tMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0Jsb2NrTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNCbG9ja0xBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0ZBSUxVUkVfRVZFTlRfTEFOQUxZU0lTOiB7Ci0gICAgICAgICAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyBhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgICAgICAoSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcykgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuQUJTVFJBQ1RfU0xPR0lDQUxfR0FURV9MQU5BTFlTSVM6IHsKLSAgICAgICAgICAgICAgICBJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMgYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgICAgICAoSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KGFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQkFSUklFUl9MQU5BTFlTSVM6IHsKLSAgICAgICAgICAgICAgICBJU0JhcnJpZXJMQW5hbHlzaXMgc0JhcnJpZXJMQW5hbHlzaXMgPSAoSVNCYXJyaWVyTEFuYWx5c2lzKSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNCYXJyaWVyTEFuYWx5c2lzKHNCYXJyaWVyTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKHNCYXJyaWVyTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzQmFycmllckxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzQmFycmllckxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzQmFycmllckxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0FOQUxZU0lTOiB7Ci0gICAgICAgICAgICAgICAgSVNMb2NhbEFuYWx5c2lzIHNMb2NhbEFuYWx5c2lzID0gKElTTG9jYWxBbmFseXNpcykgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTTG9jYWxBbmFseXNpcyhzTG9jYWxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMoc0xvY2FsQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0xvY2FsQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlRTX0xJQlJBUlk6IHsKLSAgICAgICAgICAgICAgICBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgc1N5c3RlbUV2ZW50c0xpYnJhcnkgPSAoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KHNTeXN0ZW1FdmVudHNMaWJyYXJ5KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzU3lzdGVtRXZlbnRzTGlicmFyeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzU3lzdGVtRXZlbnRzTGlicmFyeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzU3lzdGVtRXZlbnRzTGlicmFyeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVF9UWVBFOiB7Ci0gICAgICAgICAgICAgICAgSVNTeXN0ZW1FdmVudFR5cGUgc1N5c3RlbUV2ZW50VHlwZSA9IChJU1N5c3RlbUV2ZW50VHlwZSkgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTU3lzdGVtRXZlbnRUeXBlKHNTeXN0ZW1FdmVudFR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNTeXN0ZW1FdmVudFR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc1N5c3RlbUV2ZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzU3lzdGVtRXZlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UOiB7Ci0gICAgICAgICAgICAgICAgSVNTeXN0ZW1FdmVudCBzU3lzdGVtRXZlbnQgPSAoSVNTeXN0ZW1FdmVudCkgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTU3lzdGVtRXZlbnQoc1N5c3RlbUV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoc1N5c3RlbUV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoc1N5c3RlbUV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzU3lzdGVtRXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc1N5c3RlbUV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNTeXN0ZW1FdmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVFNfTElCUkFSWTogewotICAgICAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeSBzRmVhcmVkRXZlbnRzTGlicmFyeSA9IChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIHRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlU0ZlYXJlZEV2ZW50c0xpYnJhcnkoc0ZlYXJlZEV2ZW50c0xpYnJhcnkpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNGZWFyZWRFdmVudHNMaWJyYXJ5KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNGZWFyZWRFdmVudHNMaWJyYXJ5KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNGZWFyZWRFdmVudHNMaWJyYXJ5KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19GQU1JTFk6IHsKLSAgICAgICAgICAgICAgICBJU0ZlYXJlZEV2ZW50c0ZhbWlseSBzRmVhcmVkRXZlbnRzRmFtaWx5ID0gKElTRmVhcmVkRXZlbnRzRmFtaWx5KSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNGZWFyZWRFdmVudHNGYW1pbHkoc0ZlYXJlZEV2ZW50c0ZhbWlseSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc0ZlYXJlZEV2ZW50c0ZhbWlseSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzRmVhcmVkRXZlbnRzRmFtaWx5KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNGZWFyZWRFdmVudHNGYW1pbHkpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlQ6IHsKLSAgICAgICAgICAgICAgICBJU0ZlYXJlZEV2ZW50IHNGZWFyZWRFdmVudCA9IChJU0ZlYXJlZEV2ZW50KSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNGZWFyZWRFdmVudChzRmVhcmVkRXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNGZWFyZWRFdmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzRmVhcmVkRXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0ZlYXJlZEV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRFlTRlVOQ1RJT05BTF9BU1NPQ0lBVElPTjogewotICAgICAgICAgICAgICAgIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uIHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gPSAoSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pIHRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbihzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FORF9HQVRFX0xBTkFMWVNJUzogewotICAgICAgICAgICAgICAgIElTQW5kR2F0ZUxBbmFseXNpcyBzQW5kR2F0ZUxBbmFseXNpcyA9IChJU0FuZEdhdGVMQW5hbHlzaXMpIHRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlU0FuZEdhdGVMQW5hbHlzaXMoc0FuZEdhdGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKHNBbmRHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoc0FuZEdhdGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNBbmRHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNBbmRHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNBbmRHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TT1JfR0FURV9MQU5BTFlTSVM6IHsKLSAgICAgICAgICAgICAgICBJU09yR2F0ZUxBbmFseXNpcyBzT3JHYXRlTEFuYWx5c2lzID0gKElTT3JHYXRlTEFuYWx5c2lzKSB0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVNPckdhdGVMQW5hbHlzaXMoc09yR2F0ZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoc09yR2F0ZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KHNPckdhdGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNPckdhdGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc09yR2F0ZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzT3JHYXRlTEFuYWx5c2lzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TVU5USU1FTFlfRkFJTFVSRV9NT0RFOiB7Ci0gICAgICAgICAgICAgICAgSVNVbnRpbWVseUZhaWx1cmVNb2RlIHNVbnRpbWVseUZhaWx1cmVNb2RlID0gKElTVW50aW1lbHlGYWlsdXJlTW9kZSkgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTVW50aW1lbHlGYWlsdXJlTW9kZShzVW50aW1lbHlGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoc1VudGltZWx5RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChzVW50aW1lbHlGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc1VudGltZWx5RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc1VudGltZWx5RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc1VudGltZWx5RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNBQlNFTlRfRkFJTFVSRV9NT0RFOiB7Ci0gICAgICAgICAgICAgICAgSVNBYnNlbnRGYWlsdXJlTW9kZSBzQWJzZW50RmFpbHVyZU1vZGUgPSAoSVNBYnNlbnRGYWlsdXJlTW9kZSkgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTQWJzZW50RmFpbHVyZU1vZGUoc0Fic2VudEZhaWx1cmVNb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyhzQWJzZW50RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChzQWJzZW50RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNBYnNlbnRGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzQWJzZW50RmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0Fic2VudEZhaWx1cmVNb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRVJST05FT1VTX0ZBSUxVUkVfTU9ERTogewotICAgICAgICAgICAgICAgIElTRXJyb25lb3VzRmFpbHVyZU1vZGUgc0Vycm9uZW91c0ZhaWx1cmVNb2RlID0gKElTRXJyb25lb3VzRmFpbHVyZU1vZGUpIHRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlU0Vycm9uZW91c0ZhaWx1cmVNb2RlKHNFcnJvbmVvdXNGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoc0Vycm9uZW91c0ZhaWx1cmVNb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoc0Vycm9uZW91c0ZhaWx1cmVNb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzRXJyb25lb3VzRmFpbHVyZU1vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0Vycm9uZW91c0ZhaWx1cmVNb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNFcnJvbmVvdXNGYWlsdXJlTW9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0xPQ0FMX0VWRU5UOiB7Ci0gICAgICAgICAgICAgICAgSVNMb2NhbEV2ZW50IHNMb2NhbEV2ZW50ID0gKElTTG9jYWxFdmVudCkgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTTG9jYWxFdmVudChzTG9jYWxFdmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKHNMb2NhbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoc0xvY2FsRXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNMb2NhbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNMb2NhbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNMb2NhbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0CisJICogcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TTE9DQUxfQU5BTFlTSVNfRUxFTUVOVDogeworCQkJCUlBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCBhYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCA9CisJCQkJCShJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoYWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNQT1JUX0xBTkFMWVNJUzogeworCQkJCUlTUG9ydExBbmFseXNpcyBzUG9ydExBbmFseXNpcyA9IChJU1BvcnRMQW5hbHlzaXMpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU1BvcnRMQW5hbHlzaXMoc1BvcnRMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoc1BvcnRMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNQb3J0TEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNQb3J0TEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNQb3J0TEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX09XTkVSOiB7CisJCQkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciA9IChJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcikgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KGFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChhYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9NT0RFX0xBTkFMWVNJUzogeworCQkJCUlBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyBhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyA9CisJCQkJCShJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChhYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoYWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLkFCU1RSQUNUX1NQUk9QQUdBVElPTl9FTEVNRU5UOiB7CisJCQkJSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgPSAoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChhYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KGFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1BST1BBR0FUSU9OX0xJTks6IHsKKwkJCQlJU1Byb3BhZ2F0aW9uTGluayBzUHJvcGFnYXRpb25MaW5rID0gKElTUHJvcGFnYXRpb25MaW5rKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNQcm9wYWdhdGlvbkxpbmsoc1Byb3BhZ2F0aW9uTGluayk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc1Byb3BhZ2F0aW9uTGluayk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzUHJvcGFnYXRpb25MaW5rKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNQcm9wYWdhdGlvbkxpbmspOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCTE9DS19MQU5BTFlTSVM6IHsKKwkJCQlJU0Jsb2NrTEFuYWx5c2lzIHNCbG9ja0xBbmFseXNpcyA9IChJU0Jsb2NrTEFuYWx5c2lzKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNCbG9ja0xBbmFseXNpcyhzQmxvY2tMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNCbG9ja0xBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzQmxvY2tMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0Jsb2NrTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TRkFJTFVSRV9FVkVOVF9MQU5BTFlTSVM6IHsKKwkJCQlJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyA9CisJCQkJCShJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyhhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KGFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChhYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoYWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5BQlNUUkFDVF9TTE9HSUNBTF9HQVRFX0xBTkFMWVNJUzogeworCQkJCUlBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyBhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyA9CisJCQkJCShJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChhYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoYWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNCQVJSSUVSX0xBTkFMWVNJUzogeworCQkJCUlTQmFycmllckxBbmFseXNpcyBzQmFycmllckxBbmFseXNpcyA9IChJU0JhcnJpZXJMQW5hbHlzaXMpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU0JhcnJpZXJMQW5hbHlzaXMoc0JhcnJpZXJMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoc0JhcnJpZXJMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNCYXJyaWVyTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNCYXJyaWVyTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNCYXJyaWVyTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfQU5BTFlTSVM6IHsKKwkJCQlJU0xvY2FsQW5hbHlzaXMgc0xvY2FsQW5hbHlzaXMgPSAoSVNMb2NhbEFuYWx5c2lzKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNMb2NhbEFuYWx5c2lzKHNMb2NhbEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlBbmFseXNpcyhzTG9jYWxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzTG9jYWxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU1NZU1RFTV9FVkVOVFNfTElCUkFSWTogeworCQkJCUlTU3lzdGVtRXZlbnRzTGlicmFyeSBzU3lzdGVtRXZlbnRzTGlicmFyeSA9IChJU1N5c3RlbUV2ZW50c0xpYnJhcnkpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU1N5c3RlbUV2ZW50c0xpYnJhcnkoc1N5c3RlbUV2ZW50c0xpYnJhcnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNTeXN0ZW1FdmVudHNMaWJyYXJ5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNTeXN0ZW1FdmVudHNMaWJyYXJ5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNTeXN0ZW1FdmVudHNMaWJyYXJ5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TU1lTVEVNX0VWRU5UX1RZUEU6IHsKKwkJCQlJU1N5c3RlbUV2ZW50VHlwZSBzU3lzdGVtRXZlbnRUeXBlID0gKElTU3lzdGVtRXZlbnRUeXBlKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNTeXN0ZW1FdmVudFR5cGUoc1N5c3RlbUV2ZW50VHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc1N5c3RlbUV2ZW50VHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzU3lzdGVtRXZlbnRUeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNTeXN0ZW1FdmVudFR5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNTWVNURU1fRVZFTlQ6IHsKKwkJCQlJU1N5c3RlbUV2ZW50IHNTeXN0ZW1FdmVudCA9IChJU1N5c3RlbUV2ZW50KSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNTeXN0ZW1FdmVudChzU3lzdGVtRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyhzU3lzdGVtRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChzU3lzdGVtRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNTeXN0ZW1FdmVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzU3lzdGVtRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc1N5c3RlbUV2ZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TRkVBUkVEX0VWRU5UU19MSUJSQVJZOiB7CisJCQkJSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTRmVhcmVkRXZlbnRzTGlicmFyeShzRmVhcmVkRXZlbnRzTGlicmFyeSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc0ZlYXJlZEV2ZW50c0xpYnJhcnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0ZlYXJlZEV2ZW50c0xpYnJhcnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0ZlYXJlZEV2ZW50c0xpYnJhcnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNGRUFSRURfRVZFTlRTX0ZBTUlMWTogeworCQkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5IHNGZWFyZWRFdmVudHNGYW1pbHkgPSAoSVNGZWFyZWRFdmVudHNGYW1pbHkpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU0ZlYXJlZEV2ZW50c0ZhbWlseShzRmVhcmVkRXZlbnRzRmFtaWx5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzRmVhcmVkRXZlbnRzRmFtaWx5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNGZWFyZWRFdmVudHNGYW1pbHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0ZlYXJlZEV2ZW50c0ZhbWlseSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0ZFQVJFRF9FVkVOVDogeworCQkJCUlTRmVhcmVkRXZlbnQgc0ZlYXJlZEV2ZW50ID0gKElTRmVhcmVkRXZlbnQpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU0ZlYXJlZEV2ZW50KHNGZWFyZWRFdmVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc0ZlYXJlZEV2ZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNGZWFyZWRFdmVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzRmVhcmVkRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNEWVNGVU5DVElPTkFMX0FTU09DSUFUSU9OOiB7CisJCQkJSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiA9IChJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbikgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TQU5EX0dBVEVfTEFOQUxZU0lTOiB7CisJCQkJSVNBbmRHYXRlTEFuYWx5c2lzIHNBbmRHYXRlTEFuYWx5c2lzID0gKElTQW5kR2F0ZUxBbmFseXNpcykgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTQW5kR2F0ZUxBbmFseXNpcyhzQW5kR2F0ZUxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMoc0FuZEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChzQW5kR2F0ZUxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc0FuZEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0FuZEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0FuZEdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNPUl9HQVRFX0xBTkFMWVNJUzogeworCQkJCUlTT3JHYXRlTEFuYWx5c2lzIHNPckdhdGVMQW5hbHlzaXMgPSAoSVNPckdhdGVMQW5hbHlzaXMpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU09yR2F0ZUxBbmFseXNpcyhzT3JHYXRlTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyhzT3JHYXRlTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQoc09yR2F0ZUxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc09yR2F0ZUxBbmFseXNpcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzT3JHYXRlTEFuYWx5c2lzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNFbGVtZW50KHNPckdhdGVMQW5hbHlzaXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNVTlRJTUVMWV9GQUlMVVJFX01PREU6IHsKKwkJCQlJU1VudGltZWx5RmFpbHVyZU1vZGUgc1VudGltZWx5RmFpbHVyZU1vZGUgPSAoSVNVbnRpbWVseUZhaWx1cmVNb2RlKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNVbnRpbWVseUZhaWx1cmVNb2RlKHNVbnRpbWVseUZhaWx1cmVNb2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyhzVW50aW1lbHlGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KHNVbnRpbWVseUZhaWx1cmVNb2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChzVW50aW1lbHlGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzVW50aW1lbHlGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzVW50aW1lbHlGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuU0FCU0VOVF9GQUlMVVJFX01PREU6IHsKKwkJCQlJU0Fic2VudEZhaWx1cmVNb2RlIHNBYnNlbnRGYWlsdXJlTW9kZSA9IChJU0Fic2VudEZhaWx1cmVNb2RlKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNBYnNlbnRGYWlsdXJlTW9kZShzQWJzZW50RmFpbHVyZU1vZGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKHNBYnNlbnRGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KHNBYnNlbnRGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc0Fic2VudEZhaWx1cmVNb2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KHNBYnNlbnRGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzQWJzZW50RmFpbHVyZU1vZGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLlNFUlJPTkVPVVNfRkFJTFVSRV9NT0RFOiB7CisJCQkJSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSBzRXJyb25lb3VzRmFpbHVyZU1vZGUgPSAoSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTRXJyb25lb3VzRmFpbHVyZU1vZGUoc0Vycm9uZW91c0ZhaWx1cmVNb2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyhzRXJyb25lb3VzRmFpbHVyZU1vZGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChzRXJyb25lb3VzRmFpbHVyZU1vZGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KHNFcnJvbmVvdXNGYWlsdXJlTW9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTU2FmZXR5Q29uY2VwdChzRXJyb25lb3VzRmFpbHVyZU1vZGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0Vycm9uZW91c0ZhaWx1cmVNb2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5TTE9DQUxfRVZFTlQ6IHsKKwkJCQlJU0xvY2FsRXZlbnQgc0xvY2FsRXZlbnQgPSAoSVNMb2NhbEV2ZW50KSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNMb2NhbEV2ZW50KHNMb2NhbEV2ZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoc0xvY2FsRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChzTG9jYWxFdmVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQoc0xvY2FsRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoc0xvY2FsRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc0xvY2FsRXZlbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0xvY2FsIEFuYWx5c2lzIEVsZW1lbnQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTTG9jYWwgQW5hbHlzaXMgRWxlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U0xvY2FsQW5hbHlzaXNFbGVtZW50KElBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNMb2NhbCBBbmFseXNpcyBFbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0xvY2FsIEFuYWx5c2lzIEVsZW1lbnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBYnN0cmFjdFNMb2NhbEFuYWx5c2lzRWxlbWVudChJQWJzdHJhY3RTTG9jYWxBbmFseXNpc0VsZW1lbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNQb3J0TEFuYWx5c2lzKElTUG9ydExBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNQb3J0IExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNQb3J0TEFuYWx5c2lzKElTUG9ydExBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBPd25lcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgT3duZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNGYWlsdXJlIE1vZGUgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgTW9kZSBMQW5hbHlzaXM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBNb2RlIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTUHJvcGFnYXRpb24gRWxlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1Byb3BhZ2F0aW9uIEVsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTUHJvcGFnYXRpb24gRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TUHJvcGFnYXRpb24gTGluazwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlU1Byb3BhZ2F0aW9uTGluayhJU1Byb3BhZ2F0aW9uTGluayBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNQcm9wYWdhdGlvbiBMaW5rPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1Byb3BhZ2F0aW9uIExpbms8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTUHJvcGFnYXRpb25MaW5rKElTUHJvcGFnYXRpb25MaW5rIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TQmxvY2sgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNCbG9ja0xBbmFseXNpcyhJU0Jsb2NrTEFuYWx5c2lzIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Jsb2NrIExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCbG9jayBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTQmxvY2tMQW5hbHlzaXMoSVNCbG9ja0xBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0ZhaWx1cmUgRXZlbnQgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBFdmVudCBMQW5hbHlzaXM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRmFpbHVyZSBFdmVudCBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMoSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0xvZ2ljYWwgR2F0ZSBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTTG9naWNhbCBHYXRlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNMb2dpY2FsIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0xvZ2ljYWwgR2F0ZSBMQW5hbHlzaXM8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcyhJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNCYXJyaWVyTEFuYWx5c2lzKElTQmFycmllckxBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNCYXJyaWVyIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNCYXJyaWVyTEFuYWx5c2lzKElTQmFycmllckxBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlU0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0xvY2FsIEFuYWx5c2lzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU0xvY2FsQW5hbHlzaXMoSVNMb2NhbEFuYWx5c2lzIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1N5c3RlbSBFdmVudHMgTGlicmFyeTwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KElTU3lzdGVtRXZlbnRzTGlicmFyeSBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNTeXN0ZW0gRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TU3lzdGVtIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU1N5c3RlbUV2ZW50c0xpYnJhcnkoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TU3lzdGVtIEV2ZW50IFR5cGU8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TU3lzdGVtIEV2ZW50IFR5cGU8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTU3lzdGVtRXZlbnRUeXBlKElTU3lzdGVtRXZlbnRUeXBlIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1N5c3RlbSBFdmVudCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU1N5c3RlbUV2ZW50VHlwZShJU1N5c3RlbUV2ZW50VHlwZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1N5c3RlbSBFdmVudDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNTeXN0ZW0gRXZlbnQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTU3lzdGVtRXZlbnQoSVNTeXN0ZW1FdmVudCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNTeXN0ZW0gRXZlbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TU3lzdGVtIEV2ZW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU1N5c3RlbUV2ZW50KElTU3lzdGVtRXZlbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRmVhcmVkIEV2ZW50cyBMaWJyYXJ5PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlU0ZlYXJlZEV2ZW50c0xpYnJhcnkoSVNGZWFyZWRFdmVudHNMaWJyYXJ5IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0ZlYXJlZCBFdmVudHMgTGlicmFyeTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGZWFyZWQgRXZlbnRzIExpYnJhcnk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTRmVhcmVkRXZlbnRzTGlicmFyeShJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGZWFyZWQgRXZlbnRzIEZhbWlseTwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNGZWFyZWRFdmVudHNGYW1pbHkoSVNGZWFyZWRFdmVudHNGYW1pbHkgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRmVhcmVkIEV2ZW50cyBGYW1pbHk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTRmVhcmVkRXZlbnRzRmFtaWx5KElTRmVhcmVkRXZlbnRzRmFtaWx5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRmVhcmVkIEV2ZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0ZlYXJlZCBFdmVudDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNGZWFyZWRFdmVudChJU0ZlYXJlZEV2ZW50IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0ZlYXJlZCBFdmVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNGZWFyZWQgRXZlbnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTRmVhcmVkRXZlbnQoSVNGZWFyZWRFdmVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0R5c2Z1bmN0aW9uYWwgQXNzb2NpYXRpb248L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRHlzZnVuY3Rpb25hbCBBc3NvY2lhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNEeXNmdW5jdGlvbmFsIEFzc29jaWF0aW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbihJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNBbmQgR2F0ZSBMQW5hbHlzaXM8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTQW5kR2F0ZUxBbmFseXNpcyhJU0FuZEdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TQW5kIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0FuZCBHYXRlIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNBbmRHYXRlTEFuYWx5c2lzKElTQW5kR2F0ZUxBbmFseXNpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09yIEdhdGUgTEFuYWx5c2lzPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlU09yR2F0ZUxBbmFseXNpcyhJU09yR2F0ZUxBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPciBHYXRlIExBbmFseXNpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPciBHYXRlIExBbmFseXNpczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNPckdhdGVMQW5hbHlzaXMoSVNPckdhdGVMQW5hbHlzaXMgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNVbnRpbWVseSBGYWlsdXJlIE1vZGU8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TVW50aW1lbHkgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlU1VudGltZWx5RmFpbHVyZU1vZGUoSVNVbnRpbWVseUZhaWx1cmVNb2RlIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1VudGltZWx5IEZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNVbnRpbWVseSBGYWlsdXJlIE1vZGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTVW50aW1lbHlGYWlsdXJlTW9kZShJU1VudGltZWx5RmFpbHVyZU1vZGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Fic2VudCBGYWlsdXJlIE1vZGU8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTQWJzZW50RmFpbHVyZU1vZGUoSVNBYnNlbnRGYWlsdXJlTW9kZSBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNBYnNlbnQgRmFpbHVyZSBNb2RlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Fic2VudCBGYWlsdXJlIE1vZGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTQWJzZW50RmFpbHVyZU1vZGUoSVNBYnNlbnRGYWlsdXJlTW9kZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRXJyb25lb3VzIEZhaWx1cmUgTW9kZTwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVNFcnJvbmVvdXNGYWlsdXJlTW9kZShJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0Vycm9uZW91cyBGYWlsdXJlIE1vZGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRXJyb25lb3VzIEZhaWx1cmUgTW9kZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNFcnJvbmVvdXNGYWlsdXJlTW9kZShJU0Vycm9uZW91c0ZhaWx1cmVNb2RlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTTG9jYWxFdmVudChJU0xvY2FsRXZlbnQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TTG9jYWwgRXZlbnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTTG9jYWxFdmVudChJU0xvY2FsRXZlbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNFbGVtZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0VsZW1lbnQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VBYnN0cmFjdFNFbGVtZW50KElBYnN0cmFjdFNFbGVtZW50IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0VsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U0VsZW1lbnQoSUFic3RyYWN0U0VsZW1lbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNTYWZldHkgQ29uY2VwdDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNTYWZldHkgQ29uY2VwdDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U1NhZmV0eUNvbmNlcHQoSUFic3RyYWN0U1NhZmV0eUNvbmNlcHQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTU2FmZXR5IENvbmNlcHQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTU2FmZXR5IENvbmNlcHQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBYnN0cmFjdFNTYWZldHlDb25jZXB0KElBYnN0cmFjdFNTYWZldHlDb25jZXB0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTU2FmZXR5IEFuYWx5c2lzPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU1NhZmV0eSBBbmFseXNpczwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzKElBYnN0cmFjdFNTYWZldHlBbmFseXNpcyBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNTYWZldHkgQW5hbHlzaXM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTU2FmZXR5IEFuYWx5c2lzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQWJzdHJhY3RTU2FmZXR5QW5hbHlzaXMoSUFic3RyYWN0U1NhZmV0eUFuYWx5c2lzIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAogfSAvLyBFU0ZMb2NhbEFuYWx5c2lzU3dpdGNoCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkuamF2YQppbmRleCAwYjUwZmRjLi5iM2M2YTFiIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmphdmEKQEAgLTE5LDY1ICsxOSw2NSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxODYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkKLSAgICBleHRlbmRzIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB7CisJZXh0ZW5kcyBJRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkgewogCi0gICAgLyoqCi0gICAgICogU3BlY2lhbGlzZSB0aGUgZUlOU1RBTkNFIGluaXRpYWxpc2F0aW9uIHdpdGggdGhlIG5ldyBpbnRlcmZhY2UgdHlwZQotICAgICAqIChvdmVycmlkZGVuIGluIHRoZSBvdmVycmlkZV9mYWN0b3J5IGV4dGVuc2lvbikuCi0gICAgICovCi0gICAgSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSBJTlNUQU5DRSA9IE1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5pbml0KCk7CisJLyoqCisJICogU3BlY2lhbGlzZSB0aGUgZUlOU1RBTkNFIGluaXRpYWxpc2F0aW9uIHdpdGggdGhlIG5ldyBpbnRlcmZhY2UgdHlwZQorCSAqIChvdmVycmlkZGVuIGluIHRoZSBvdmVycmlkZV9mYWN0b3J5IGV4dGVuc2lvbikuCisJICovCisJSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSBJTlNUQU5DRSA9IE1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5pbml0KCk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBJTVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKTsKKwlAT3ZlcnJpZGUKKwlJTVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU0FuZEdhdGVMQW5hbHlzaXMgY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXMoKTsKKwlAT3ZlcnJpZGUKKwlJTVNBbmRHYXRlTEFuYWx5c2lzIGNyZWF0ZVNBbmRHYXRlTEFuYWx5c2lzKCk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBJTVNCYXJyaWVyTEFuYWx5c2lzIGNyZWF0ZVNCYXJyaWVyTEFuYWx5c2lzKCk7CisJQE92ZXJyaWRlCisJSU1TQmFycmllckxBbmFseXNpcyBjcmVhdGVTQmFycmllckxBbmFseXNpcygpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgSU1TQmxvY2tMQW5hbHlzaXMgY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKCk7CisJQE92ZXJyaWRlCisJSU1TQmxvY2tMQW5hbHlzaXMgY3JlYXRlU0Jsb2NrTEFuYWx5c2lzKCk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBJTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gY3JlYXRlU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbigpOworCUBPdmVycmlkZQorCUlNU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBjcmVhdGVTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBJTVNFcnJvbmVvdXNGYWlsdXJlTW9kZSBjcmVhdGVTRXJyb25lb3VzRmFpbHVyZU1vZGUoKTsKKwlAT3ZlcnJpZGUKKwlJTVNFcnJvbmVvdXNGYWlsdXJlTW9kZSBjcmVhdGVTRXJyb25lb3VzRmFpbHVyZU1vZGUoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU0xvY2FsQW5hbHlzaXMgY3JlYXRlU0xvY2FsQW5hbHlzaXMoKTsKKwlAT3ZlcnJpZGUKKwlJTVNMb2NhbEFuYWx5c2lzIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKCk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBJTVNMb2NhbEV2ZW50IGNyZWF0ZVNMb2NhbEV2ZW50KCk7CisJQE92ZXJyaWRlCisJSU1TTG9jYWxFdmVudCBjcmVhdGVTTG9jYWxFdmVudCgpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgSU1TT3JHYXRlTEFuYWx5c2lzIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKTsKKwlAT3ZlcnJpZGUKKwlJTVNPckdhdGVMQW5hbHlzaXMgY3JlYXRlU09yR2F0ZUxBbmFseXNpcygpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgSU1TUG9ydExBbmFseXNpcyBjcmVhdGVTUG9ydExBbmFseXNpcygpOworCUBPdmVycmlkZQorCUlNU1BvcnRMQW5hbHlzaXMgY3JlYXRlU1BvcnRMQW5hbHlzaXMoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU1Byb3BhZ2F0aW9uTGluayBjcmVhdGVTUHJvcGFnYXRpb25MaW5rKCk7CisJQE92ZXJyaWRlCisJSU1TUHJvcGFnYXRpb25MaW5rIGNyZWF0ZVNQcm9wYWdhdGlvbkxpbmsoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU1N5c3RlbUV2ZW50IGNyZWF0ZVNTeXN0ZW1FdmVudCgpOworCUBPdmVycmlkZQorCUlNU1N5c3RlbUV2ZW50IGNyZWF0ZVNTeXN0ZW1FdmVudCgpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgSU1TU3lzdGVtRXZlbnRzTGlicmFyeSBjcmVhdGVTU3lzdGVtRXZlbnRzTGlicmFyeSgpOworCUBPdmVycmlkZQorCUlNU1N5c3RlbUV2ZW50c0xpYnJhcnkgY3JlYXRlU1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU1N5c3RlbUV2ZW50VHlwZSBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlKCk7CisJQE92ZXJyaWRlCisJSU1TU3lzdGVtRXZlbnRUeXBlIGNyZWF0ZVNTeXN0ZW1FdmVudFR5cGUoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU1VudGltZWx5RmFpbHVyZU1vZGUgY3JlYXRlU1VudGltZWx5RmFpbHVyZU1vZGUoKTsKKwlAT3ZlcnJpZGUKKwlJTVNVbnRpbWVseUZhaWx1cmVNb2RlIGNyZWF0ZVNVbnRpbWVseUZhaWx1cmVNb2RlKCk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBJTVNGZWFyZWRFdmVudCBjcmVhdGVTRmVhcmVkRXZlbnQoKTsKKwlAT3ZlcnJpZGUKKwlJTVNGZWFyZWRFdmVudCBjcmVhdGVTRmVhcmVkRXZlbnQoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU0ZlYXJlZEV2ZW50c0ZhbWlseSBjcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5KCk7CisJQE92ZXJyaWRlCisJSU1TRmVhcmVkRXZlbnRzRmFtaWx5IGNyZWF0ZVNGZWFyZWRFdmVudHNGYW1pbHkoKTsKIAotICAgIEBPdmVycmlkZQotICAgIElNU0ZlYXJlZEV2ZW50c0xpYnJhcnkgY3JlYXRlU0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwlAT3ZlcnJpZGUKKwlJTVNGZWFyZWRFdmVudHNMaWJyYXJ5IGNyZWF0ZVNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQWJzZW50RmFpbHVyZU1vZGUuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCmluZGV4IDQ0OTY5MDYuLjYyNjgzMzkgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCkBAIC0xOCw2ICsxOCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TQWJzZW50RmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIElTQWJzZW50RmFpbHVyZU1vZGUgeworCWV4dGVuZHMgSVNBYnNlbnRGYWlsdXJlTW9kZSB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNBbmRHYXRlTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQW5kR2F0ZUxBbmFseXNpcy5qYXZhCmluZGV4IDQ3YTNmYmUuLmRlZjYzMTAgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNBbmRHYXRlTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0FuZEdhdGVMQW5hbHlzaXMuamF2YQpAQCAtMTgsNiArMTgsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU0FuZEdhdGVMQW5hbHlzaXMKLSAgICBleHRlbmRzIElTQW5kR2F0ZUxBbmFseXNpcyB7CisJZXh0ZW5kcyBJU0FuZEdhdGVMQW5hbHlzaXMgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQmFycmllckxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0JhcnJpZXJMQW5hbHlzaXMuamF2YQppbmRleCAzOGVkZGQ4Li4xMWE3YjI0IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQmFycmllckxBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNCYXJyaWVyTEFuYWx5c2lzLmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNCYXJyaWVyTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBJU0JhcnJpZXJMQW5hbHlzaXMgeworCWV4dGVuZHMgSVNCYXJyaWVyTEFuYWx5c2lzIHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0Jsb2NrTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQmxvY2tMQW5hbHlzaXMuamF2YQppbmRleCA4OWMxMWMxLi5jNDFmOWFjIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQmxvY2tMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TQmxvY2tMQW5hbHlzaXMuamF2YQpAQCAtMTgsNiArMTgsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU0Jsb2NrTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBJU0Jsb2NrTEFuYWx5c2lzIHsKKwlleHRlbmRzIElTQmxvY2tMQW5hbHlzaXMgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmphdmEKaW5kZXggYmNkNTBmNy4uYjU2ZTllOCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YQpAQCAtMTgsNiArMTgsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbgotICAgIGV4dGVuZHMgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24geworCWV4dGVuZHMgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TRXJyb25lb3VzRmFpbHVyZU1vZGUuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhCmluZGV4IDdiZGM3NzguLmViOGU4MmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhCkBAIC0xOCw2ICsxOCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TRXJyb25lb3VzRmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIElTRXJyb25lb3VzRmFpbHVyZU1vZGUgeworCWV4dGVuZHMgSVNFcnJvbmVvdXNGYWlsdXJlTW9kZSB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNGZWFyZWRFdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50LmphdmEKaW5kZXggNTcwZTdmNi4uOGQzZTNhMyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50LmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNGZWFyZWRFdmVudAotICAgIGV4dGVuZHMgSVNGZWFyZWRFdmVudCB7CisJZXh0ZW5kcyBJU0ZlYXJlZEV2ZW50IHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50c0ZhbWlseS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50c0ZhbWlseS5qYXZhCmluZGV4IDUzN2MzYWEuLmEzZDdmMTEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNGZWFyZWRFdmVudHNGYW1pbHkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TRmVhcmVkRXZlbnRzRmFtaWx5LmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNGZWFyZWRFdmVudHNGYW1pbHkKLSAgICBleHRlbmRzIElTRmVhcmVkRXZlbnRzRmFtaWx5IHsKKwlleHRlbmRzIElTRmVhcmVkRXZlbnRzRmFtaWx5IHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50c0xpYnJhcnkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKaW5kZXggMTQ4ODYzNS4uZjA2YWZiYyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0ZlYXJlZEV2ZW50c0xpYnJhcnkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TRmVhcmVkRXZlbnRzTGlicmFyeS5qYXZhCkBAIC0xOCw2ICsxOCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TRmVhcmVkRXZlbnRzTGlicmFyeQotICAgIGV4dGVuZHMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHsKKwlleHRlbmRzIElTRmVhcmVkRXZlbnRzTGlicmFyeSB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNMb2NhbEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TTG9jYWxBbmFseXNpcy5qYXZhCmluZGV4IDg4NzlmODguLjYzMWJiYTggMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNMb2NhbEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0xvY2FsQW5hbHlzaXMuamF2YQpAQCAtMTgsNiArMTgsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU0xvY2FsQW5hbHlzaXMKLSAgICBleHRlbmRzIElTTG9jYWxBbmFseXNpcyB7CisJZXh0ZW5kcyBJU0xvY2FsQW5hbHlzaXMgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TTG9jYWxFdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU0xvY2FsRXZlbnQuamF2YQppbmRleCAzNDFkYjliLi42ZWIyNjMzIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TTG9jYWxFdmVudC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNMb2NhbEV2ZW50LmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNMb2NhbEV2ZW50Ci0gICAgZXh0ZW5kcyBJU0xvY2FsRXZlbnQgeworCWV4dGVuZHMgSVNMb2NhbEV2ZW50IHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU09yR2F0ZUxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU09yR2F0ZUxBbmFseXNpcy5qYXZhCmluZGV4IDUzMmZmM2EuLmY5MDU4Y2UgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNPckdhdGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TT3JHYXRlTEFuYWx5c2lzLmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNPckdhdGVMQW5hbHlzaXMKLSAgICBleHRlbmRzIElTT3JHYXRlTEFuYWx5c2lzIHsKKwlleHRlbmRzIElTT3JHYXRlTEFuYWx5c2lzIHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1BvcnRMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNQb3J0TEFuYWx5c2lzLmphdmEKaW5kZXggOTkyYWM3MC4uODljMzYyNCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1BvcnRMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TUG9ydExBbmFseXNpcy5qYXZhCkBAIC0xOCw2ICsxOCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TUG9ydExBbmFseXNpcwotICAgIGV4dGVuZHMgSVNQb3J0TEFuYWx5c2lzIHsKKwlleHRlbmRzIElTUG9ydExBbmFseXNpcyB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNQcm9wYWdhdGlvbkxpbmsuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNQcm9wYWdhdGlvbkxpbmsuamF2YQppbmRleCAxNTI0MzY2Li5jMGMxZWYzIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TUHJvcGFnYXRpb25MaW5rLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1Byb3BhZ2F0aW9uTGluay5qYXZhCkBAIC0xOCw2ICsxOCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TUHJvcGFnYXRpb25MaW5rCi0gICAgZXh0ZW5kcyBJU1Byb3BhZ2F0aW9uTGluayB7CisJZXh0ZW5kcyBJU1Byb3BhZ2F0aW9uTGluayB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNTeXN0ZW1FdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50LmphdmEKaW5kZXggMjNmZTVhYy4uYWQ1MmM3MiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50LmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNTeXN0ZW1FdmVudAotICAgIGV4dGVuZHMgSVNTeXN0ZW1FdmVudCB7CisJZXh0ZW5kcyBJU1N5c3RlbUV2ZW50IHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50VHlwZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50VHlwZS5qYXZhCmluZGV4IDkwMTAwMWEuLjQzNzNmYTMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNTeXN0ZW1FdmVudFR5cGUuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TU3lzdGVtRXZlbnRUeXBlLmphdmEKQEAgLTE4LDYgKzE4LDYgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTc2ICQKICAqLwogcHVibGljIGludGVyZmFjZSBJTVNTeXN0ZW1FdmVudFR5cGUKLSAgICBleHRlbmRzIElTU3lzdGVtRXZlbnRUeXBlIHsKKwlleHRlbmRzIElTU3lzdGVtRXZlbnRUeXBlIHsKIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmphdmEKaW5kZXggZjE3NGNhMS4uODBjMTE4NSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TU3lzdGVtRXZlbnRzTGlicmFyeS5qYXZhCkBAIC0xOCw2ICsxOCw2IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE3NiAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1TU3lzdGVtRXZlbnRzTGlicmFyeQotICAgIGV4dGVuZHMgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHsKKwlleHRlbmRzIElTU3lzdGVtRXZlbnRzTGlicmFyeSB7CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNVbnRpbWVseUZhaWx1cmVNb2RlLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvSU1TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCmluZGV4IDYyN2U1MWEuLjNkNGU5MDMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9JTVNVbnRpbWVseUZhaWx1cmVNb2RlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL0lNU1VudGltZWx5RmFpbHVyZU1vZGUuamF2YQpAQCAtMTgsNiArMTgsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU1VudGltZWx5RmFpbHVyZU1vZGUKLSAgICBleHRlbmRzIElTVW50aW1lbHlGYWlsdXJlTW9kZSB7CisJZXh0ZW5kcyBJU1VudGltZWx5RmFpbHVyZU1vZGUgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzLmphdmEKaW5kZXggZDBiODM2Ni4uNjhmYzJjZSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0dlbmVyaWNBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuamF2YQpAQCAtMjQsMjggKzI0LDI4IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCisJICovCisJcHJpdmF0ZSBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKCkgeworCQkvLyBOb3RoaW5nIHRvIGRvCisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IFNCbG9ja0xBbmFseXNpcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwQmFzZVByb3BlcnR5IFRoZSBlbGVtZW50IGJhc2Ugb2YgYSBTRmFpbHVyZUV2ZW50TEFuYWx5c2lzCi0gICAgICogQHJldHVybiBUaGUgU0Jsb2NrTEFuYWx5c2lzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcyhmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7Ci0gICAgICAgIElTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA9IG51bGw7Ci0gICAgICAgIGlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdk93bmVyID0gcEJhc2VQcm9wZXJ0eS5nZXRPd25lcigpOwotICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIEdldCBTQmxvY2tMQW5hbHlzaXMuCisJICoKKwkgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0ZhaWx1cmVFdmVudExBbmFseXNpcworCSAqIEByZXR1cm4gVGhlIFNCbG9ja0xBbmFseXNpcworCSAqLworCXB1YmxpYyBzdGF0aWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoZmluYWwgUHJvcGVydHkgcEJhc2VQcm9wZXJ0eSkgeworCQlJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPSBudWxsOworCQlpZiAocEJhc2VQcm9wZXJ0eSAhPSBudWxsKSB7CisJCQlFbGVtZW50IHZPd25lciA9IHBCYXNlUHJvcGVydHkuZ2V0T3duZXIoKTsKKwkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7CisJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJdlNCbG9ja0xBbmFseXNpcyA9IChJU0Jsb2NrTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJfQorCQl9CisJCXJldHVybiB2U0Jsb2NrTEFuYWx5c2lzOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0dlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmphdmEKaW5kZXggMjk4YTFjMS4uZTYyYjA4NCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmphdmEKQEAgLTMwLDU0ICszMCw1NCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KKwkgKi8KKwlwcml2YXRlIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcygpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBTQmxvY2tMQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0ZhaWx1cmVNb2RlTEFuYWx5c2lzCi0gICAgICogQHJldHVybiBUaGUgU0Jsb2NrTEFuYWx5c2lzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcyhmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7Ci0gICAgICAgIElTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA9IG51bGw7Ci0gICAgICAgIGlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdk93bmVyID0gcEJhc2VQcm9wZXJ0eS5nZXRPd25lcigpOwotICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIEdldCBTQmxvY2tMQW5hbHlzaXMuCisJICoKKwkgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJICogQHJldHVybiBUaGUgU0Jsb2NrTEFuYWx5c2lzCisJICovCisJcHVibGljIHN0YXRpYyBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcyhmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7CisJCUlTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA9IG51bGw7CisJCWlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKKwkJCUVsZW1lbnQgdk93bmVyID0gcEJhc2VQcm9wZXJ0eS5nZXRPd25lcigpOworCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IG93bmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBCYXNlUHJvcGVydHkgVGhlIGVsZW1lbnQgYmFzZSBvZiBhIFNGYWlsdXJlTW9kZUxBbmFseXNpcwotICAgICAqIEByZXR1cm4gVGhlIG93bmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBnZXRPd25lcihmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7Ci0gICAgICAgIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIHZPd25lciA9IG51bGw7Ci0gICAgICAgIGlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qIEdldCBhbGwgY29ubmVjdG9yRW5kcyBvZiBwcm9wZXJ0eSAqLwotICAgICAgICAgICAgSXRlcmF0b3I8Q29ubmVjdG9yRW5kPiB2SXRlcmF0b3IgPSBwQmFzZVByb3BlcnR5LmdldEVuZHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHZPd25lciA9PSBudWxsICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBDb25uZWN0b3JFbmQgdkNvbm5lY3RvckVuZCA9IChDb25uZWN0b3JFbmQpIHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLyogR2V0IGNvbm5lY3RvciBvZiB0aGUgY29ubmVjdG9yRW5kICovCi0gICAgICAgICAgICAgICAgQ29ubmVjdG9yIHZDb25uZWN0b3IgPSAoQ29ubmVjdG9yKSB2Q29ubmVjdG9yRW5kLmdldE93bmVyKCk7Ci0gICAgICAgICAgICAgICAgLyogVmVyaWZ5IGlmIGNvbm5lY3RvciBpcyBhIFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkNvbm5lY3RvciwgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gPSAoSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24pIFVNTFV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkNvbm5lY3RvciwgSVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICB2T3duZXIgPSB2U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5nZXRTRmFpbHVyZU1vZGVPd25lcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdk93bmVyOwotICAgIH0KKwkvKioKKwkgKiBHZXQgb3duZXIuCisJICoKKwkgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0ZhaWx1cmVNb2RlTEFuYWx5c2lzCisJICogQHJldHVybiBUaGUgb3duZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGdldE93bmVyKGZpbmFsIFByb3BlcnR5IHBCYXNlUHJvcGVydHkpIHsKKwkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgdk93bmVyID0gbnVsbDsKKwkJaWYgKHBCYXNlUHJvcGVydHkgIT0gbnVsbCkgeworCQkJLyogR2V0IGFsbCBjb25uZWN0b3JFbmRzIG9mIHByb3BlcnR5ICovCisJCQlJdGVyYXRvcjxDb25uZWN0b3JFbmQ+IHZJdGVyYXRvciA9IHBCYXNlUHJvcGVydHkuZ2V0RW5kcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAodk93bmVyID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUNvbm5lY3RvckVuZCB2Q29ubmVjdG9yRW5kID0gKENvbm5lY3RvckVuZCkgdkl0ZXJhdG9yLm5leHQoKTsKKwkJCQkvKiBHZXQgY29ubmVjdG9yIG9mIHRoZSBjb25uZWN0b3JFbmQgKi8KKwkJCQlDb25uZWN0b3IgdkNvbm5lY3RvciA9IChDb25uZWN0b3IpIHZDb25uZWN0b3JFbmQuZ2V0T3duZXIoKTsKKwkJCQkvKiBWZXJpZnkgaWYgY29ubmVjdG9yIGlzIGEgU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiAqLworCQkJCWlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2Q29ubmVjdG9yLCBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcykgIT0gbnVsbCkgeworCQkJCQlJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiB2U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiA9IChJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbikgVU1MVXRpbAorCQkJCQkJLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2Q29ubmVjdG9yLCBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcyk7CisJCQkJCXZPd25lciA9IHZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmdldFNGYWlsdXJlTW9kZU93bmVyKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB2T3duZXI7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0dlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyLmphdmEKaW5kZXggZDE1NTNhZC4uMzQ4ZTIwZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lci5qYXZhCkBAIC0yNyw0MSArMjcsNDEgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcigpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8KKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgTGlzdCBvZiBTRmFpbHVyZU1vZGVMQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0ZhaWx1cmVNb2RlT3duZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBMaXN0IG9mIFNGYWlsdXJlTW9kZUxBbmFseXNpcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdChmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7Ci0gICAgICAgIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBCYXNpY0VMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oKTsKKwkvKioKKwkgKiBHZXQgTGlzdCBvZiBTRmFpbHVyZU1vZGVMQW5hbHlzaXMuCisJICoKKwkgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0ZhaWx1cmVNb2RlT3duZXIKKwkgKiBAcmV0dXJuIFRoZSBMaXN0IG9mIFNGYWlsdXJlTW9kZUxBbmFseXNpcworCSAqLworCXB1YmxpYyBzdGF0aWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdChmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7CisJCUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0ID0KKwkJCW5ldyBCYXNpY0VMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oKTsKIAotICAgICAgICBpZiAocEJhc2VQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKiBHZXQgYWxsIGNvbm5lY3RvckVuZHMgb2YgcHJvcGVydHkgKi8KLSAgICAgICAgICAgIGZvciAoQ29ubmVjdG9yRW5kIHZDb25uZWN0b3JFbmQgOiBwQmFzZVByb3BlcnR5LmdldEVuZHMoKSkgewotICAgICAgICAgICAgICAgIC8qIEdldCBjb25uZWN0b3Igb2YgdGhlIGNvbm5lY3RvckVuZCAqLwotICAgICAgICAgICAgICAgIENvbm5lY3RvciB2Q29ubmVjdG9yID0gKENvbm5lY3RvcikgdkNvbm5lY3RvckVuZC5nZXRPd25lcigpOwotICAgICAgICAgICAgICAgIC8qIFZlcmlmeSBpZiBjb25uZWN0b3IgaXMgYSBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uICovCi0gICAgICAgICAgICAgICAgaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZDb25uZWN0b3IsIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uIHZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uID0gKElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKSBVTUxVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZDb25uZWN0b3IsIElTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHZTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uZ2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2U0ZhaWx1cmVNb2RlTEFuYWx5c2lzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5hZGQodlNGYWlsdXJlTW9kZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHBCYXNlUHJvcGVydHkgIT0gbnVsbCkgeworCQkJLyogR2V0IGFsbCBjb25uZWN0b3JFbmRzIG9mIHByb3BlcnR5ICovCisJCQlmb3IgKENvbm5lY3RvckVuZCB2Q29ubmVjdG9yRW5kIDogcEJhc2VQcm9wZXJ0eS5nZXRFbmRzKCkpIHsKKwkJCQkvKiBHZXQgY29ubmVjdG9yIG9mIHRoZSBjb25uZWN0b3JFbmQgKi8KKwkJCQlDb25uZWN0b3IgdkNvbm5lY3RvciA9IChDb25uZWN0b3IpIHZDb25uZWN0b3JFbmQuZ2V0T3duZXIoKTsKKwkJCQkvKiBWZXJpZnkgaWYgY29ubmVjdG9yIGlzIGEgU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiAqLworCQkJCWlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2Q29ubmVjdG9yLCBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcykgIT0gbnVsbCkgeworCQkJCQlJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiB2U0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiA9IChJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbikgVU1MVXRpbAorCQkJCQkJLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2Q29ubmVjdG9yLCBJU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5jbGFzcyk7CisJCQkJCUlBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyB2U0ZhaWx1cmVNb2RlTEFuYWx5c2lzID0KKwkJCQkJCXZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmdldFNGYWlsdXJlTW9kZUxBbmFseXNpcygpOworCQkJCQlpZiAodlNGYWlsdXJlTW9kZUxBbmFseXNpcyAhPSBudWxsKSB7CisJCQkJCQl2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QuYWRkKHZTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgcmV0dXJuIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdDsKLSAgICB9CisJCXJldHVybiB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Q7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuamF2YQppbmRleCA4YmY4NGFlLi5jNWU0YTk5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuamF2YQpAQCAtMjQsMjggKzI0LDI4IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcygpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgR2VuZXJpY0Fic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKCkgeworCQkvLyBOb3RoaW5nIHRvIGRvCisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IFNCbG9ja0xBbmFseXNpcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwQmFzZVByb3BldHkgVGhlIGVsZW1lbnQgYmFzZSBvZiBhIFNMb2dpY2FsR2F0ZUxBbmFseXNpcwotICAgICAqIEByZXR1cm4gVGhlIFNCbG9ja0xBbmFseXNpcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVNCbG9ja0xBbmFseXNpcyBnZXRTQmxvY2tMQW5hbHlzaXMoZmluYWwgUHJvcGVydHkgcEJhc2VQcm9wZXR5KSB7Ci0gICAgICAgIElTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA9IG51bGw7Ci0gICAgICAgIGlmIChwQmFzZVByb3BldHkgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCB2T3duZXIgPSBwQmFzZVByb3BldHkuZ2V0T3duZXIoKTsKLSAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdlNCbG9ja0xBbmFseXNpcyA9IChJU0Jsb2NrTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U0Jsb2NrTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiBHZXQgU0Jsb2NrTEFuYWx5c2lzLgorCSAqCisJICogQHBhcmFtIHBCYXNlUHJvcGV0eSBUaGUgZWxlbWVudCBiYXNlIG9mIGEgU0xvZ2ljYWxHYXRlTEFuYWx5c2lzCisJICogQHJldHVybiBUaGUgU0Jsb2NrTEFuYWx5c2lzCisJICovCisJcHVibGljIHN0YXRpYyBJU0Jsb2NrTEFuYWx5c2lzIGdldFNCbG9ja0xBbmFseXNpcyhmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BldHkpIHsKKwkJSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0gbnVsbDsKKwkJaWYgKHBCYXNlUHJvcGV0eSAhPSBudWxsKSB7CisJCQlFbGVtZW50IHZPd25lciA9IHBCYXNlUHJvcGV0eS5nZXRPd25lcigpOworCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5qYXZhCmluZGV4IGM4OWQyYzUuLjAyYTkxYjkgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL0dlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9HZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmphdmEKQEAgLTI3LDU1ICsyNyw1NSBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCgpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBMaXN0IG9mIE91dCBTUHJvcGFnYXRpb25MaW5rcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwQmFzZVByb3BlcnR5IFRoZSBlbGVtZW50IGJhc2Ugb2YgYSBTUHJvcGFnYXRpb25FbGVtZW50Ci0gICAgICogQHJldHVybiBUaGUgTGlzdCBvZiBPdXQgU1Byb3BhZ2F0aW9uTGlua3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZmluYWwgUHJvcGVydHkgcEJhc2VQcm9wZXJ0eSkgewotICAgICAgICBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTUHJvcGFnYXRpb25MaW5rPigpOworCS8qKgorCSAqIEdldCBMaXN0IG9mIE91dCBTUHJvcGFnYXRpb25MaW5rcy4KKwkgKgorCSAqIEBwYXJhbSBwQmFzZVByb3BlcnR5IFRoZSBlbGVtZW50IGJhc2Ugb2YgYSBTUHJvcGFnYXRpb25FbGVtZW50CisJICogQHJldHVybiBUaGUgTGlzdCBvZiBPdXQgU1Byb3BhZ2F0aW9uTGlua3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZmluYWwgUHJvcGVydHkgcEJhc2VQcm9wZXJ0eSkgeworCQlFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTUHJvcGFnYXRpb25MaW5rPigpOwogCi0gICAgICAgIGlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSB2RGVwZW5kZW5jeSA6IHBCYXNlUHJvcGVydHkuZ2V0Q2xpZW50RGVwZW5kZW5jaWVzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RGVwZW5kZW5jeSwgSVNQcm9wYWdhdGlvbkxpbmsuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5hZGQoKElTUHJvcGFnYXRpb25MaW5rKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHBCYXNlUHJvcGVydHkgIT0gbnVsbCkgeworCQkJZm9yIChEZXBlbmRlbmN5IHZEZXBlbmRlbmN5IDogcEJhc2VQcm9wZXJ0eS5nZXRDbGllbnREZXBlbmRlbmNpZXMoKSkgeworCQkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9CisJCQkJCVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZEZXBlbmRlbmN5LCBJU1Byb3BhZ2F0aW9uTGluay5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LmFkZCgoSVNQcm9wYWdhdGlvbkxpbmspIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IExpc3Qgb2YgSW4gU1Byb3BhZ2F0aW9uTGlua3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEJhc2VQcm9wZXJ0eSBUaGUgZWxlbWVudCBiYXNlIGEgU1Byb3BhZ2F0aW9uRWxlbWVudAotICAgICAqIEByZXR1cm4gVGhlIExpc3Qgb2YgSW4gU1Byb3BhZ2F0aW9uTGlua3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdChmaW5hbCBQcm9wZXJ0eSBwQmFzZVByb3BlcnR5KSB7Ci0gICAgICAgIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oKTsKKwkvKioKKwkgKiBHZXQgTGlzdCBvZiBJbiBTUHJvcGFnYXRpb25MaW5rcy4KKwkgKgorCSAqIEBwYXJhbSBwQmFzZVByb3BlcnR5IFRoZSBlbGVtZW50IGJhc2UgYSBTUHJvcGFnYXRpb25FbGVtZW50CisJICogQHJldHVybiBUaGUgTGlzdCBvZiBJbiBTUHJvcGFnYXRpb25MaW5rcworCSAqLworCXB1YmxpYyBzdGF0aWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGZpbmFsIFByb3BlcnR5IHBCYXNlUHJvcGVydHkpIHsKKwkJRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTUHJvcGFnYXRpb25MaW5rPigpOwogCi0gICAgICAgIGlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRGlyZWN0ZWRSZWxhdGlvbnNoaXAgdlJlbGF0aW9uc2hpcCA6IHBCYXNlUHJvcGVydHkuZ2V0VGFyZ2V0RGlyZWN0ZWRSZWxhdGlvbnNoaXBzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2UmVsYXRpb25zaGlwLCBJU1Byb3BhZ2F0aW9uTGluay5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QuYWRkKChJU1Byb3BhZ2F0aW9uTGluaykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmIChwQmFzZVByb3BlcnR5ICE9IG51bGwpIHsKKwkJCWZvciAoRGlyZWN0ZWRSZWxhdGlvbnNoaXAgdlJlbGF0aW9uc2hpcCA6IHBCYXNlUHJvcGVydHkuZ2V0VGFyZ2V0RGlyZWN0ZWRSZWxhdGlvbnNoaXBzKCkpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQorCQkJCQlVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2UmVsYXRpb25zaGlwLCBJU1Byb3BhZ2F0aW9uTGluay5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QuYWRkKChJU1Byb3BhZ2F0aW9uTGluaykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgcmV0dXJuIHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3Q7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5qYXZhCmluZGV4IGU3MWIwMDguLmNiMDcyYzAgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeS5qYXZhCkBAIC00MCwxOTAgKzQwLDE5MCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxODYgJAogICovCiBwdWJsaWMgY2xhc3MgTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5Ci0gICAgZXh0ZW5kcyBFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeQotICAgIGltcGxlbWVudHMgSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB7CisJZXh0ZW5kcyBFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeQorCWltcGxlbWVudHMgSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNRVNGTG9jYWxBbmFseXNpc0ZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBpbml0aWFsaXNlZCBmYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5IGluaXQoKSB7Ci0gICAgICAgIElFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB2RmFjdG9yeSA9IEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmluaXQoKTsKKwkvKioKKwkgKiBAcmV0dXJuIFRoZSBpbml0aWFsaXNlZCBmYWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyBJTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5IGluaXQoKSB7CisJCUlFU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSB2RmFjdG9yeSA9IEVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5LmluaXQoKTsKIAotICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmFjdG9yeSByZXR1cm5lZCBieSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gY2FuIHN1aXQsCi0gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgaW5zdGFuY2UKLSAgICAgICAgaWYgKCEodkZhY3RvcnkgaW5zdGFuY2VvZiBJTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KSkgewotICAgICAgICAgICAgdkZhY3RvcnkgPSBuZXcgTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KCk7Ci0gICAgICAgIH0KKwkJLy8gQ2hlY2sgaWYgdGhlIGZhY3RvcnkgcmV0dXJuZWQgYnkgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGNhbiBzdWl0LAorCQkvLyBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IGluc3RhbmNlCisJCWlmICghKHZGYWN0b3J5IGluc3RhbmNlb2YgSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSkpIHsKKwkJCXZGYWN0b3J5ID0gbmV3IE1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSgpOworCQl9CiAKLSAgICAgICAgcmV0dXJuIChJTUVTRkxvY2FsQW5hbHlzaXNGYWN0b3J5KSB2RmFjdG9yeTsKLSAgICB9CisJCXJldHVybiAoSU1FU0ZMb2NhbEFuYWx5c2lzRmFjdG9yeSkgdkZhY3Rvcnk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIElNU0Fic2VudEZhaWx1cmVNb2RlIHZTQWJzZW50RmFpbHVyZU1vZGUgPSBuZXcgTVNBYnNlbnRGYWlsdXJlTW9kZSgpOwotICAgICAgICByZXR1cm4gdlNBYnNlbnRGYWlsdXJlTW9kZTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJTVNBYnNlbnRGYWlsdXJlTW9kZSBjcmVhdGVTQWJzZW50RmFpbHVyZU1vZGUoKSB7CisJCUlNU0Fic2VudEZhaWx1cmVNb2RlIHZTQWJzZW50RmFpbHVyZU1vZGUgPSBuZXcgTVNBYnNlbnRGYWlsdXJlTW9kZSgpOworCQlyZXR1cm4gdlNBYnNlbnRGYWlsdXJlTW9kZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNU0FuZEdhdGVMQW5hbHlzaXMgY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIElNU0FuZEdhdGVMQW5hbHlzaXMgdlNBbmRHYXRlTEFuYWx5c2lzID0gbmV3IE1TQW5kR2F0ZUxBbmFseXNpcygpOwotICAgICAgICByZXR1cm4gdlNBbmRHYXRlTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU0FuZEdhdGVMQW5hbHlzaXMgY3JlYXRlU0FuZEdhdGVMQW5hbHlzaXMoKSB7CisJCUlNU0FuZEdhdGVMQW5hbHlzaXMgdlNBbmRHYXRlTEFuYWx5c2lzID0gbmV3IE1TQW5kR2F0ZUxBbmFseXNpcygpOworCQlyZXR1cm4gdlNBbmRHYXRlTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TQmFycmllckxBbmFseXNpcyBjcmVhdGVTQmFycmllckxBbmFseXNpcygpIHsKLSAgICAgICAgSU1TQmFycmllckxBbmFseXNpcyB2U0JhcnJpZXJMQW5hbHlzaXMgPSBuZXcgTVNCYXJyaWVyTEFuYWx5c2lzKCk7Ci0gICAgICAgIHJldHVybiB2U0JhcnJpZXJMQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1TQmFycmllckxBbmFseXNpcyBjcmVhdGVTQmFycmllckxBbmFseXNpcygpIHsKKwkJSU1TQmFycmllckxBbmFseXNpcyB2U0JhcnJpZXJMQW5hbHlzaXMgPSBuZXcgTVNCYXJyaWVyTEFuYWx5c2lzKCk7CisJCXJldHVybiB2U0JhcnJpZXJMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTVNCbG9ja0xBbmFseXNpcyBjcmVhdGVTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIElNU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPSBuZXcgTVNCbG9ja0xBbmFseXNpcygpOwotICAgICAgICByZXR1cm4gdlNCbG9ja0xBbmFseXNpczsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJTVNCbG9ja0xBbmFseXNpcyBjcmVhdGVTQmxvY2tMQW5hbHlzaXMoKSB7CisJCUlNU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPSBuZXcgTVNCbG9ja0xBbmFseXNpcygpOworCQlyZXR1cm4gdlNCbG9ja0xBbmFseXNpczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBjcmVhdGVTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCkgewotICAgICAgICBJTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gPSBuZXcgTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiBjcmVhdGVTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCkgeworCQlJTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gdlNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gPSBuZXcgTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKTsKKwkJcmV0dXJuIHZTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TRXJyb25lb3VzRmFpbHVyZU1vZGUgY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkgewotICAgICAgICBJTVNFcnJvbmVvdXNGYWlsdXJlTW9kZSB2U0Vycm9uZW91c0ZhaWx1cmVNb2RlID0gbmV3IE1TRXJyb25lb3VzRmFpbHVyZU1vZGUoKTsKLSAgICAgICAgcmV0dXJuIHZTRXJyb25lb3VzRmFpbHVyZU1vZGU7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1TRXJyb25lb3VzRmFpbHVyZU1vZGUgY3JlYXRlU0Vycm9uZW91c0ZhaWx1cmVNb2RlKCkgeworCQlJTVNFcnJvbmVvdXNGYWlsdXJlTW9kZSB2U0Vycm9uZW91c0ZhaWx1cmVNb2RlID0gbmV3IE1TRXJyb25lb3VzRmFpbHVyZU1vZGUoKTsKKwkJcmV0dXJuIHZTRXJyb25lb3VzRmFpbHVyZU1vZGU7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTVNMb2NhbEFuYWx5c2lzIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKCkgewotICAgICAgICBJTVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9IG5ldyBNU0xvY2FsQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHZTTG9jYWxBbmFseXNpczsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJTVNMb2NhbEFuYWx5c2lzIGNyZWF0ZVNMb2NhbEFuYWx5c2lzKCkgeworCQlJTVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9IG5ldyBNU0xvY2FsQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHZTTG9jYWxBbmFseXNpczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNU0xvY2FsRXZlbnQgY3JlYXRlU0xvY2FsRXZlbnQoKSB7Ci0gICAgICAgIElNU0xvY2FsRXZlbnQgdlNMb2NhbEV2ZW50ID0gbmV3IE1TTG9jYWxFdmVudCgpOwotICAgICAgICByZXR1cm4gdlNMb2NhbEV2ZW50OwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU0xvY2FsRXZlbnQgY3JlYXRlU0xvY2FsRXZlbnQoKSB7CisJCUlNU0xvY2FsRXZlbnQgdlNMb2NhbEV2ZW50ID0gbmV3IE1TTG9jYWxFdmVudCgpOworCQlyZXR1cm4gdlNMb2NhbEV2ZW50OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TT3JHYXRlTEFuYWx5c2lzIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIElNU09yR2F0ZUxBbmFseXNpcyB2U09yR2F0ZUxBbmFseXNpcyA9IG5ldyBNU09yR2F0ZUxBbmFseXNpcygpOwotICAgICAgICByZXR1cm4gdlNPckdhdGVMQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1TT3JHYXRlTEFuYWx5c2lzIGNyZWF0ZVNPckdhdGVMQW5hbHlzaXMoKSB7CisJCUlNU09yR2F0ZUxBbmFseXNpcyB2U09yR2F0ZUxBbmFseXNpcyA9IG5ldyBNU09yR2F0ZUxBbmFseXNpcygpOworCQlyZXR1cm4gdlNPckdhdGVMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTVNQb3J0TEFuYWx5c2lzIGNyZWF0ZVNQb3J0TEFuYWx5c2lzKCkgewotICAgICAgICBJTVNQb3J0TEFuYWx5c2lzIHZTUG9ydExBbmFseXNpcyA9IG5ldyBNU1BvcnRMQW5hbHlzaXMoKTsKLSAgICAgICAgcmV0dXJuIHZTUG9ydExBbmFseXNpczsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJTVNQb3J0TEFuYWx5c2lzIGNyZWF0ZVNQb3J0TEFuYWx5c2lzKCkgeworCQlJTVNQb3J0TEFuYWx5c2lzIHZTUG9ydExBbmFseXNpcyA9IG5ldyBNU1BvcnRMQW5hbHlzaXMoKTsKKwkJcmV0dXJuIHZTUG9ydExBbmFseXNpczsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNU1Byb3BhZ2F0aW9uTGluayBjcmVhdGVTUHJvcGFnYXRpb25MaW5rKCkgewotICAgICAgICBJTVNQcm9wYWdhdGlvbkxpbmsgdlNQcm9wYWdhdGlvbkxpbmsgPSBuZXcgTVNQcm9wYWdhdGlvbkxpbmsoKTsKLSAgICAgICAgcmV0dXJuIHZTUHJvcGFnYXRpb25MaW5rOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU1Byb3BhZ2F0aW9uTGluayBjcmVhdGVTUHJvcGFnYXRpb25MaW5rKCkgeworCQlJTVNQcm9wYWdhdGlvbkxpbmsgdlNQcm9wYWdhdGlvbkxpbmsgPSBuZXcgTVNQcm9wYWdhdGlvbkxpbmsoKTsKKwkJcmV0dXJuIHZTUHJvcGFnYXRpb25MaW5rOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TU3lzdGVtRXZlbnQgY3JlYXRlU1N5c3RlbUV2ZW50KCkgewotICAgICAgICBJTVNTeXN0ZW1FdmVudCB2U1N5c3RlbUV2ZW50ID0gbmV3IE1TU3lzdGVtRXZlbnQoKTsKLSAgICAgICAgcmV0dXJuIHZTU3lzdGVtRXZlbnQ7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1TU3lzdGVtRXZlbnQgY3JlYXRlU1N5c3RlbUV2ZW50KCkgeworCQlJTVNTeXN0ZW1FdmVudCB2U1N5c3RlbUV2ZW50ID0gbmV3IE1TU3lzdGVtRXZlbnQoKTsKKwkJcmV0dXJuIHZTU3lzdGVtRXZlbnQ7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTVNTeXN0ZW1FdmVudHNMaWJyYXJ5IGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgewotICAgICAgICBJTVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHZTU3lzdGVtRXZlbnRzTGlicmFyeSA9IG5ldyBNU1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgcmV0dXJuIHZTU3lzdGVtRXZlbnRzTGlicmFyeTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJTVNTeXN0ZW1FdmVudHNMaWJyYXJ5IGNyZWF0ZVNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlJTVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHZTU3lzdGVtRXZlbnRzTGlicmFyeSA9IG5ldyBNU1N5c3RlbUV2ZW50c0xpYnJhcnkoKTsKKwkJcmV0dXJuIHZTU3lzdGVtRXZlbnRzTGlicmFyeTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNU1N5c3RlbUV2ZW50VHlwZSBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlKCkgewotICAgICAgICBJTVNTeXN0ZW1FdmVudFR5cGUgdlNTeXN0ZW1FdmVudFR5cGUgPSBuZXcgTVNTeXN0ZW1FdmVudFR5cGUoKTsKLSAgICAgICAgcmV0dXJuIHZTU3lzdGVtRXZlbnRUeXBlOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU1N5c3RlbUV2ZW50VHlwZSBjcmVhdGVTU3lzdGVtRXZlbnRUeXBlKCkgeworCQlJTVNTeXN0ZW1FdmVudFR5cGUgdlNTeXN0ZW1FdmVudFR5cGUgPSBuZXcgTVNTeXN0ZW1FdmVudFR5cGUoKTsKKwkJcmV0dXJuIHZTU3lzdGVtRXZlbnRUeXBlOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TVW50aW1lbHlGYWlsdXJlTW9kZSBjcmVhdGVTVW50aW1lbHlGYWlsdXJlTW9kZSgpIHsKLSAgICAgICAgSU1TVW50aW1lbHlGYWlsdXJlTW9kZSB2U1VsdGltZWx5RmFpbHVyZU1vZGUgPSBuZXcgTVNVbnRpbWVseUZhaWx1cmVNb2RlKCk7Ci0gICAgICAgIHJldHVybiB2U1VsdGltZWx5RmFpbHVyZU1vZGU7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1TVW50aW1lbHlGYWlsdXJlTW9kZSBjcmVhdGVTVW50aW1lbHlGYWlsdXJlTW9kZSgpIHsKKwkJSU1TVW50aW1lbHlGYWlsdXJlTW9kZSB2U1VsdGltZWx5RmFpbHVyZU1vZGUgPSBuZXcgTVNVbnRpbWVseUZhaWx1cmVNb2RlKCk7CisJCXJldHVybiB2U1VsdGltZWx5RmFpbHVyZU1vZGU7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTVNGZWFyZWRFdmVudCBjcmVhdGVTRmVhcmVkRXZlbnQoKSB7Ci0gICAgICAgIElNU0ZlYXJlZEV2ZW50IHZTRmVhcmVkRXZlbnQgPSBuZXcgTVNGZWFyZWRFdmVudCgpOwotICAgICAgICByZXR1cm4gdlNGZWFyZWRFdmVudDsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJTVNGZWFyZWRFdmVudCBjcmVhdGVTRmVhcmVkRXZlbnQoKSB7CisJCUlNU0ZlYXJlZEV2ZW50IHZTRmVhcmVkRXZlbnQgPSBuZXcgTVNGZWFyZWRFdmVudCgpOworCQlyZXR1cm4gdlNGZWFyZWRFdmVudDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNU0ZlYXJlZEV2ZW50c0ZhbWlseSBjcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5KCkgewotICAgICAgICBJTVNGZWFyZWRFdmVudHNGYW1pbHkgdlNGZWFyZWRFdmVudFNGYW1pbHkgPSBuZXcgTVNGZWFyZWRFdmVudHNGYW1pbHkoKTsKLSAgICAgICAgcmV0dXJuIHZTRmVhcmVkRXZlbnRTRmFtaWx5OwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElNU0ZlYXJlZEV2ZW50c0ZhbWlseSBjcmVhdGVTRmVhcmVkRXZlbnRzRmFtaWx5KCkgeworCQlJTVNGZWFyZWRFdmVudHNGYW1pbHkgdlNGZWFyZWRFdmVudFNGYW1pbHkgPSBuZXcgTVNGZWFyZWRFdmVudHNGYW1pbHkoKTsKKwkJcmV0dXJuIHZTRmVhcmVkRXZlbnRTRmFtaWx5OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TRmVhcmVkRXZlbnRzTGlicmFyeSBjcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgSU1TRmVhcmVkRXZlbnRzTGlicmFyeSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBuZXcgTVNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgIHJldHVybiB2U0ZlYXJlZEV2ZW50c0xpYnJhcnk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1TRmVhcmVkRXZlbnRzTGlicmFyeSBjcmVhdGVTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKKwkJSU1TRmVhcmVkRXZlbnRzTGlicmFyeSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBuZXcgTVNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7CisJCXJldHVybiB2U0ZlYXJlZEV2ZW50c0xpYnJhcnk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNBYnNlbnRGYWlsdXJlTW9kZS5qYXZhCmluZGV4IDZlZDA3NzEuLjlkNDAyOGQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQWJzZW50RmFpbHVyZU1vZGUuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0Fic2VudEZhaWx1cmVNb2RlLmphdmEKQEAgLTI2LDc5ICsyNiw3OSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNBYnNlbnRGYWlsdXJlTW9kZQotICAgIGV4dGVuZHMgU0Fic2VudEZhaWx1cmVNb2RlCi0gICAgaW1wbGVtZW50cyBJTVNBYnNlbnRGYWlsdXJlTW9kZSB7CisJZXh0ZW5kcyBTQWJzZW50RmFpbHVyZU1vZGUKKwlpbXBsZW1lbnRzIElNU0Fic2VudEZhaWx1cmVNb2RlIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TQWJzZW50RmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TQWJzZW50RmFpbHVyZU1vZGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmdldFNCbG9ja0xBbmFseXNpcyhnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRPd25lcigpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRPd25lcihnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGJhc2ljR2V0T3duZXIoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuZ2V0T3duZXIoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOwogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOworCQlVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQotICAgICAgICAgICAgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KKwkJCUdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0FuZEdhdGVMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQW5kR2F0ZUxBbmFseXNpcy5qYXZhCmluZGV4IDU0NWFlYzYuLjFhNjBiYWYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQW5kR2F0ZUxBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQW5kR2F0ZUxBbmFseXNpcy5qYXZhCkBAIC0yNSw3MSArMjUsNzEgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIE1TQW5kR2F0ZUxBbmFseXNpcwotICAgIGV4dGVuZHMgU0FuZEdhdGVMQW5hbHlzaXMKLSAgICBpbXBsZW1lbnRzIElNU0FuZEdhdGVMQW5hbHlzaXMgeworCWV4dGVuZHMgU0FuZEdhdGVMQW5hbHlzaXMKKwlpbXBsZW1lbnRzIElNU0FuZEdhdGVMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNBbmRHYXRlTEFuYWx5c2lzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBNU0FuZEdhdGVMQW5hbHlzaXMoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzLmdldFNCbG9ja0xBbmFseXNpcyhnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgewotICAgICAgICBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KLSAgICAgICAgICAgIEdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKKwkJRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9CisJCQlHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVSW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCi0gICAgICAgICAgICB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKKwkJCXRoaXMsCisJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVSW5TUHJvcGFnYXRpb25MaW5rc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgewotICAgICAgICBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKKwkJRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKKwkJCXRoaXMsCisJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CiAKLSAgICAgICAgcmV0dXJuIHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQmFycmllckxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNCYXJyaWVyTEFuYWx5c2lzLmphdmEKaW5kZXggZGFmMTFiNi4uMmEyYTFjYiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNCYXJyaWVyTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNCYXJyaWVyTEFuYWx5c2lzLmphdmEKQEAgLTI5LDY0ICsyOSw2NCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNCYXJyaWVyTEFuYWx5c2lzCi0gICAgZXh0ZW5kcyBTQmFycmllckxBbmFseXNpcwotICAgIGltcGxlbWVudHMgSU1TQmFycmllckxBbmFseXNpcyB7CisJZXh0ZW5kcyBTQmFycmllckxBbmFseXNpcworCWltcGxlbWVudHMgSU1TQmFycmllckxBbmFseXNpcyB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNU0JhcnJpZXJMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TQmFycmllckxBbmFseXNpcygpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUHJvcGVydHkoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUHJvcGVydHkoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICBQcm9wZXJ0eSB2QmFzZSA9IGdldEJhc2VfUHJvcGVydHkoKTsKLSAgICAgICAgSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0gbnVsbDsKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdk93bmVyID0gdkJhc2UuZ2V0T3duZXIoKTsKLSAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdlNCbG9ja0xBbmFseXNpcyA9IChJU0Jsb2NrTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U0Jsb2NrTEFuYWx5c2lzOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTQmxvY2tMQW5hbHlzaXMgYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSB7CisJCVByb3BlcnR5IHZCYXNlID0gZ2V0QmFzZV9Qcm9wZXJ0eSgpOworCQlJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPSBudWxsOworCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJRWxlbWVudCB2T3duZXIgPSB2QmFzZS5nZXRPd25lcigpOworCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lci5nZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQotICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcl9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5zaXplKCksCi0gICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlVTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9CisJCQluZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPigKKwkJCQl0aGlzLAorCQkJCUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQkJdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKKwkJCQl2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0OworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQmxvY2tMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TQmxvY2tMQW5hbHlzaXMuamF2YQppbmRleCA4MTM1ZjA1Li5iNjU5OTVlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0Jsb2NrTEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNCbG9ja0xBbmFseXNpcy5qYXZhCkBAIC00MiwyNzcgKzQyLDI3NyBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNCbG9ja0xBbmFseXNpcwotICAgIGV4dGVuZHMgU0Jsb2NrTEFuYWx5c2lzCi0gICAgaW1wbGVtZW50cyBJTVNCbG9ja0xBbmFseXNpcyB7CisJZXh0ZW5kcyBTQmxvY2tMQW5hbHlzaXMKKwlpbXBsZW1lbnRzIElNU0Jsb2NrTEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TQmxvY2tMQW5hbHlzaXMoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9DbGFzcygpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9DbGFzcygpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX0NsYXNzKCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX0NsYXNzKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcz4gZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzPiB2U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBCYXNpY0VMaXN0PElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+KCk7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcz4gZ2V0U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0KCkgeworCQlFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzPiB2U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0ID0KKwkJCW5ldyBCYXNpY0VMaXN0PElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+KCk7CisJCUNsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFJldHJpZXZlIGFsbCBTTG9jYWxFdmVudHMgYW5kIFNTeXN0ZW1FdmVudHMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcz4+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVFVkVOVFNfTElTVC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gPT0gbnVsbCAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcz4gdlNGYWlsdXJlRXZlbnRMQW5hbHlzaXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZFbGVtZW50LCB2U0ZhaWx1cmVFdmVudExBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdC5hZGQoKElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJLyoqCisJCQkgKiBSZXRyaWV2ZSBhbGwgU0xvY2FsRXZlbnRzIGFuZCBTU3lzdGVtRXZlbnRzLgorCQkJICovCisJCQlmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKKwkJCQlJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+PiB2SXRlcmF0b3IgPQorCQkJCQlFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFRVZFTlRTX0xJU1QuaXRlcmF0b3IoKTsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOworCQkJCXdoaWxlICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+IHZTRmFpbHVyZUV2ZW50TEFuYWx5c2lzID0KKwkJCQkJCXZJdGVyYXRvci5uZXh0KCk7CisJCQkJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgdlNGYWlsdXJlRXZlbnRMQW5hbHlzaXMpOworCQkJCX0KKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QuYWRkKChJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZUV2ZW50TEFuYWx5c2lzPiB2VVNGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCA9Ci0gICAgICAgICAgICBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcz4oCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlRXZlbnRzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIHZTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcz4gdlVTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QgPQorCQkJbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+KAorCQkJCXRoaXMsCisJCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNCbG9ja0xBbmFseXNpc19TRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKSwKKwkJCQl2U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0LnNpemUoKSwKKwkJCQl2U0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0LnRvQXJyYXkoKSk7CiAKLSAgICAgICAgcmV0dXJuIHZVU0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVU0ZhaWx1cmVFdmVudHNMQW5hbHlzaXNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZTUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oKTsKLSAgICAgICAgQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgeworCQlFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTUHJvcGFnYXRpb25MaW5rPigpOworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXRyaWV2ZSBhbGwgU1Byb3BhZ2F0aW9uTGlua3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1Byb3BhZ2F0aW9uRWxlbWVudCh2RWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgdlJlbGF0aW9uc2hpcCA6IHZFbGVtZW50LmdldFJlbGF0aW9uc2hpcHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2UmVsYXRpb25zaGlwLCBJU1Byb3BhZ2F0aW9uTGluay5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyaWZ5IGlmIHRoZSBwcm9wYWdhdGlvbkxpbmsgZXhpc3RzIGluIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNQcm9wYWdhdGlvbkxpbmsgdlNQcm9wYWdhdGlvbkxpbmsgPSAoSVNQcm9wYWdhdGlvbkxpbmspIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2U1Byb3BhZ2F0aW9uTGlua3NMaXN0LmNvbnRhaW5zKHZTUHJvcGFnYXRpb25MaW5rKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2U1Byb3BhZ2F0aW9uTGlua3NMaXN0LmFkZCh2U1Byb3BhZ2F0aW9uTGluayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQkvKioKKwkJCSAqIFJldHJpZXZlIGFsbCBTUHJvcGFnYXRpb25MaW5rcy4KKwkJCSAqLworCQkJZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7CisJCQkJaWYgKGlzUHJvcGFnYXRpb25FbGVtZW50KHZFbGVtZW50KSkgeworCQkJCQlmb3IgKFJlbGF0aW9uc2hpcCB2UmVsYXRpb25zaGlwIDogdkVsZW1lbnQuZ2V0UmVsYXRpb25zaGlwcygpKSB7CisJCQkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQorCQkJCQkJCVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZSZWxhdGlvbnNoaXAsIElTUHJvcGFnYXRpb25MaW5rLmNsYXNzKTsKKwkJCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkvKiBWZXJpZnkgaWYgdGhlIHByb3BhZ2F0aW9uTGluayBleGlzdHMgaW4gdGhlIGxpc3QgKi8KKwkJCQkJCQlJU1Byb3BhZ2F0aW9uTGluayB2U1Byb3BhZ2F0aW9uTGluayA9IChJU1Byb3BhZ2F0aW9uTGluaykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKKwkJCQkJCQlpZiAoIXZTUHJvcGFnYXRpb25MaW5rc0xpc3QuY29udGFpbnModlNQcm9wYWdhdGlvbkxpbmspKSB7CisJCQkJCQkJCXZTUHJvcGFnYXRpb25MaW5rc0xpc3QuYWRkKHZTUHJvcGFnYXRpb25MaW5rKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVTUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCi0gICAgICAgICAgICB2U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZTUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKLSAgICAgICAgcmV0dXJuIHZVU1Byb3BhZ2F0aW9uTGlua3NMaXN0OwotICAgIH0KKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKKwkJCXRoaXMsCisJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJdlNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCXJldHVybiB2VVNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgVU1MIEVsZW1lbnQgaXMgYSBQcm9wYWdhdGlvbiBFbGVtZW50IGJ5IHN0ZXJlb3R5cGUgYXBwbGljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEVsZW1lbnQgVGhlIFVNTCBFbGVtZW50Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbGVtZW50IGlzIGEgUHJvcGFnYXRpb24gRWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Byb3BhZ2F0aW9uRWxlbWVudChmaW5hbCBFbGVtZW50IHBFbGVtZW50KSB7Ci0gICAgICAgIGJvb2xlYW4gdklzUHJvcGFnYXRpb25FbGVtZW50ID0gZmFsc2U7Ci0gICAgICAgIExpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4gdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+KCk7CisJLyoqCisJICogQ2hlY2sgaWYgdGhlIFVNTCBFbGVtZW50IGlzIGEgUHJvcGFnYXRpb24gRWxlbWVudCBieSBzdGVyZW90eXBlIGFwcGxpY2F0aW9uLgorCSAqCisJICogQHBhcmFtIHBFbGVtZW50IFRoZSBVTUwgRWxlbWVudAorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhIFByb3BhZ2F0aW9uIEVsZW1lbnQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNQcm9wYWdhdGlvbkVsZW1lbnQoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlib29sZWFuIHZJc1Byb3BhZ2F0aW9uRWxlbWVudCA9IGZhbHNlOworCQlMaXN0PGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+IHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QgPQorCQkJbmV3IEFycmF5TGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PigpOwogCi0gICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0xPR0lDQUxHQVRFU19MSVNUKTsKLSAgICAgICAgdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5hZGRBbGwoRVNGTG9jYWxBbmFseXNpc1NldC5TRkFJTFVSRUVWRU5UU19MSVNUKTsKLSAgICAgICAgdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5hZGRBbGwoRVNGTG9jYWxBbmFseXNpc1NldC5TRkFJTFVSRU1PREVTX0xJU1QpOworCQl2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNMT0dJQ0FMR0FURVNfTElTVCk7CisJCXZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVFVkVOVFNfTElTVCk7CisJCXZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU19MSVNUKTsKIAotICAgICAgICBJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PiB2SXRlcmF0b3IgPQotICAgICAgICAgICAgdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PiB2SXRlcmF0b3IgPQorCQkJdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOwogCi0gICAgICAgIHdoaWxlICghdklzUHJvcGFnYXRpb25FbGVtZW50ICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4gdlNQcm9wYWdhdGlvbkVsZW1lbnQgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U1Byb3BhZ2F0aW9uRWxlbWVudCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZJc1Byb3BhZ2F0aW9uRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZJc1Byb3BhZ2F0aW9uRWxlbWVudDsKLSAgICB9CisJCXdoaWxlICghdklzUHJvcGFnYXRpb25FbGVtZW50ICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4gdlNQcm9wYWdhdGlvbkVsZW1lbnQgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U1Byb3BhZ2F0aW9uRWxlbWVudCkgIT0gbnVsbCkgeworCQkJCXZJc1Byb3BhZ2F0aW9uRWxlbWVudCA9IHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZJc1Byb3BhZ2F0aW9uRWxlbWVudDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTUG9ydExBbmFseXNpcz4gZ2V0U1BvcnRzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQb3J0TEFuYWx5c2lzPiB2U1BvcnRzTEFuYWx5c2lzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTUG9ydExBbmFseXNpcz4oKTsKLSAgICAgICAgQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1BvcnRMQW5hbHlzaXM+IGdldFNQb3J0c0xBbmFseXNpc0xpc3QoKSB7CisJCUVMaXN0PElTUG9ydExBbmFseXNpcz4gdlNQb3J0c0xBbmFseXNpc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU1BvcnRMQW5hbHlzaXM+KCk7CisJCUNsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFJldHJpZXZlIGFsbCBTUG9ydHNMQW5hbHlzaXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZFbGVtZW50LCBJU1BvcnRMQW5hbHlzaXMuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNQb3J0c0xBbmFseXNpc0xpc3QuYWRkKChJU1BvcnRMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJLyoqCisJCQkgKiBSZXRyaWV2ZSBhbGwgU1BvcnRzTEFuYWx5c2lzLgorCQkJICovCisJCQlmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNQb3J0TEFuYWx5c2lzLmNsYXNzKTsKKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZTUG9ydHNMQW5hbHlzaXNMaXN0LmFkZCgoSVNQb3J0TEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU1BvcnRMQW5hbHlzaXM+IHZVU1BvcnRzTEFuYWx5c2lzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1BvcnRMQW5hbHlzaXM+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU1BvcnRzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgdlNQb3J0c0xBbmFseXNpc0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgdlNQb3J0c0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKLSAgICAgICAgcmV0dXJuIHZVU1BvcnRzTEFuYWx5c2lzTGlzdDsKLSAgICB9CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUG9ydExBbmFseXNpcz4gdlVTUG9ydHNMQW5hbHlzaXNMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUG9ydExBbmFseXNpcz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNCbG9ja0xBbmFseXNpc19TUG9ydHNMQW5hbHlzaXNMaXN0KCksCisJCQl2U1BvcnRzTEFuYWx5c2lzTGlzdC5zaXplKCksCisJCQl2U1BvcnRzTEFuYWx5c2lzTGlzdC50b0FycmF5KCkpOworCQlyZXR1cm4gdlVTUG9ydHNMQW5hbHlzaXNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPiBnZXRTTG9naWNhbEdhdGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPiB2U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QgPQotICAgICAgICAgICAgbmV3IEJhc2ljRUxpc3Q8SUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPigpOwotICAgICAgICBDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4gZ2V0U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QoKSB7CisJCUVMaXN0PElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4gdlNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0ID0KKwkJCW5ldyBCYXNpY0VMaXN0PElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4oKTsKKwkJQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CiAKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogUmV0cmlldmUgYWxsIFNPckdhdGVzTEFuYWx5c2lzIGFuZCBTQW5kR2F0ZXNMQW5hbHlzaXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPj4gdkl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1NldC5TTE9HSUNBTEdBVEVTX0xJU1QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIHdoaWxlICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4gdlNMb2dpY2FsR2F0ZUxBbmFseXNpcyA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgdlNMb2dpY2FsR2F0ZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0LmFkZCgoSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCS8qKgorCQkJICogUmV0cmlldmUgYWxsIFNPckdhdGVzTEFuYWx5c2lzIGFuZCBTQW5kR2F0ZXNMQW5hbHlzaXMuCisJCQkgKi8KKwkJCWZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgeworCQkJCUl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPj4gdkl0ZXJhdG9yID0KKwkJCQkJRVNGTG9jYWxBbmFseXNpc1NldC5TTE9HSUNBTEdBVEVTX0xJU1QuaXRlcmF0b3IoKTsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOworCQkJCXdoaWxlICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4gdlNMb2dpY2FsR2F0ZUxBbmFseXNpcyA9IHZJdGVyYXRvci5uZXh0KCk7CisJCQkJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgdlNMb2dpY2FsR2F0ZUxBbmFseXNpcyk7CisJCQkJfQorCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0LmFkZCgoSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXM+IHZVU0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QgPQotICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4oCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAgICAgdlNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKLSAgICAgICAgICAgICAgICB2U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKLSAgICAgICAgcmV0dXJuIHZVU0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3Q7Ci0gICAgfQorCQlVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXM+IHZVU0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QgPQorCQkJbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4oCisJCQkJdGhpcywKKwkJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0KCksCisJCQkJdlNMb2dpY2FsR2F0ZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKKwkJCQl2U0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKKwkJcmV0dXJuIHZVU0xvZ2ljYWxHYXRlc0xBbmFseXNpc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9Ci0gICAgICAgICAgICBuZXcgQmFzaWNFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KCk7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQorCQkJbmV3IEJhc2ljRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPigpOworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXRyaWV2ZSBhbGwgU1VsdGltZWx5RmFpbHVyZU1vZGVzLCBTRXJyb25lb3VzRmFpbHVyZU1vZGVzIGFuZCBTQWJzZW50RmFpbHVyZU1vZGVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU19MSVNULml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICB3aGlsZSAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9PSBudWxsICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZTRmFpbHVyZU1vZGVMQW5hbHlzaXMgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIHZTRmFpbHVyZU1vZGVMQW5hbHlzaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5hZGQoKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQkvKioKKwkJCSAqIFJldHJpZXZlIGFsbCBTVWx0aW1lbHlGYWlsdXJlTW9kZXMsIFNFcnJvbmVvdXNGYWlsdXJlTW9kZXMgYW5kIFNBYnNlbnRGYWlsdXJlTW9kZXMuCisJCQkgKi8KKwkJCWZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgeworCQkJCUl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPj4gdkl0ZXJhdG9yID0KKwkJCQkJRVNGTG9jYWxBbmFseXNpc1NldC5TRkFJTFVSRU1PREVTX0xJU1QuaXRlcmF0b3IoKTsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOworCQkJCXdoaWxlICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlNGYWlsdXJlTW9kZUxBbmFseXNpcyA9IHZJdGVyYXRvci5uZXh0KCk7CisJCQkJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgdlNGYWlsdXJlTW9kZUxBbmFseXNpcyk7CisJCQkJfQorCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LmFkZCgoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQotICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKLSAgICAgICAgICAgICAgICB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKLSAgICAgICAgcmV0dXJuIHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Q7Ci0gICAgfQorCQlVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQorCQkJbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oCisJCQkJdGhpcywKKwkJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQkJdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKKwkJCQl2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKKwkJcmV0dXJuIHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJU0JhcnJpZXJMQW5hbHlzaXM+IGdldFNCYXJyaWVyc0xBbmFseXNpc0xpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElTQmFycmllckxBbmFseXNpcz4gdlNCYXJyaWVyc0xBbmFseXNpc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0JhcnJpZXJMQW5hbHlzaXM+KCk7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNCYXJyaWVyTEFuYWx5c2lzPiBnZXRTQmFycmllcnNMQW5hbHlzaXNMaXN0KCkgeworCQlFTGlzdDxJU0JhcnJpZXJMQW5hbHlzaXM+IHZTQmFycmllcnNMQW5hbHlzaXNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNCYXJyaWVyTEFuYWx5c2lzPigpOworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXRyaWV2ZSBhbGwgU0JhcnJpZXJzTEFuYWx5c2lzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNCYXJyaWVyTEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTQmFycmllcnNMQW5hbHlzaXNMaXN0LmFkZCgoSVNCYXJyaWVyTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCS8qKgorCQkJICogUmV0cmlldmUgYWxsIFNCYXJyaWVyc0xBbmFseXNpcy4KKwkJCSAqLworCQkJZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTQmFycmllckxBbmFseXNpcy5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2U0JhcnJpZXJzTEFuYWx5c2lzTGlzdC5hZGQoKElTQmFycmllckxBbmFseXNpcykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNCYXJyaWVyTEFuYWx5c2lzPiB2VVNCYXJyaWVyc0xBbmFseXNpc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNCYXJyaWVyTEFuYWx5c2lzPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0Jsb2NrTEFuYWx5c2lzX1NCYXJyaWVyc0xBbmFseXNpc0xpc3QoKSwKLSAgICAgICAgICAgIHZTQmFycmllcnNMQW5hbHlzaXNMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZTQmFycmllcnNMQW5hbHlzaXNMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgIHJldHVybiB2VVNCYXJyaWVyc0xBbmFseXNpc0xpc3Q7Ci0gICAgfQorCQlVbm1vZGlmaWFibGVFTGlzdDxJU0JhcnJpZXJMQW5hbHlzaXM+IHZVU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU0JhcnJpZXJMQW5hbHlzaXM+KAorCQkJdGhpcywKKwkJCUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTQmxvY2tMQW5hbHlzaXNfU0JhcnJpZXJzTEFuYWx5c2lzTGlzdCgpLAorCQkJdlNCYXJyaWVyc0xBbmFseXNpc0xpc3Quc2l6ZSgpLAorCQkJdlNCYXJyaWVyc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKKwkJcmV0dXJuIHZVU0JhcnJpZXJzTEFuYWx5c2lzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTTG9jYWxBbmFseXNpcyBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgewotICAgICAgICBDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgSVNMb2NhbEFuYWx5c2lzIHZMb2NhbEFuYWx5c2lzID0gbnVsbDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTTG9jYWxBbmFseXNpcyBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgeworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKKwkJSVNMb2NhbEFuYWx5c2lzIHZMb2NhbEFuYWx5c2lzID0gbnVsbDsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCB2T3duZXIgPSB2QmFzZS5nZXRPd25lcigpOwotICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0xvY2FsQW5hbHlzaXMuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZMb2NhbEFuYWx5c2lzID0gKElTTG9jYWxBbmFseXNpcykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdkxvY2FsQW5hbHlzaXM7Ci0gICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJRWxlbWVudCB2T3duZXIgPSB2QmFzZS5nZXRPd25lcigpOworCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0xvY2FsQW5hbHlzaXMuY2xhc3MpOworCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCXZMb2NhbEFuYWx5c2lzID0gKElTTG9jYWxBbmFseXNpcykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdkxvY2FsQW5hbHlzaXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uLmphdmEKaW5kZXggNDQzZGRhOC4uYjQ1NmYzNCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24uamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbi5qYXZhCkBAIC0zMSwxMTggKzMxLDExOCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24KLSAgICBleHRlbmRzIFNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24KLSAgICBpbXBsZW1lbnRzIElNU0R5c2Z1bmN0aW9uYWxBc3NvY2lhdGlvbiB7CisJZXh0ZW5kcyBTRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uCisJaW1wbGVtZW50cyBJTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24gewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNEeXNmdW5jdGlvbmFsQXNzb2NpYXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TRHlzZnVuY3Rpb25hbEFzc29jaWF0aW9uKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ29ubmVjdG9yKCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX0Nvbm5lY3RvcigpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX0Nvbm5lY3RvcigpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9Db25uZWN0b3IoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciBiYXNpY0dldFNGYWlsdXJlTW9kZU93bmVyKCkgewotICAgICAgICBDb25uZWN0b3IgdkJhc2UgPSBnZXRCYXNlX0Nvbm5lY3RvcigpOwotICAgICAgICBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lciB2U0ZhaWx1cmVNb2RlT3duZXIgPSBudWxsOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRTRmFpbHVyZU1vZGVPd25lcigpIHsKKwkJQ29ubmVjdG9yIHZCYXNlID0gZ2V0QmFzZV9Db25uZWN0b3IoKTsKKwkJSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgdlNGYWlsdXJlTW9kZU93bmVyID0gbnVsbDsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8Q29ubmVjdG9yRW5kPiB2SXRlcmF0b3IgPSB2QmFzZS5nZXRFbmRzKCkuaXRlcmF0b3IoKTsKKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPENvbm5lY3RvckVuZD4gdkl0ZXJhdG9yID0gdkJhc2UuZ2V0RW5kcygpLml0ZXJhdG9yKCk7CiAKLSAgICAgICAgICAgIHdoaWxlICgodlNGYWlsdXJlTW9kZU93bmVyID09IG51bGwpICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBDb25uZWN0b3JFbmQgdkNvbm5lY3RvckVuZCA9IChDb25uZWN0b3JFbmQpIHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTRmFpbHVyZU1vZGVPd25lcih2Q29ubmVjdG9yRW5kLmdldFJvbGUoKSk7CisJCQl3aGlsZSAoKHZTRmFpbHVyZU1vZGVPd25lciA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJQ29ubmVjdG9yRW5kIHZDb25uZWN0b3JFbmQgPSAoQ29ubmVjdG9yRW5kKSB2SXRlcmF0b3IubmV4dCgpOworCQkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIodkNvbm5lY3RvckVuZC5nZXRSb2xlKCkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2U0ZhaWx1cmVNb2RlT3duZXIgPSAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIpIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlNGYWlsdXJlTW9kZU93bmVyID0gKElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJCX0KKwkJCX0KIAotICAgICAgICB9CisJCX0KIAotICAgICAgICByZXR1cm4gdlNGYWlsdXJlTW9kZU93bmVyOwotICAgIH0KKwkJcmV0dXJuIHZTRmFpbHVyZU1vZGVPd25lcjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyBiYXNpY0dldFNGYWlsdXJlTW9kZUxBbmFseXNpcygpIHsKLSAgICAgICAgQ29ubmVjdG9yIHZCYXNlID0gZ2V0QmFzZV9Db25uZWN0b3IoKTsKLSAgICAgICAgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHZTRmFpbHVyZU1vZGUgPSBudWxsOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIGJhc2ljR2V0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKCkgeworCQlDb25uZWN0b3IgdkJhc2UgPSBnZXRCYXNlX0Nvbm5lY3RvcigpOworCQlJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgdlNGYWlsdXJlTW9kZSA9IG51bGw7CiAKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPENvbm5lY3RvckVuZD4gdkl0ZXJhdG9yID0gdkJhc2UuZ2V0RW5kcygpLml0ZXJhdG9yKCk7CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxDb25uZWN0b3JFbmQ+IHZJdGVyYXRvciA9IHZCYXNlLmdldEVuZHMoKS5pdGVyYXRvcigpOwogCi0gICAgICAgICAgICB3aGlsZSAoKHZTRmFpbHVyZU1vZGUgPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIENvbm5lY3RvckVuZCB2Q29ubmVjdG9yRW5kID0gKENvbm5lY3RvckVuZCkgdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNGYWlsdXJlTW9kZUxBbmFseXNpcyh2Q29ubmVjdG9yRW5kLmdldFJvbGUoKSk7CisJCQl3aGlsZSAoKHZTRmFpbHVyZU1vZGUgPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUNvbm5lY3RvckVuZCB2Q29ubmVjdG9yRW5kID0gKENvbm5lY3RvckVuZCkgdkl0ZXJhdG9yLm5leHQoKTsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQorCQkJCQlnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNGYWlsdXJlTW9kZUxBbmFseXNpcyh2Q29ubmVjdG9yRW5kLmdldFJvbGUoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGUgPSAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZTRmFpbHVyZU1vZGUgPSAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJCX0KKwkJCX0KIAotICAgICAgICB9CisJCX0KIAotICAgICAgICByZXR1cm4gdlNGYWlsdXJlTW9kZTsKLSAgICB9CisJCXJldHVybiB2U0ZhaWx1cmVNb2RlOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTRmFpbHVyZU1vZGVPd25lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgewotICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOworCS8qKgorCSAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTRmFpbHVyZU1vZGVPd25lci4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCisJICovCisJcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlT3duZXIoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOwogCi0gICAgICAgIEl0ZXJhdG9yPGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXI+PiB2SXRlcmF0b3IgPQotICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1NldC5TRkFJTFVSRU1PREVTT1dORVJfTElTVC5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyPj4gdkl0ZXJhdG9yID0KKwkJCUVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU09XTkVSX0xJU1QuaXRlcmF0b3IoKTsKIAotICAgICAgICB3aGlsZSAoKHZTdGVyZW90eXBlQXBwbGljYXRpb24gPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcj4gdlNGYWlsdXJlTW9kZU93bmVyID0gdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgdlNGYWlsdXJlTW9kZU93bmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICB9CisJCXdoaWxlICgodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyPiB2U0ZhaWx1cmVNb2RlT3duZXIgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U0ZhaWx1cmVNb2RlT3duZXIpOworCQl9CisJCXJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTRmFpbHVyZU1vZGVMQW5hbHlzaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEVsZW1lbnQgVGhlIFVNTCBFbGVtZW50Ci0gICAgICogQHJldHVybiBUaGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgRU9iamVjdCBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNGYWlsdXJlTW9kZUxBbmFseXNpcyhmaW5hbCBFbGVtZW50IHBFbGVtZW50KSB7Ci0gICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IG51bGw7CisJLyoqCisJICogR2V0IHRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uIG9mIFNGYWlsdXJlTW9kZUxBbmFseXNpcy4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgVU1MIEVsZW1lbnQKKwkgKiBAcmV0dXJuIFRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uCisJICovCisJcHJpdmF0ZSBFT2JqZWN0IGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbk9mU0ZhaWx1cmVNb2RlTEFuYWx5c2lzKGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKIAotICAgICAgICBJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVC5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IHZJdGVyYXRvciA9CisJCQlFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVC5pdGVyYXRvcigpOwogCi0gICAgICAgIHdoaWxlICgodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlNGYWlsdXJlTW9kZSA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIHZTRmFpbHVyZU1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgIH0KKwkJd2hpbGUgKCh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID09IG51bGwpICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2RlID0gdkl0ZXJhdG9yLm5leHQoKTsKKwkJCXZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgdlNGYWlsdXJlTW9kZSk7CisJCX0KKwkJcmV0dXJuIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5qYXZhCmluZGV4IGYyNGI1NTUuLjRhZjYxMTQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TRXJyb25lb3VzRmFpbHVyZU1vZGUuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0Vycm9uZW91c0ZhaWx1cmVNb2RlLmphdmEKQEAgLTI2LDc5ICsyNiw3OSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNFcnJvbmVvdXNGYWlsdXJlTW9kZQotICAgIGV4dGVuZHMgU0Vycm9uZW91c0ZhaWx1cmVNb2RlCi0gICAgaW1wbGVtZW50cyBJTVNFcnJvbmVvdXNGYWlsdXJlTW9kZSB7CisJZXh0ZW5kcyBTRXJyb25lb3VzRmFpbHVyZU1vZGUKKwlpbXBsZW1lbnRzIElNU0Vycm9uZW91c0ZhaWx1cmVNb2RlIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TRXJyb25lb3VzRmFpbHVyZU1vZGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TRXJyb25lb3VzRmFpbHVyZU1vZGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmdldFNCbG9ja0xBbmFseXNpcyhnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRPd25lcigpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRPd25lcihnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGJhc2ljR2V0T3duZXIoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuZ2V0T3duZXIoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOwogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOworCQlVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQotICAgICAgICAgICAgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KKwkJCUdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0ZlYXJlZEV2ZW50LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0ZlYXJlZEV2ZW50LmphdmEKaW5kZXggYjQyZjljMy4uNmQ0Mjc1YyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNGZWFyZWRFdmVudC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TRmVhcmVkRXZlbnQuamF2YQpAQCAtMzUsMTIyICszNSwxMjIgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIE1TRmVhcmVkRXZlbnQKLSAgICBleHRlbmRzIFNGZWFyZWRFdmVudAotICAgIGltcGxlbWVudHMgSU1TRmVhcmVkRXZlbnQgeworCWV4dGVuZHMgU0ZlYXJlZEV2ZW50CisJaW1wbGVtZW50cyBJTVNGZWFyZWRFdmVudCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNU0ZlYXJlZEV2ZW50KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBNU0ZlYXJlZEV2ZW50KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ2xhc3MoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ2xhc3MoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9DbGFzcygpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9DbGFzcygpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLSAgICAgICAgYm9vbGVhbiB2SXNTZWxlY3RlZCA9IGZhbHNlOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgeworCQlib29sZWFuIHZJc1NlbGVjdGVkID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKCFnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdklzU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICB9CisJCWlmICghZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5pc0VtcHR5KCkpIHsKKwkJCXZJc1NlbGVjdGVkID0gdHJ1ZTsKKwkJfQogCi0gICAgICAgIHJldHVybiB2SXNTZWxlY3RlZDsKLSAgICB9CisJCXJldHVybiB2SXNTZWxlY3RlZDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBCYXNpY0VMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oKTsKLSAgICAgICAgQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgeworCQlFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9CisJCQluZXcgQmFzaWNFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KCk7CisJCUNsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKLSAgICAgICAgICAgIElTTG9jYWxBbmFseXNpcyB2U0xvY2FsQW5hbHlzaXMgPSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkuZ2V0U0xvY2FsQW5hbHlzaXMoKTsKKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUlTRmVhcmVkRXZlbnRzTGlicmFyeSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpOworCQkJSVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9IHZTRmVhcmVkRXZlbnRzTGlicmFyeS5nZXRTTG9jYWxBbmFseXNpcygpOwogCi0gICAgICAgICAgICBpZiAodlNMb2NhbEFuYWx5c2lzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBhbGwgU0ZhaWx1cmVNb2Rlc0xBbmFseXNpcyBvZiB0aGUgU0xvY2FsQW5hbHlzaXMgZm9yIGVhY2ggU0Jsb2NrTEFuYWx5c2lzCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRha2UgYWxsIHdoaWNoIGNvbnRhaW4gdGhlIFNGZWFyZWRFdmVudCAodGhpcykuCi0gICAgICAgICAgICAgICAgZm9yIChJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgOiB2U0xvY2FsQW5hbHlzaXMuZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyB2U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIDogdlNCbG9ja0xBbmFseXNpcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPElTRmVhcmVkRXZlbnQ+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRTRmVhcmVkRXZlbnRzTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIHZGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCF2Rm91bmQgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRmVhcmVkRXZlbnQgdlNGZWFyZWRFdmVudCA9IChJU0ZlYXJlZEV2ZW50KSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2U0ZlYXJlZEV2ZW50LmdldEJhc2VfQ2xhc3MoKS5lcXVhbHModkJhc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5hZGQodlNGYWlsdXJlTW9kZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQlpZiAodlNMb2NhbEFuYWx5c2lzICE9IG51bGwpIHsKKwkJCQkvLyBSZXRyaWV2ZSBhbGwgU0ZhaWx1cmVNb2Rlc0xBbmFseXNpcyBvZiB0aGUgU0xvY2FsQW5hbHlzaXMgZm9yIGVhY2ggU0Jsb2NrTEFuYWx5c2lzCisJCQkJLy8gYW5kIHRha2UgYWxsIHdoaWNoIGNvbnRhaW4gdGhlIFNGZWFyZWRFdmVudCAodGhpcykuCisJCQkJZm9yIChJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgOiB2U0xvY2FsQW5hbHlzaXMuZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSkgeworCQkJCQlmb3IgKElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcyB2U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIDogdlNCbG9ja0xBbmFseXNpcworCQkJCQkJLmdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkpIHsKKwkJCQkJCUl0ZXJhdG9yPElTRmVhcmVkRXZlbnQ+IHZJdGVyYXRvciA9CisJCQkJCQkJdlNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRTRmVhcmVkRXZlbnRzTGlzdCgpLml0ZXJhdG9yKCk7CisJCQkJCQlCb29sZWFuIHZGb3VuZCA9IGZhbHNlOworCQkJCQkJd2hpbGUgKCF2Rm91bmQgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCUlTRmVhcmVkRXZlbnQgdlNGZWFyZWRFdmVudCA9IChJU0ZlYXJlZEV2ZW50KSB2SXRlcmF0b3IubmV4dCgpOworCQkJCQkJCWlmICh2U0ZlYXJlZEV2ZW50LmdldEJhc2VfQ2xhc3MoKS5lcXVhbHModkJhc2UpKSB7CisJCQkJCQkJCXZGb3VuZCA9IHRydWU7CisJCQkJCQkJCXZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5hZGQodlNGYWlsdXJlTW9kZUxBbmFseXNpcyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2VVNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudF9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5zaXplKCksCi0gICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlVTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9CisJCQluZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPigKKwkJCQl0aGlzLAorCQkJCUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSwKKwkJCQl2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Quc2l6ZSgpLAorCQkJCXZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VVNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7Ci0gICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBudWxsOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCUNsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCQlJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gbnVsbDsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkodkJhc2UpOwotICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQl2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSh2QmFzZSk7CisJCX0KIAotICAgICAgICByZXR1cm4gdlNGZWFyZWRFdmVudHNMaWJyYXJ5OwotICAgIH0KKwkJcmV0dXJuIHZTRmVhcmVkRXZlbnRzTGlicmFyeTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBTRmVhcmVkRXZlbnRzTGlicmFyeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwRWxlbWVudCBUaGUgb3duZWQgRWxlbWVudAotICAgICAqIEByZXR1cm4gVGhlIFNGZWFyZWRFdmVudHNMaWJyYXJ5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgewotICAgICAgICBFbGVtZW50IHZPd25lciA9IHBFbGVtZW50LmdldE93bmVyKCk7Ci0gICAgICAgIElTRmVhcmVkRXZlbnRzTGlicmFyeSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBudWxsOworCS8qKgorCSAqIFJldHJpZXZlIFNGZWFyZWRFdmVudHNMaWJyYXJ5LgorCSAqCisJICogQHBhcmFtIHBFbGVtZW50IFRoZSBvd25lZCBFbGVtZW50CisJICogQHJldHVybiBUaGUgU0ZlYXJlZEV2ZW50c0xpYnJhcnkKKwkgKi8KKwlwcml2YXRlIElTRmVhcmVkRXZlbnRzTGlicmFyeSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeShmaW5hbCBFbGVtZW50IHBFbGVtZW50KSB7CisJCUVsZW1lbnQgdk93bmVyID0gcEVsZW1lbnQuZ2V0T3duZXIoKTsKKwkJSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IG51bGw7CiAKLSAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkuY2xhc3MpOwotICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSAoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkodk93bmVyKTsKLSAgICAgICAgfQorCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2T3duZXIsIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcyk7CisJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCXZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IChJU0ZlYXJlZEV2ZW50c0xpYnJhcnkpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCX0gZWxzZSB7CisJCQl2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBnZXRTRmVhcmVkRXZlbnRzTGlicmFyeSh2T3duZXIpOworCQl9CiAKLSAgICAgICAgcmV0dXJuIHZTRmVhcmVkRXZlbnRzTGlicmFyeTsKLSAgICB9CisJCXJldHVybiB2U0ZlYXJlZEV2ZW50c0xpYnJhcnk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNGZWFyZWRFdmVudHNGYW1pbHkuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TRmVhcmVkRXZlbnRzRmFtaWx5LmphdmEKaW5kZXggNzkxY2RiNS4uNzk3MjgzNSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNGZWFyZWRFdmVudHNGYW1pbHkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU0ZlYXJlZEV2ZW50c0ZhbWlseS5qYXZhCkBAIC0zNiwyNTAgKzM2LDI1MCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNGZWFyZWRFdmVudHNGYW1pbHkKLSAgICBleHRlbmRzIFNGZWFyZWRFdmVudHNGYW1pbHkKLSAgICBpbXBsZW1lbnRzIElNU0ZlYXJlZEV2ZW50c0ZhbWlseSB7CisJZXh0ZW5kcyBTRmVhcmVkRXZlbnRzRmFtaWx5CisJaW1wbGVtZW50cyBJTVNGZWFyZWRFdmVudHNGYW1pbHkgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNGZWFyZWRFdmVudHNGYW1pbHkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TRmVhcmVkRXZlbnRzRmFtaWx5KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ2xhc3MoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfQ2xhc3MoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9DbGFzcygpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9DbGFzcygpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnQ+IGdldFNGZWFyZWRFdmVudHNMaXN0KCkgewotICAgICAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2U0ZlYXJlZEV2ZW50c0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZlYXJlZEV2ZW50PigpOwotICAgICAgICBDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnQ+IGdldFNGZWFyZWRFdmVudHNMaXN0KCkgeworCQlFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2U0ZlYXJlZEV2ZW50c0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZlYXJlZEV2ZW50PigpOworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTRmVhcmVkRXZlbnQuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaXN0LmFkZCgoSVNGZWFyZWRFdmVudCkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNGZWFyZWRFdmVudC5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2U0ZlYXJlZEV2ZW50c0xpc3QuYWRkKChJU0ZlYXJlZEV2ZW50KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2VVNGZWFyZWRFdmVudHNMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnQ+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaXN0KCksCi0gICAgICAgICAgICB2U0ZlYXJlZEV2ZW50c0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnQ+IHZVU0ZlYXJlZEV2ZW50c0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNGZWFyZWRFdmVudD4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKKwkJCXZTRmVhcmVkRXZlbnRzTGlzdC5zaXplKCksCisJCQl2U0ZlYXJlZEV2ZW50c0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVTRmVhcmVkRXZlbnRzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNGZWFyZWRFdmVudHNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElTRmVhcmVkRXZlbnQ+IHZBbGxTRmVhcmVkRXZlbnRzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTRmVhcmVkRXZlbnQ+KCk7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoKSB7CisJCUVMaXN0PElTRmVhcmVkRXZlbnQ+IHZBbGxTRmVhcmVkRXZlbnRzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTRmVhcmVkRXZlbnQ+KCk7CisJCUNsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNGZWFyZWRFdmVudC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2QWxsU0ZlYXJlZEV2ZW50c0xpc3QuYWRkKChJU0ZlYXJlZEV2ZW50KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNGZWFyZWRFdmVudC5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2QWxsU0ZlYXJlZEV2ZW50c0xpc3QuYWRkKChJU0ZlYXJlZEV2ZW50KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CiAKLSAgICAgICAgICAgIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2U3ViRmFtaWxpZXNMaXN0ID0gZ2V0TXlTdWJGYW1pbGllc0xpc3QodkJhc2UpOwotICAgICAgICAgICAgaWYgKCF2U3ViRmFtaWxpZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIElTRmVhcmVkRXZlbnRzRmFtaWx5IHZIZWFkID0gdlN1YkZhbWlsaWVzTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgdlN1YkZhbWlsaWVzTGlzdC5yZW1vdmUoMCk7Ci0gICAgICAgICAgICAgICAgdkFsbFNGZWFyZWRFdmVudHNMaXN0ID0gZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QodkhlYWQsIHZTdWJGYW1pbGllc0xpc3QsIHZBbGxTRmVhcmVkRXZlbnRzTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2U3ViRmFtaWxpZXNMaXN0ID0gZ2V0TXlTdWJGYW1pbGllc0xpc3QodkJhc2UpOworCQkJaWYgKCF2U3ViRmFtaWxpZXNMaXN0LmlzRW1wdHkoKSkgeworCQkJCUlTRmVhcmVkRXZlbnRzRmFtaWx5IHZIZWFkID0gdlN1YkZhbWlsaWVzTGlzdC5nZXQoMCk7CisJCQkJdlN1YkZhbWlsaWVzTGlzdC5yZW1vdmUoMCk7CisJCQkJdkFsbFNGZWFyZWRFdmVudHNMaXN0ID0gZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QodkhlYWQsIHZTdWJGYW1pbGllc0xpc3QsIHZBbGxTRmVhcmVkRXZlbnRzTGlzdCk7CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2VUFsbFNGZWFyZWRFdmVudHNMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnQ+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGZWFyZWRFdmVudHNMaXN0KCksCi0gICAgICAgICAgICB2QWxsU0ZlYXJlZEV2ZW50c0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgdkFsbFNGZWFyZWRFdmVudHNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnQ+IHZVQWxsU0ZlYXJlZEV2ZW50c0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNGZWFyZWRFdmVudD4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfU0ZlYXJlZEV2ZW50c0xpc3QoKSwKKwkJCXZBbGxTRmVhcmVkRXZlbnRzTGlzdC5zaXplKCksCisJCQl2QWxsU0ZlYXJlZEV2ZW50c0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVBbGxTRmVhcmVkRXZlbnRzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VUFsbFNGZWFyZWRFdmVudHNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IG93bmVkIFNGZWFyZWRFdmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcFN1YkZhbWlseSBUaGUgY3VycmVudCBzdWItZmFtaWx5Ci0gICAgICogQHBhcmFtIHBTdWJGYW1pbGllc1RvVmlzaXQgVGhlIGxpc3Qgb2YgU3ViLWZhbWlsaWVzIHRvIHZpc2l0Ci0gICAgICogQHBhcmFtIHBBY2NPZlNGZWFyZWRFdmVudHNMaXN0IFRoZQotICAgICAqIEByZXR1cm4gVGhlIExpc3Qgb2YgU0ZlYXJlZEV2ZW50cwotICAgICAqLwotICAgIHByaXZhdGUgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoCi0gICAgICAgIGZpbmFsIElTRmVhcmVkRXZlbnRzRmFtaWx5IHBTdWJGYW1pbHksCi0gICAgICAgIGZpbmFsIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBwU3ViRmFtaWxpZXNUb1Zpc2l0LAotICAgICAgICBmaW5hbCBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBwQWNjT2ZTRmVhcmVkRXZlbnRzTGlzdCkgewotICAgICAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2VXBkYXRlU0ZlYXJlZEV2ZW50c0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZlYXJlZEV2ZW50PigpOwotICAgICAgICB2VXBkYXRlU0ZlYXJlZEV2ZW50c0xpc3QuYWRkQWxsKHBBY2NPZlNGZWFyZWRFdmVudHNMaXN0KTsKLSAgICAgICAgdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0LmFkZEFsbChwU3ViRmFtaWx5LmdldFNGZWFyZWRFdmVudHNMaXN0KCkpOworCS8qKgorCSAqIFJldHJpZXZlIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IG93bmVkIFNGZWFyZWRFdmVudHMuCisJICoKKwkgKiBAcGFyYW0gcFN1YkZhbWlseSBUaGUgY3VycmVudCBzdWItZmFtaWx5CisJICogQHBhcmFtIHBTdWJGYW1pbGllc1RvVmlzaXQgVGhlIGxpc3Qgb2YgU3ViLWZhbWlsaWVzIHRvIHZpc2l0CisJICogQHBhcmFtIHBBY2NPZlNGZWFyZWRFdmVudHNMaXN0IFRoZQorCSAqIEByZXR1cm4gVGhlIExpc3Qgb2YgU0ZlYXJlZEV2ZW50cworCSAqLworCXByaXZhdGUgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0QWxsU0ZlYXJlZEV2ZW50c0xpc3QoCisJCWZpbmFsIElTRmVhcmVkRXZlbnRzRmFtaWx5IHBTdWJGYW1pbHksCisJCWZpbmFsIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBwU3ViRmFtaWxpZXNUb1Zpc2l0LAorCQlmaW5hbCBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBwQWNjT2ZTRmVhcmVkRXZlbnRzTGlzdCkgeworCQlFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2VXBkYXRlU0ZlYXJlZEV2ZW50c0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZlYXJlZEV2ZW50PigpOworCQl2VXBkYXRlU0ZlYXJlZEV2ZW50c0xpc3QuYWRkQWxsKHBBY2NPZlNGZWFyZWRFdmVudHNMaXN0KTsKKwkJdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0LmFkZEFsbChwU3ViRmFtaWx5LmdldFNGZWFyZWRFdmVudHNMaXN0KCkpOwogCi0gICAgICAgIGlmICghcFN1YkZhbWlsaWVzVG9WaXNpdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2VXBkYXRlU3ViRmFtaWxpZXNUb1Zpc2l0ID0gbmV3IEJhc2ljRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+KCk7Ci0gICAgICAgICAgICB2VXBkYXRlU3ViRmFtaWxpZXNUb1Zpc2l0LmFkZEFsbChwU3ViRmFtaWxpZXNUb1Zpc2l0KTsKLSAgICAgICAgICAgIHZVcGRhdGVTdWJGYW1pbGllc1RvVmlzaXQuYWRkQWxsKGdldE15U3ViRmFtaWxpZXNMaXN0KHBTdWJGYW1pbHkuZ2V0QmFzZV9DbGFzcygpKSk7Ci0gICAgICAgICAgICBJU0ZlYXJlZEV2ZW50c0ZhbWlseSB2SGVhZCA9IHZVcGRhdGVTdWJGYW1pbGllc1RvVmlzaXQucmVtb3ZlKDApOworCQlpZiAoIXBTdWJGYW1pbGllc1RvVmlzaXQuaXNFbXB0eSgpKSB7CisJCQlFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gdlVwZGF0ZVN1YkZhbWlsaWVzVG9WaXNpdCA9IG5ldyBCYXNpY0VMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PigpOworCQkJdlVwZGF0ZVN1YkZhbWlsaWVzVG9WaXNpdC5hZGRBbGwocFN1YkZhbWlsaWVzVG9WaXNpdCk7CisJCQl2VXBkYXRlU3ViRmFtaWxpZXNUb1Zpc2l0LmFkZEFsbChnZXRNeVN1YkZhbWlsaWVzTGlzdChwU3ViRmFtaWx5LmdldEJhc2VfQ2xhc3MoKSkpOworCQkJSVNGZWFyZWRFdmVudHNGYW1pbHkgdkhlYWQgPSB2VXBkYXRlU3ViRmFtaWxpZXNUb1Zpc2l0LnJlbW92ZSgwKTsKIAotICAgICAgICAgICAgdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0ID0KLSAgICAgICAgICAgICAgICBnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCh2SGVhZCwgdlVwZGF0ZVN1YkZhbWlsaWVzVG9WaXNpdCwgdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0KTsKLSAgICAgICAgfQorCQkJdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0ID0KKwkJCQlnZXRBbGxTRmVhcmVkRXZlbnRzTGlzdCh2SGVhZCwgdlVwZGF0ZVN1YkZhbWlsaWVzVG9WaXNpdCwgdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0KTsKKwkJfQogCi0gICAgICAgIHJldHVybiB2VXBkYXRlU0ZlYXJlZEV2ZW50c0xpc3Q7Ci0gICAgfQorCQlyZXR1cm4gdlVwZGF0ZVNGZWFyZWRFdmVudHNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBvd25lZCBTRmVhcmVkRXZlbnRzRmFtaWxpZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEJhc2UgVGhlIGVsZW1lbnQgYmFzZSBvZiBTRmVhcmVkRXZlbnRzRmFtaWx5Ci0gICAgICogQHJldHVybiBUaGUgTGlzdCBvZiBTRmVhcmVkRXZlbnRzRmFtaWxpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBnZXRNeVN1YkZhbWlsaWVzTGlzdChmaW5hbCBDbGFzcyBwQmFzZSkgewotICAgICAgICBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gdk15U3ViRmFtaWxpZXNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+KCk7CisJLyoqCisJICogUmV0cmlldmUgdGhlIG93bmVkIFNGZWFyZWRFdmVudHNGYW1pbGllcy4KKwkgKgorCSAqIEBwYXJhbSBwQmFzZSBUaGUgZWxlbWVudCBiYXNlIG9mIFNGZWFyZWRFdmVudHNGYW1pbHkKKwkgKiBAcmV0dXJuIFRoZSBMaXN0IG9mIFNGZWFyZWRFdmVudHNGYW1pbGllcworCSAqLworCXByaXZhdGUgRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldE15U3ViRmFtaWxpZXNMaXN0KGZpbmFsIENsYXNzIHBCYXNlKSB7CisJCUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2TXlTdWJGYW1pbGllc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4oKTsKIAotICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiBwQmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZFbGVtZW50LCBJU0ZlYXJlZEV2ZW50c0ZhbWlseS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdk15U3ViRmFtaWxpZXNMaXN0LmFkZCgoSVNGZWFyZWRFdmVudHNGYW1pbHkpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWZvciAoRWxlbWVudCB2RWxlbWVudCA6IHBCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgeworCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2TXlTdWJGYW1pbGllc0xpc3QuYWRkKChJU0ZlYXJlZEV2ZW50c0ZhbWlseSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7CisJCQl9CisJCX0KIAotICAgICAgICByZXR1cm4gdk15U3ViRmFtaWxpZXNMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZNeVN1YkZhbWlsaWVzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiBnZXRTdWJGYW1pbGllc0xpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2U3ViRmFtaWxpZXNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+KCk7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldFN1YkZhbWlsaWVzTGlzdCgpIHsKKwkJRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IHZTdWJGYW1pbGllc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4oKTsKKwkJQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CiAKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZTdWJGYW1pbGllc0xpc3QuYWRkQWxsKGdldE15U3ViRmFtaWxpZXNMaXN0KHZCYXNlKSk7Ci0gICAgICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCXZTdWJGYW1pbGllc0xpc3QuYWRkQWxsKGdldE15U3ViRmFtaWxpZXNMaXN0KHZCYXNlKSk7CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gdlVTdWJGYW1pbGllc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1N1YkZhbWlsaWVzTGlzdCgpLAotICAgICAgICAgICAgdlN1YkZhbWlsaWVzTGlzdC5zaXplKCksCi0gICAgICAgICAgICB2U3ViRmFtaWxpZXNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2VVN1YkZhbWlsaWVzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNGYW1pbHlfU3ViRmFtaWxpZXNMaXN0KCksCisJCQl2U3ViRmFtaWxpZXNMaXN0LnNpemUoKSwKKwkJCXZTdWJGYW1pbGllc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVTdWJGYW1pbGllc0xpc3Q7Ci0gICAgfQorCQlyZXR1cm4gdlVTdWJGYW1pbGllc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gdklzU2VsZWN0ZWQgPSBmYWxzZTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKKwkJYm9vbGVhbiB2SXNTZWxlY3RlZCA9IGZhbHNlOwogCi0gICAgICAgIGlmICghZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHZJc1NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQorCQlpZiAoIWdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkuaXNFbXB0eSgpKSB7CisJCQl2SXNTZWxlY3RlZCA9IHRydWU7CisJCX0KIAotICAgICAgICByZXR1cm4gdklzU2VsZWN0ZWQ7Ci0gICAgfQorCQlyZXR1cm4gdklzU2VsZWN0ZWQ7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IGdldFNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCkgewotICAgICAgICBFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9Ci0gICAgICAgICAgICBuZXcgQmFzaWNFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KCk7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQorCQkJbmV3IEJhc2ljRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPigpOworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCk7Ci0gICAgICAgICAgICBJU0xvY2FsQW5hbHlzaXMgdlNMb2NhbEFuYWx5c2lzID0gdlNGZWFyZWRFdmVudHNMaWJyYXJ5LmdldFNMb2NhbEFuYWx5c2lzKCk7CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKTsKKwkJCUlTTG9jYWxBbmFseXNpcyB2U0xvY2FsQW5hbHlzaXMgPSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkuZ2V0U0xvY2FsQW5hbHlzaXMoKTsKIAotICAgICAgICAgICAgaWYgKHZTTG9jYWxBbmFseXNpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmV0cmlldmUgYWxsIFNGYWlsdXJlTW9kZXNMQW5hbHlzaXMgb2YgdGhlIFNMb2NhbEFuYWx5c2lzIGZvciBlYWNoIFNCbG9ja0xBbmFseXNpcwotICAgICAgICAgICAgICAgIC8vIGFuZCB0YWtlIGFsbCB3aGljaCBjb250YWluIHRoZSBTRmVhcmVkRXZlbnRzRmFtaWx5ICh0aGlzKS4KLSAgICAgICAgICAgICAgICBmb3IgKElTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA6IHZTTG9jYWxBbmFseXNpcy5nZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzIHZTRmFpbHVyZU1vZGVMQW5hbHlzaXMgOiB2U0Jsb2NrTEFuYWx5c2lzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8SVNGZWFyZWRFdmVudHNGYW1pbHk+IHZJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gdkZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXZGb3VuZCAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNGZWFyZWRFdmVudHNGYW1pbHkgdlNGZWFyZWRFdmVudHNGYW1pbHkgPSAoSVNGZWFyZWRFdmVudHNGYW1pbHkpIHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZTRmVhcmVkRXZlbnRzRmFtaWx5LmdldEJhc2VfQ2xhc3MoKS5lcXVhbHModkJhc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5hZGQodlNGYWlsdXJlTW9kZUxBbmFseXNpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQlpZiAodlNMb2NhbEFuYWx5c2lzICE9IG51bGwpIHsKKwkJCQkvLyBSZXRyaWV2ZSBhbGwgU0ZhaWx1cmVNb2Rlc0xBbmFseXNpcyBvZiB0aGUgU0xvY2FsQW5hbHlzaXMgZm9yIGVhY2ggU0Jsb2NrTEFuYWx5c2lzCisJCQkJLy8gYW5kIHRha2UgYWxsIHdoaWNoIGNvbnRhaW4gdGhlIFNGZWFyZWRFdmVudHNGYW1pbHkgKHRoaXMpLgorCQkJCWZvciAoSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzIDogdlNMb2NhbEFuYWx5c2lzLmdldFNCbG9ja3NMQW5hbHlzaXNMaXN0KCkpIHsKKwkJCQkJZm9yIChJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMgdlNGYWlsdXJlTW9kZUxBbmFseXNpcyA6IHZTQmxvY2tMQW5hbHlzaXMKKwkJCQkJCS5nZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpKSB7CisJCQkJCQlJdGVyYXRvcjxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gdkl0ZXJhdG9yID0KKwkJCQkJCQl2U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKS5pdGVyYXRvcigpOworCQkJCQkJQm9vbGVhbiB2Rm91bmQgPSBmYWxzZTsKKwkJCQkJCXdoaWxlICghdkZvdW5kICYmIHZJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCQlJU0ZlYXJlZEV2ZW50c0ZhbWlseSB2U0ZlYXJlZEV2ZW50c0ZhbWlseSA9IChJU0ZlYXJlZEV2ZW50c0ZhbWlseSkgdkl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCQlpZiAodlNGZWFyZWRFdmVudHNGYW1pbHkuZ2V0QmFzZV9DbGFzcygpLmVxdWFscyh2QmFzZSkpIHsKKwkJCQkJCQkJdkZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LmFkZCh2U0ZhaWx1cmVNb2RlTEFuYWx5c2lzKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+IHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQotICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4oCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlseV9TRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC5zaXplKCksCi0gICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlVTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9CisJCQluZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPigKKwkJCQl0aGlzLAorCQkJCUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzRmFtaWx5X1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCisJCQkJdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKKwkJCQl2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7Ci0gICAgICAgIENsYXNzIHZCYXNlID0gZ2V0QmFzZV9DbGFzcygpOwotICAgICAgICBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gbnVsbDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTRmVhcmVkRXZlbnRzTGlicmFyeSBiYXNpY0dldFNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKKwkJSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IG51bGw7CiAKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KHZCYXNlKTsKLSAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkodkJhc2UpOworCQl9CiAKLSAgICAgICAgcmV0dXJuIHZTRmVhcmVkRXZlbnRzTGlicmFyeTsKLSAgICB9CisJCXJldHVybiB2U0ZlYXJlZEV2ZW50c0xpYnJhcnk7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgU0ZlYXJlZEV2ZW50c0xpYnJhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEVsZW1lbnQgVGhlIG93bmVkIEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFRoZSBTRmVhcmVkRXZlbnRzTGlicmFyeQotICAgICAqLwotICAgIHByaXZhdGUgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKLSAgICAgICAgRWxlbWVudCB2T3duZXIgPSBwRWxlbWVudC5nZXRPd25lcigpOwotICAgICAgICBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gbnVsbDsKKwkvKioKKwkgKiBSZXRyaWV2ZSBTRmVhcmVkRXZlbnRzTGlicmFyeS4KKwkgKgorCSAqIEBwYXJhbSBwRWxlbWVudCBUaGUgb3duZWQgRWxlbWVudAorCSAqIEByZXR1cm4gVGhlIFNGZWFyZWRFdmVudHNMaWJyYXJ5CisJICovCisJcHJpdmF0ZSBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlFbGVtZW50IHZPd25lciA9IHBFbGVtZW50LmdldE93bmVyKCk7CisJCUlTRmVhcmVkRXZlbnRzTGlicmFyeSB2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSBudWxsOwogCi0gICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNGZWFyZWRFdmVudHNMaWJyYXJ5LmNsYXNzKTsKLSAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IGdldFNGZWFyZWRFdmVudHNMaWJyYXJ5KHZPd25lcik7Ci0gICAgICAgIH0KKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkuY2xhc3MpOworCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQl2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSAoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQl9IGVsc2UgeworCQkJdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gZ2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkodk93bmVyKTsKKwkJfQogCi0gICAgICAgIHJldHVybiB2U0ZlYXJlZEV2ZW50c0xpYnJhcnk7Ci0gICAgfQorCQlyZXR1cm4gdlNGZWFyZWRFdmVudHNMaWJyYXJ5OworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TRmVhcmVkRXZlbnRzTGlicmFyeS5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKaW5kZXggNGRhZDc3ZS4uMzIyNjAxZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNGZWFyZWRFdmVudHNMaWJyYXJ5LmphdmEKQEAgLTMxLDEwMSArMzEsMTAxIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBNU0ZlYXJlZEV2ZW50c0xpYnJhcnkKLSAgICBleHRlbmRzIFNGZWFyZWRFdmVudHNMaWJyYXJ5Ci0gICAgaW1wbGVtZW50cyBJTVNGZWFyZWRFdmVudHNMaWJyYXJ5IHsKKwlleHRlbmRzIFNGZWFyZWRFdmVudHNMaWJyYXJ5CisJaW1wbGVtZW50cyBJTVNGZWFyZWRFdmVudHNMaWJyYXJ5IHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgTVNGZWFyZWRFdmVudHNMaWJyYXJ5KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUGFja2FnZSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9QYWNrYWdlKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUGFja2FnZSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9QYWNrYWdlKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IGdldFNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PigpOwotICAgICAgICBQYWNrYWdlIHZCYXNlID0gZ2V0QmFzZV9QYWNrYWdlKCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50c0ZhbWlseT4gZ2V0U0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdCgpIHsKKwkJRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+IHZTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNGZWFyZWRFdmVudHNGYW1pbHk+KCk7CisJCVBhY2thZ2UgdkJhc2UgPSBnZXRCYXNlX1BhY2thZ2UoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0LmFkZCgoSVNGZWFyZWRFdmVudHNGYW1pbHkpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTRmVhcmVkRXZlbnRzRmFtaWx5LmNsYXNzKTsKKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0LmFkZCgoSVNGZWFyZWRFdmVudHNGYW1pbHkpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2VVNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QgPQotICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCksCi0gICAgICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PiB2VVNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3QgPQorCQkJbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnRzRmFtaWx5PigKKwkJCQl0aGlzLAorCQkJCUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0KCksCisJCQkJdlNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3Quc2l6ZSgpLAorCQkJCXZTRmVhcmVkRXZlbnRzRmFtaWxpZXNMaXN0LnRvQXJyYXkoKSk7CiAKLSAgICAgICAgcmV0dXJuIHZVU0ZlYXJlZEV2ZW50c0ZhbWlsaWVzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNGZWFyZWRFdmVudHNGYW1pbGllc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJU0ZlYXJlZEV2ZW50PiBnZXRTRmVhcmVkRXZlbnRzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNGZWFyZWRFdmVudD4gdlNGZWFyZWRFdmVudHNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNGZWFyZWRFdmVudD4oKTsKLSAgICAgICAgUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNGZWFyZWRFdmVudD4gZ2V0U0ZlYXJlZEV2ZW50c0xpc3QoKSB7CisJCUVMaXN0PElTRmVhcmVkRXZlbnQ+IHZTRmVhcmVkRXZlbnRzTGlzdCA9IG5ldyBCYXNpY0VMaXN0PElTRmVhcmVkRXZlbnQ+KCk7CisJCVBhY2thZ2UgdkJhc2UgPSBnZXRCYXNlX1BhY2thZ2UoKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTRmVhcmVkRXZlbnQuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaXN0LmFkZCgoSVNGZWFyZWRFdmVudCkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNGZWFyZWRFdmVudC5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2U0ZlYXJlZEV2ZW50c0xpc3QuYWRkKChJU0ZlYXJlZEV2ZW50KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU0ZlYXJlZEV2ZW50PiB2VVNGZWFyZWRFdmVudHNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU0ZlYXJlZEV2ZW50PigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRmVhcmVkRXZlbnRzTGlicmFyeV9TRmVhcmVkRXZlbnRzTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTRmVhcmVkRXZlbnRzTGlzdC5zaXplKCksCi0gICAgICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnQ+IHZVU0ZlYXJlZEV2ZW50c0xpc3QgPQorCQkJbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTRmVhcmVkRXZlbnQ+KAorCQkJCXRoaXMsCisJCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNGZWFyZWRFdmVudHNMaWJyYXJ5X1NGZWFyZWRFdmVudHNMaXN0KCksCisJCQkJdlNGZWFyZWRFdmVudHNMaXN0LnNpemUoKSwKKwkJCQl2U0ZlYXJlZEV2ZW50c0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVTRmVhcmVkRXZlbnRzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNGZWFyZWRFdmVudHNMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNMb2NhbEFuYWx5c2lzIGJhc2ljR2V0U0xvY2FsQW5hbHlzaXMoKSB7Ci0gICAgICAgIFBhY2thZ2UgdkJhc2UgPSBnZXRCYXNlX1BhY2thZ2UoKTsKLSAgICAgICAgSVNMb2NhbEFuYWx5c2lzIHZMb2NhbEFuYWx5c2lzID0gbnVsbDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTTG9jYWxBbmFseXNpcyBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgeworCQlQYWNrYWdlIHZCYXNlID0gZ2V0QmFzZV9QYWNrYWdlKCk7CisJCUlTTG9jYWxBbmFseXNpcyB2TG9jYWxBbmFseXNpcyA9IG51bGw7CiAKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdk93bmVyID0gdkJhc2UuZ2V0T3duZXIoKTsKLSAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNMb2NhbEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2TG9jYWxBbmFseXNpcyA9IChJU0xvY2FsQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZMb2NhbEFuYWx5c2lzOwotICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUVsZW1lbnQgdk93bmVyID0gdkJhc2UuZ2V0T3duZXIoKTsKKwkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNMb2NhbEFuYWx5c2lzLmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2TG9jYWxBbmFseXNpcyA9IChJU0xvY2FsQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQl9CisJCX0KKwkJcmV0dXJuIHZMb2NhbEFuYWx5c2lzOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TTG9jYWxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNMb2NhbEFuYWx5c2lzLmphdmEKaW5kZXggNmVjNzM1NS4uNWExZGMyOCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNMb2NhbEFuYWx5c2lzLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNMb2NhbEFuYWx5c2lzLmphdmEKQEAgLTM0LDEwNCArMzQsMTA0IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBNU0xvY2FsQW5hbHlzaXMKLSAgICBleHRlbmRzIFNMb2NhbEFuYWx5c2lzCi0gICAgaW1wbGVtZW50cyBJTVNMb2NhbEFuYWx5c2lzIHsKKwlleHRlbmRzIFNMb2NhbEFuYWx5c2lzCisJaW1wbGVtZW50cyBJTVNMb2NhbEFuYWx5c2lzIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TTG9jYWxBbmFseXNpcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgTVNMb2NhbEFuYWx5c2lzKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUGFja2FnZSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9QYWNrYWdlKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUGFja2FnZSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9QYWNrYWdlKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4gZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSB7Ci0gICAgICAgIEVMaXN0PElTQmxvY2tMQW5hbHlzaXM+IHZTU2FmZXR5Q29uY2VwdHNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4oKTsKLSAgICAgICAgUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4gZ2V0U0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSB7CisJCUVMaXN0PElTQmxvY2tMQW5hbHlzaXM+IHZTU2FmZXR5Q29uY2VwdHNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4oKTsKKwkJUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2U1NhZmV0eUNvbmNlcHRzTGlzdC5hZGQoKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJZm9yIChFbGVtZW50IHZFbGVtZW50IDogdkJhc2UuZ2V0T3duZWRFbGVtZW50cygpKSB7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQsIElTQmxvY2tMQW5hbHlzaXMuY2xhc3MpOworCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlNTYWZldHlDb25jZXB0c0xpc3QuYWRkKChJU0Jsb2NrTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU0Jsb2NrTEFuYWx5c2lzPiB2VVNTYWZldHlDb25jZXB0c0xpc3QgPQotICAgICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTQmxvY2tMQW5hbHlzaXM+KAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNMb2NhbEFuYWx5c2lzX1NCbG9ja3NMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAgICAgdlNTYWZldHlDb25jZXB0c0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIHZTU2FmZXR5Q29uY2VwdHNMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTQmxvY2tMQW5hbHlzaXM+IHZVU1NhZmV0eUNvbmNlcHRzTGlzdCA9CisJCQluZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNCbG9ja0xBbmFseXNpcz4oCisJCQkJdGhpcywKKwkJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0xvY2FsQW5hbHlzaXNfU0Jsb2Nrc0xBbmFseXNpc0xpc3QoKSwKKwkJCQl2U1NhZmV0eUNvbmNlcHRzTGlzdC5zaXplKCksCisJCQkJdlNTYWZldHlDb25jZXB0c0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVTU2FmZXR5Q29uY2VwdHNMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVU1NhZmV0eUNvbmNlcHRzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTU3lzdGVtRXZlbnRzTGlicmFyeSBiYXNpY0dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgewotICAgICAgICBQYWNrYWdlIHZCYXNlID0gZ2V0QmFzZV9QYWNrYWdlKCk7Ci0gICAgICAgIElTU3lzdGVtRXZlbnRzTGlicmFyeSB2U3lzdGVtRXZlbnRzTGlicmFyeSA9IG51bGw7Ci0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCb29sZWFuIHZGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgTGlzdDxQYWNrYWdlPiB2UGFja2FnZXNMaXN0ID0gdkJhc2UuZ2V0TmVzdGVkUGFja2FnZXMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yPFBhY2thZ2U+IHZJdGVyYXRvciA9IHZQYWNrYWdlc0xpc3QuaXRlcmF0b3IoKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTU3lzdGVtRXZlbnRzTGlicmFyeSBiYXNpY0dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlQYWNrYWdlIHZCYXNlID0gZ2V0QmFzZV9QYWNrYWdlKCk7CisJCUlTU3lzdGVtRXZlbnRzTGlicmFyeSB2U3lzdGVtRXZlbnRzTGlicmFyeSA9IG51bGw7CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlCb29sZWFuIHZGb3VuZCA9IGZhbHNlOworCQkJTGlzdDxQYWNrYWdlPiB2UGFja2FnZXNMaXN0ID0gdkJhc2UuZ2V0TmVzdGVkUGFja2FnZXMoKTsKKwkJCUl0ZXJhdG9yPFBhY2thZ2U+IHZJdGVyYXRvciA9IHZQYWNrYWdlc0xpc3QuaXRlcmF0b3IoKTsKIAotICAgICAgICAgICAgd2hpbGUgKHZJdGVyYXRvci5oYXNOZXh0KCkgJiYgIXZGb3VuZCkgewotICAgICAgICAgICAgICAgIFBhY2thZ2UgdlBhY2thZ2UgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZQYWNrYWdlLCBJU1N5c3RlbUV2ZW50c0xpYnJhcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlN5c3RlbUV2ZW50c0xpYnJhcnkgPSAoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlN5c3RlbUV2ZW50c0xpYnJhcnk7Ci0gICAgfQorCQkJd2hpbGUgKHZJdGVyYXRvci5oYXNOZXh0KCkgJiYgIXZGb3VuZCkgeworCQkJCVBhY2thZ2UgdlBhY2thZ2UgPSB2SXRlcmF0b3IubmV4dCgpOworCQkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9CisJCQkJCVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZQYWNrYWdlLCBJU1N5c3RlbUV2ZW50c0xpYnJhcnkuY2xhc3MpOworCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlN5c3RlbUV2ZW50c0xpYnJhcnkgPSAoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdlN5c3RlbUV2ZW50c0xpYnJhcnk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgYmFzaWNHZXRTRmVhcmVkRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOwotICAgICAgICBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gbnVsbDsKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gdkZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBMaXN0PFBhY2thZ2U+IHZQYWNrYWdlc0xpc3QgPSB2QmFzZS5nZXROZXN0ZWRQYWNrYWdlcygpOwotICAgICAgICAgICAgSXRlcmF0b3I8UGFja2FnZT4gdkl0ZXJhdG9yID0gdlBhY2thZ2VzTGlzdC5pdGVyYXRvcigpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVNGZWFyZWRFdmVudHNMaWJyYXJ5IGJhc2ljR2V0U0ZlYXJlZEV2ZW50c0xpYnJhcnkoKSB7CisJCVBhY2thZ2UgdkJhc2UgPSBnZXRCYXNlX1BhY2thZ2UoKTsKKwkJSVNGZWFyZWRFdmVudHNMaWJyYXJ5IHZTRmVhcmVkRXZlbnRzTGlicmFyeSA9IG51bGw7CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlCb29sZWFuIHZGb3VuZCA9IGZhbHNlOworCQkJTGlzdDxQYWNrYWdlPiB2UGFja2FnZXNMaXN0ID0gdkJhc2UuZ2V0TmVzdGVkUGFja2FnZXMoKTsKKwkJCUl0ZXJhdG9yPFBhY2thZ2U+IHZJdGVyYXRvciA9IHZQYWNrYWdlc0xpc3QuaXRlcmF0b3IoKTsKIAotICAgICAgICAgICAgd2hpbGUgKHZJdGVyYXRvci5oYXNOZXh0KCkgJiYgIXZGb3VuZCkgewotICAgICAgICAgICAgICAgIFBhY2thZ2UgdlBhY2thZ2UgPSB2SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZQYWNrYWdlLCBJU0ZlYXJlZEV2ZW50c0xpYnJhcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNGZWFyZWRFdmVudHNMaWJyYXJ5ID0gKElTRmVhcmVkRXZlbnRzTGlicmFyeSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTRmVhcmVkRXZlbnRzTGlicmFyeTsKLSAgICB9CisJCQl3aGlsZSAodkl0ZXJhdG9yLmhhc05leHQoKSAmJiAhdkZvdW5kKSB7CisJCQkJUGFja2FnZSB2UGFja2FnZSA9IHZJdGVyYXRvci5uZXh0KCk7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0KKwkJCQkJVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlBhY2thZ2UsIElTRmVhcmVkRXZlbnRzTGlicmFyeS5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2U0ZlYXJlZEV2ZW50c0xpYnJhcnkgPSAoSVNGZWFyZWRFdmVudHNMaWJyYXJ5KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdlNGZWFyZWRFdmVudHNMaWJyYXJ5OworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TTG9jYWxFdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNMb2NhbEV2ZW50LmphdmEKaW5kZXggZGZhNzgzNi4uOTFhMzIzNCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNMb2NhbEV2ZW50LmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNMb2NhbEV2ZW50LmphdmEKQEAgLTI1LDcxICsyNSw3MSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNMb2NhbEV2ZW50Ci0gICAgZXh0ZW5kcyBTTG9jYWxFdmVudAotICAgIGltcGxlbWVudHMgSU1TTG9jYWxFdmVudCB7CisJZXh0ZW5kcyBTTG9jYWxFdmVudAorCWltcGxlbWVudHMgSU1TTG9jYWxFdmVudCB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNU0xvY2FsRXZlbnQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TTG9jYWxFdmVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUHJvcGVydHkoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUHJvcGVydHkoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOwogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOworCQlVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQotICAgICAgICAgICAgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KKwkJCUdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU09yR2F0ZUxBbmFseXNpcy5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNPckdhdGVMQW5hbHlzaXMuamF2YQppbmRleCA1Mjk3NTM3Li5hMzdmMGY2IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU09yR2F0ZUxBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TT3JHYXRlTEFuYWx5c2lzLmphdmEKQEAgLTI1LDcxICsyNSw3MSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNPckdhdGVMQW5hbHlzaXMKLSAgICBleHRlbmRzIFNPckdhdGVMQW5hbHlzaXMKLSAgICBpbXBsZW1lbnRzIElNU09yR2F0ZUxBbmFseXNpcyB7CisJZXh0ZW5kcyBTT3JHYXRlTEFuYWx5c2lzCisJaW1wbGVtZW50cyBJTVNPckdhdGVMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNPckdhdGVMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TT3JHYXRlTEFuYWx5c2lzKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUHJvcGVydHkoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUHJvcGVydHkoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTQmxvY2tMQW5hbHlzaXMgYmFzaWNHZXRTQmxvY2tMQW5hbHlzaXMoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTTG9naWNhbEdhdGVMQW5hbHlzaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKGdldEJhc2VfUHJvcGVydHkoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOwogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOworCQlVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQotICAgICAgICAgICAgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KKwkJCUdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1BvcnRMQW5hbHlzaXMuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TUG9ydExBbmFseXNpcy5qYXZhCmluZGV4IGQ3YTMzMWUuLjQ2NDQ2ODIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TUG9ydExBbmFseXNpcy5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TUG9ydExBbmFseXNpcy5qYXZhCkBAIC0yOSw2NCArMjksNjQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIE1TUG9ydExBbmFseXNpcwotICAgIGV4dGVuZHMgU1BvcnRMQW5hbHlzaXMKLSAgICBpbXBsZW1lbnRzIElNU1BvcnRMQW5hbHlzaXMgeworCWV4dGVuZHMgU1BvcnRMQW5hbHlzaXMKKwlpbXBsZW1lbnRzIElNU1BvcnRMQW5hbHlzaXMgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNQb3J0TEFuYWx5c2lzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBNU1BvcnRMQW5hbHlzaXMoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qb3J0KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX1BvcnQoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9Qb3J0KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1BvcnQoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgewotICAgICAgICBQcm9wZXJ0eSB2QmFzZSA9IGdldEJhc2VfUG9ydCgpOwotICAgICAgICBJU0Jsb2NrTEFuYWx5c2lzIHZTQmxvY2tMQW5hbHlzaXMgPSBudWxsOwotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCB2T3duZXIgPSB2QmFzZS5nZXRPd25lcigpOwotICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odk93bmVyLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJUHJvcGVydHkgdkJhc2UgPSBnZXRCYXNlX1BvcnQoKTsKKwkJSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0gbnVsbDsKKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUVsZW1lbnQgdk93bmVyID0gdkJhc2UuZ2V0T3duZXIoKTsKKwkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7CisJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJdlNCbG9ja0xBbmFseXNpcyA9IChJU0Jsb2NrTEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJfQorCQl9CisJCXJldHVybiB2U0Jsb2NrTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQotICAgICAgICAgICAgR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoZ2V0QmFzZV9Qb3J0KCkpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiBnZXRTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCgpIHsKKwkJRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIuZ2V0U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoZ2V0QmFzZV9Qb3J0KCkpOwogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4gdlVTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdCA9Ci0gICAgICAgICAgICBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyX1NGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0KCksCi0gICAgICAgICAgICAgICAgdlNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0LnNpemUoKSwKLSAgICAgICAgICAgICAgICB2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QudG9BcnJheSgpKTsKKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SUFic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzPiB2VVNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0ID0KKwkJCW5ldyBVbm1vZGlmaWFibGVFTGlzdDxJQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXM+KAorCQkJCXRoaXMsCisJCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXJfU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3QoKSwKKwkJCQl2U0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Quc2l6ZSgpLAorCQkJCXZTRmFpbHVyZU1vZGVzTEFuYWx5c2lzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VVNGYWlsdXJlTW9kZXNMQW5hbHlzaXNMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVU0ZhaWx1cmVNb2Rlc0xBbmFseXNpc0xpc3Q7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNQcm9wYWdhdGlvbkxpbmsuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TUHJvcGFnYXRpb25MaW5rLmphdmEKaW5kZXggZGM3NjU3YS4uZDE4NTc0OSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNQcm9wYWdhdGlvbkxpbmsuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1Byb3BhZ2F0aW9uTGluay5qYXZhCkBAIC0zMywxMjQgKzMzLDEyNCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNQcm9wYWdhdGlvbkxpbmsKLSAgICBleHRlbmRzIFNQcm9wYWdhdGlvbkxpbmsKLSAgICBpbXBsZW1lbnRzIElNU1Byb3BhZ2F0aW9uTGluayB7CisJZXh0ZW5kcyBTUHJvcGFnYXRpb25MaW5rCisJaW1wbGVtZW50cyBJTVNQcm9wYWdhdGlvbkxpbmsgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNQcm9wYWdhdGlvbkxpbmsoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TUHJvcGFnYXRpb25MaW5rKCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfRGVwZW5kZW5jeSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9EZXBlbmRlbmN5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfRGVwZW5kZW5jeSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9EZXBlbmRlbmN5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0gbnVsbDsKLSAgICAgICAgRGVwZW5kZW5jeSB2QmFzZSA9IGdldEJhc2VfRGVwZW5kZW5jeSgpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJSVNCbG9ja0xBbmFseXNpcyB2U0Jsb2NrTEFuYWx5c2lzID0gbnVsbDsKKwkJRGVwZW5kZW5jeSB2QmFzZSA9IGdldEJhc2VfRGVwZW5kZW5jeSgpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOYW1lZEVsZW1lbnQgdkVsZW1lbnQgPSB2QmFzZS5nZXRDbGllbnRzKCkuZ2V0KDApOwotICAgICAgICAgICAgaWYgKHZFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudC5nZXRPd25lcigpLCBJU0Jsb2NrTEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTQmxvY2tMQW5hbHlzaXMgPSAoSVNCbG9ja0xBbmFseXNpcykgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTQmxvY2tMQW5hbHlzaXM7Ci0gICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJTmFtZWRFbGVtZW50IHZFbGVtZW50ID0gdkJhc2UuZ2V0Q2xpZW50cygpLmdldCgwKTsKKwkJCWlmICh2RWxlbWVudCAhPSBudWxsKSB7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0KKwkJCQkJVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkVsZW1lbnQuZ2V0T3duZXIoKSwgSVNCbG9ja0xBbmFseXNpcy5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2U0Jsb2NrTEFuYWx5c2lzID0gKElTQmxvY2tMQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB2U0Jsb2NrTEFuYWx5c2lzOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBiYXNpY0dldEVsZW1lbnRTb3VyY2UoKSB7Ci0gICAgICAgIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgdkVsZW1lbnRTb3VyY2UgPSBudWxsOwotICAgICAgICBEZXBlbmRlbmN5IHZCYXNlID0gZ2V0QmFzZV9EZXBlbmRlbmN5KCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IGJhc2ljR2V0RWxlbWVudFNvdXJjZSgpIHsKKwkJSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCB2RWxlbWVudFNvdXJjZSA9IG51bGw7CisJCURlcGVuZGVuY3kgdkJhc2UgPSBnZXRCYXNlX0RlcGVuZGVuY3koKTsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8TmFtZWRFbGVtZW50PiB2SXRlcmF0b3IgPSB2QmFzZS5nZXRDbGllbnRzKCkuaXRlcmF0b3IoKTsKKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gdkl0ZXJhdG9yID0gdkJhc2UuZ2V0Q2xpZW50cygpLml0ZXJhdG9yKCk7CiAKLSAgICAgICAgICAgIHdoaWxlICgodkVsZW1lbnRTb3VyY2UgPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE5hbWVkRWxlbWVudCB2RWxlbWVudCA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTUHJvcGFnYXRpb25FbGVtZW50KHZFbGVtZW50KTsKKwkJCXdoaWxlICgodkVsZW1lbnRTb3VyY2UgPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCU5hbWVkRWxlbWVudCB2RWxlbWVudCA9IHZJdGVyYXRvci5uZXh0KCk7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTUHJvcGFnYXRpb25FbGVtZW50KHZFbGVtZW50KTsKIAotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdkVsZW1lbnRTb3VyY2UgPSAoSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZFbGVtZW50U291cmNlOwotICAgIH0KKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZFbGVtZW50U291cmNlID0gKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB2RWxlbWVudFNvdXJjZTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgYmFzaWNHZXRFbGVtZW50VGFyZ2V0KCkgewotICAgICAgICBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50IHZFbGVtZW50VGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgRGVwZW5kZW5jeSB2QmFzZSA9IGdldEJhc2VfRGVwZW5kZW5jeSgpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudCBiYXNpY0dldEVsZW1lbnRUYXJnZXQoKSB7CisJCUlBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQgdkVsZW1lbnRUYXJnZXQgPSBudWxsOworCQlEZXBlbmRlbmN5IHZCYXNlID0gZ2V0QmFzZV9EZXBlbmRlbmN5KCk7CiAKLSAgICAgICAgaWYgKHZCYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gdkl0ZXJhdG9yID0gdkJhc2UuZ2V0U3VwcGxpZXJzKCkuaXRlcmF0b3IoKTsKKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gdkl0ZXJhdG9yID0gdkJhc2UuZ2V0U3VwcGxpZXJzKCkuaXRlcmF0b3IoKTsKIAotICAgICAgICAgICAgd2hpbGUgKCh2RWxlbWVudFRhcmdldCA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTmFtZWRFbGVtZW50IHZFbGVtZW50ID0gdkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNQcm9wYWdhdGlvbkVsZW1lbnQodkVsZW1lbnQpOworCQkJd2hpbGUgKCh2RWxlbWVudFRhcmdldCA9PSBudWxsKSAmJiB2SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJTmFtZWRFbGVtZW50IHZFbGVtZW50ID0gdkl0ZXJhdG9yLm5leHQoKTsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNQcm9wYWdhdGlvbkVsZW1lbnQodkVsZW1lbnQpOwogCi0gICAgICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2RWxlbWVudFRhcmdldCA9IChJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZFbGVtZW50VGFyZ2V0ID0gKElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQkJfQorCQkJfQogCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZFbGVtZW50VGFyZ2V0OwotICAgIH0KKwkJfQorCQlyZXR1cm4gdkVsZW1lbnRUYXJnZXQ7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBTdGVyZW90eXBlIEFwcGxpY2F0aW9uIG9mIFNQcm9wYWdhdGlvbkVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcEVsZW1lbnQgVGhlIFVNTCBFbGVtZW50Ci0gICAgICogQHJldHVybiBUaGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgRU9iamVjdCBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25PZlNQcm9wYWdhdGlvbkVsZW1lbnQoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgewotICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBMaXN0PGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudD4+IHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PigpOworCS8qKgorCSAqIEdldCB0aGUgU3RlcmVvdHlwZSBBcHBsaWNhdGlvbiBvZiBTUHJvcGFnYXRpb25FbGVtZW50LgorCSAqCisJICogQHBhcmFtIHBFbGVtZW50IFRoZSBVTUwgRWxlbWVudAorCSAqIEByZXR1cm4gVGhlIFN0ZXJlb3R5cGUgQXBwbGljYXRpb24KKwkgKi8KKwlwcml2YXRlIEVPYmplY3QgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uT2ZTUHJvcGFnYXRpb25FbGVtZW50KGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0gbnVsbDsKKwkJTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQ+PiB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0ID0KKwkJCW5ldyBBcnJheUxpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4oKTsKIAotICAgICAgICB2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNMT0dJQ0FMR0FURVNfTElTVCk7Ci0gICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVFVkVOVFNfTElTVCk7Ci0gICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuYWRkQWxsKEVTRkxvY2FsQW5hbHlzaXNTZXQuU0ZBSUxVUkVNT0RFU19MSVNUKTsKKwkJdlNQcm9wYWdhdGlvbkVsZW1lbnRzTGlzdC5hZGRBbGwoRVNGTG9jYWxBbmFseXNpc1NldC5TTE9HSUNBTEdBVEVTX0xJU1QpOworCQl2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFRVZFTlRTX0xJU1QpOworCQl2U1Byb3BhZ2F0aW9uRWxlbWVudHNMaXN0LmFkZEFsbChFU0ZMb2NhbEFuYWx5c2lzU2V0LlNGQUlMVVJFTU9ERVNfTElTVCk7CiAKLSAgICAgICAgSXRlcmF0b3I8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4gdkl0ZXJhdG9yID0KLSAgICAgICAgICAgIHZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsKKwkJSXRlcmF0b3I8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50Pj4gdkl0ZXJhdG9yID0KKwkJCXZTUHJvcGFnYXRpb25FbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsKIAotICAgICAgICB3aGlsZSAoKHZTdGVyZW90eXBlQXBwbGljYXRpb24gPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50PiB2U1Byb3BhZ2F0aW9uRWxlbWVudCA9IHZJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIHZTUHJvcGFnYXRpb25FbGVtZW50KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U1Byb3BhZ2F0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgfQorCQl3aGlsZSAoKHZTdGVyZW90eXBlQXBwbGljYXRpb24gPT0gbnVsbCkgJiYgdkl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50PiB2U1Byb3BhZ2F0aW9uRWxlbWVudCA9IHZJdGVyYXRvci5uZXh0KCk7CisJCQlpZiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIHZTUHJvcGFnYXRpb25FbGVtZW50KSAhPSBudWxsKSB7CisJCQkJdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCB2U1Byb3BhZ2F0aW9uRWxlbWVudCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNTeXN0ZW1FdmVudC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNTeXN0ZW1FdmVudC5qYXZhCmluZGV4IDNhMzZmYTkuLjZlY2FiZmYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TU3lzdGVtRXZlbnQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1N5c3RlbUV2ZW50LmphdmEKQEAgLTMxLDkzICszMSw5MyBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTVNTeXN0ZW1FdmVudAotICAgIGV4dGVuZHMgU1N5c3RlbUV2ZW50Ci0gICAgaW1wbGVtZW50cyBJTVNTeXN0ZW1FdmVudCB7CisJZXh0ZW5kcyBTU3lzdGVtRXZlbnQKKwlpbXBsZW1lbnRzIElNU1N5c3RlbUV2ZW50IHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TU3lzdGVtRXZlbnQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1TU3lzdGVtRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKGdldEJhc2VfUHJvcGVydHkoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXMuZ2V0U0Jsb2NrTEFuYWx5c2lzKGdldEJhc2VfUHJvcGVydHkoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU1N5c3RlbUV2ZW50VHlwZSBiYXNpY0dldFR5cGUoKSB7Ci0gICAgICAgIFByb3BlcnR5IHZCYXNlID0gZ2V0QmFzZV9Qcm9wZXJ0eSgpOwotICAgICAgICBJU1N5c3RlbUV2ZW50VHlwZSB2U3lzdGVtRXZlbnRUeXBlID0gbnVsbDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTU3lzdGVtRXZlbnRUeXBlIGJhc2ljR2V0VHlwZSgpIHsKKwkJUHJvcGVydHkgdkJhc2UgPSBnZXRCYXNlX1Byb3BlcnR5KCk7CisJCUlTU3lzdGVtRXZlbnRUeXBlIHZTeXN0ZW1FdmVudFR5cGUgPSBudWxsOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlIHZUeXBlID0gdkJhc2UuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYgKCh2VHlwZSAhPSBudWxsKSAmJiAodlR5cGUgaW5zdGFuY2VvZiBDbGFzcykpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbigoQ2xhc3MpIHZUeXBlLCBJU1N5c3RlbUV2ZW50VHlwZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2U3lzdGVtRXZlbnRUeXBlID0gKElTU3lzdGVtRXZlbnRUeXBlKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJVHlwZSB2VHlwZSA9IHZCYXNlLmdldFR5cGUoKTsKKwkJCWlmICgodlR5cGUgIT0gbnVsbCkgJiYgKHZUeXBlIGluc3RhbmNlb2YgQ2xhc3MpKSB7CisJCQkJRU9iamVjdCB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uID0KKwkJCQkJVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24oKENsYXNzKSB2VHlwZSwgSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MpOworCQkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJdlN5c3RlbUV2ZW50VHlwZSA9IChJU1N5c3RlbUV2ZW50VHlwZSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICByZXR1cm4gdlN5c3RlbUV2ZW50VHlwZTsKLSAgICB9CisJCXJldHVybiB2U3lzdGVtRXZlbnRUeXBlOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgewotICAgICAgICBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KLSAgICAgICAgICAgIEdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKKwkJRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9CisJCQlHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVSW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCi0gICAgICAgICAgICB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKKwkJCXRoaXMsCisJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVSW5TUHJvcGFnYXRpb25MaW5rc0xpc3Q7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCkgewotICAgICAgICBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKKwkJRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKIAotICAgICAgICBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPSBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+KAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnRfT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKKwkJCXRoaXMsCisJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CiAKLSAgICAgICAgcmV0dXJuIHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TU3lzdGVtRXZlbnRUeXBlLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1N5c3RlbUV2ZW50VHlwZS5qYXZhCmluZGV4IGI2MmY1MjEuLjdlNDZiMDQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TU3lzdGVtRXZlbnRUeXBlLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNTeXN0ZW1FdmVudFR5cGUuamF2YQpAQCAtMzUsOTEgKzM1LDkxIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBNU1N5c3RlbUV2ZW50VHlwZQotICAgIGV4dGVuZHMgU1N5c3RlbUV2ZW50VHlwZQotICAgIGltcGxlbWVudHMgSU1TU3lzdGVtRXZlbnRUeXBlIHsKKwlleHRlbmRzIFNTeXN0ZW1FdmVudFR5cGUKKwlpbXBsZW1lbnRzIElNU1N5c3RlbUV2ZW50VHlwZSB7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNU1N5c3RlbUV2ZW50VHlwZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgTVNTeXN0ZW1FdmVudFR5cGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9DbGFzcygpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9DbGFzcygpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX0NsYXNzKCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX0NsYXNzKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNTeXN0ZW1FdmVudD4gZ2V0SW5zdGFuY2VzTGlzdCgpIHsKLSAgICAgICAgQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7Ci0gICAgICAgIEVMaXN0PElTU3lzdGVtRXZlbnQ+IHZJbnN0YW5jZXNMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8SVNTeXN0ZW1FdmVudD4oKTsKLSAgICAgICAgSVNMb2NhbEFuYWx5c2lzIHZTTG9jYWxBbmFseXNpcyA9IG51bGw7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1N5c3RlbUV2ZW50PiBnZXRJbnN0YW5jZXNMaXN0KCkgeworCQlDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKKwkJRUxpc3Q8SVNTeXN0ZW1FdmVudD4gdkluc3RhbmNlc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU1N5c3RlbUV2ZW50PigpOworCQlJU0xvY2FsQW5hbHlzaXMgdlNMb2NhbEFuYWx5c2lzID0gbnVsbDsKIAotICAgICAgICBpZiAodkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCB2R3JhbmRPd25lciA9IHZCYXNlLmdldE93bmVyKCkuZ2V0T3duZXIoKTsKLSAgICAgICAgICAgIGlmICh2R3JhbmRPd25lciBpbnN0YW5jZW9mIFBhY2thZ2UpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2R3JhbmRPd25lciwgSVNMb2NhbEFuYWx5c2lzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZTTG9jYWxBbmFseXNpcyA9IChJU0xvY2FsQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCQlpZiAodkJhc2UgIT0gbnVsbCkgeworCQkJRWxlbWVudCB2R3JhbmRPd25lciA9IHZCYXNlLmdldE93bmVyKCkuZ2V0T3duZXIoKTsKKwkJCWlmICh2R3JhbmRPd25lciBpbnN0YW5jZW9mIFBhY2thZ2UpIHsKKwkJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2R3JhbmRPd25lciwgSVNMb2NhbEFuYWx5c2lzLmNsYXNzKTsKKwkJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCXZTTG9jYWxBbmFseXNpcyA9IChJU0xvY2FsQW5hbHlzaXMpIHZTdGVyZW90eXBlQXBwbGljYXRpb247CisJCQkJfQorCQkJfQogCi0gICAgICAgICAgICBpZiAodlNMb2NhbEFuYWx5c2lzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKElTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA6IHZTTG9jYWxBbmFseXNpcy5nZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyB2U0ZhaWx1cmVFdmVudCA6IHZTQmxvY2tMQW5hbHlzaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZTRmFpbHVyZUV2ZW50IGluc3RhbmNlb2YgSVNTeXN0ZW1FdmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTU3lzdGVtRXZlbnQgdlNTeXN0ZW1FdmVudCA9IChJU1N5c3RlbUV2ZW50KSB2U0ZhaWx1cmVFdmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1N5c3RlbUV2ZW50VHlwZSB2VHlwZSA9IHZTU3lzdGVtRXZlbnQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2VHlwZSAhPSBudWxsICYmIHZUeXBlLmVxdWFscyh0aGlzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2SW5zdGFuY2VzTGlzdC5hZGQodlNTeXN0ZW1FdmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQlpZiAodlNMb2NhbEFuYWx5c2lzICE9IG51bGwpIHsKKwkJCQlmb3IgKElTQmxvY2tMQW5hbHlzaXMgdlNCbG9ja0xBbmFseXNpcyA6IHZTTG9jYWxBbmFseXNpcy5nZXRTQmxvY2tzTEFuYWx5c2lzTGlzdCgpKSB7CisJCQkJCWZvciAoSUFic3RyYWN0U0ZhaWx1cmVFdmVudExBbmFseXNpcyB2U0ZhaWx1cmVFdmVudCA6IHZTQmxvY2tMQW5hbHlzaXMKKwkJCQkJCS5nZXRTRmFpbHVyZUV2ZW50c0xBbmFseXNpc0xpc3QoKSkgeworCQkJCQkJaWYgKHZTRmFpbHVyZUV2ZW50IGluc3RhbmNlb2YgSVNTeXN0ZW1FdmVudCkgeworCQkJCQkJCUlTU3lzdGVtRXZlbnQgdlNTeXN0ZW1FdmVudCA9IChJU1N5c3RlbUV2ZW50KSB2U0ZhaWx1cmVFdmVudDsKKwkJCQkJCQlJU1N5c3RlbUV2ZW50VHlwZSB2VHlwZSA9IHZTU3lzdGVtRXZlbnQuZ2V0VHlwZSgpOworCQkJCQkJCWlmICh2VHlwZSAhPSBudWxsICYmIHZUeXBlLmVxdWFscyh0aGlzKSkgeworCQkJCQkJCQl2SW5zdGFuY2VzTGlzdC5hZGQodlNTeXN0ZW1FdmVudCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNTeXN0ZW1FdmVudD4gdlVJbnN0YW5jZXNMaXN0ID0KLSAgICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1N5c3RlbUV2ZW50PigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX0luc3RhbmNlc0xpc3QoKSwKLSAgICAgICAgICAgICAgICB2SW5zdGFuY2VzTGlzdC5zaXplKCksCi0gICAgICAgICAgICAgICAgdkluc3RhbmNlc0xpc3QudG9BcnJheSgpKTsKKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SVNTeXN0ZW1FdmVudD4gdlVJbnN0YW5jZXNMaXN0ID0KKwkJCW5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1N5c3RlbUV2ZW50PigKKwkJCQl0aGlzLAorCQkJCUVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlX0luc3RhbmNlc0xpc3QoKSwKKwkJCQl2SW5zdGFuY2VzTGlzdC5zaXplKCksCisJCQkJdkluc3RhbmNlc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVJbnN0YW5jZXNMaXN0OwotICAgIH0KKwkJcmV0dXJuIHZVSW5zdGFuY2VzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTU3lzdGVtRXZlbnRzTGlicmFyeSBiYXNpY0dldFNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgewotICAgICAgICBDbGFzcyB2QmFzZSA9IGdldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHZTU3lzdGVtRXZlbnRzTGlicmFyeSA9IG51bGw7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU1N5c3RlbUV2ZW50c0xpYnJhcnkgYmFzaWNHZXRTU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKKwkJQ2xhc3MgdkJhc2UgPSBnZXRCYXNlX0NsYXNzKCk7CisJCUlTU3lzdGVtRXZlbnRzTGlicmFyeSB2U1N5c3RlbUV2ZW50c0xpYnJhcnkgPSBudWxsOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IHZPd25lciA9IHZCYXNlLmdldE93bmVyKCk7Ci0gICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2T3duZXIsIElTU3lzdGVtRXZlbnRzTGlicmFyeS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdlNTeXN0ZW1FdmVudHNMaWJyYXJ5ID0gKElTU3lzdGVtRXZlbnRzTGlicmFyeSkgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdlNTeXN0ZW1FdmVudHNMaWJyYXJ5OwotICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCUVsZW1lbnQgdk93bmVyID0gdkJhc2UuZ2V0T3duZXIoKTsKKwkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZPd25lciwgSVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmNsYXNzKTsKKwkJCWlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKKwkJCQl2U1N5c3RlbUV2ZW50c0xpYnJhcnkgPSAoSVNTeXN0ZW1FdmVudHNMaWJyYXJ5KSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJfQorCQl9CisJCXJldHVybiB2U1N5c3RlbUV2ZW50c0xpYnJhcnk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2Zsb2NhbGFuYWx5c2lzL2ltcGwvTVNTeXN0ZW1FdmVudHNMaWJyYXJ5LmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YQppbmRleCBiNzY1MGY2Li4wMjJlYjkxIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1N5c3RlbUV2ZW50c0xpYnJhcnkuamF2YQpAQCAtMzAsNzQgKzMwLDc0IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBNU1N5c3RlbUV2ZW50c0xpYnJhcnkKLSAgICBleHRlbmRzIFNTeXN0ZW1FdmVudHNMaWJyYXJ5Ci0gICAgaW1wbGVtZW50cyBJTVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHsKKwlleHRlbmRzIFNTeXN0ZW1FdmVudHNMaWJyYXJ5CisJaW1wbGVtZW50cyBJTVNTeXN0ZW1FdmVudHNMaWJyYXJ5IHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1TU3lzdGVtRXZlbnRzTGlicmFyeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgTVNTeXN0ZW1FdmVudHNMaWJyYXJ5KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXROYW1lKGdldEJhc2VfUGFja2FnZSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9QYWNrYWdlKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfUGFja2FnZSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldFVVSUQoZ2V0QmFzZV9QYWNrYWdlKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNTeXN0ZW1FdmVudFR5cGU+IGdldFNTeXN0ZW1FdmVudFR5cGVzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNTeXN0ZW1FdmVudFR5cGU+IHZTU3lzdGVtRXZlbnRUeXBlc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU1N5c3RlbUV2ZW50VHlwZT4oKTsKLSAgICAgICAgUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8SVNTeXN0ZW1FdmVudFR5cGU+IGdldFNTeXN0ZW1FdmVudFR5cGVzTGlzdCgpIHsKKwkJRUxpc3Q8SVNTeXN0ZW1FdmVudFR5cGU+IHZTU3lzdGVtRXZlbnRUeXBlc0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxJU1N5c3RlbUV2ZW50VHlwZT4oKTsKKwkJUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgdkVsZW1lbnQgOiB2QmFzZS5nZXRPd25lZEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2RWxlbWVudCwgSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh2U3RlcmVvdHlwZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdlNTeXN0ZW1FdmVudFR5cGVzTGlzdC5hZGQoKElTU3lzdGVtRXZlbnRUeXBlKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHZCYXNlICE9IG51bGwpIHsKKwkJCWZvciAoRWxlbWVudCB2RWxlbWVudCA6IHZCYXNlLmdldE93bmVkRWxlbWVudHMoKSkgeworCQkJCUVPYmplY3QgdlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiA9IFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZFbGVtZW50LCBJU1N5c3RlbUV2ZW50VHlwZS5jbGFzcyk7CisJCQkJaWYgKHZTdGVyZW90eXBlQXBwbGljYXRpb24gIT0gbnVsbCkgeworCQkJCQl2U1N5c3RlbUV2ZW50VHlwZXNMaXN0LmFkZCgoSVNTeXN0ZW1FdmVudFR5cGUpIHZTdGVyZW90eXBlQXBwbGljYXRpb24pOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTU3lzdGVtRXZlbnRUeXBlPiB2VVNTeXN0ZW1FdmVudFR5cGVzTGlzdCA9Ci0gICAgICAgICAgICBuZXcgVW5tb2RpZmlhYmxlRUxpc3Q8SVNTeXN0ZW1FdmVudFR5cGU+KAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudHNMaWJyYXJ5X1NTeXN0ZW1FdmVudFR5cGVzTGlzdCgpLAotICAgICAgICAgICAgICAgIHZTU3lzdGVtRXZlbnRUeXBlc0xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIHZTU3lzdGVtRXZlbnRUeXBlc0xpc3QudG9BcnJheSgpKTsKKwkJVW5tb2RpZmlhYmxlRUxpc3Q8SVNTeXN0ZW1FdmVudFR5cGU+IHZVU1N5c3RlbUV2ZW50VHlwZXNMaXN0ID0KKwkJCW5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1N5c3RlbUV2ZW50VHlwZT4oCisJCQkJdGhpcywKKwkJCQlFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1N5c3RlbUV2ZW50c0xpYnJhcnlfU1N5c3RlbUV2ZW50VHlwZXNMaXN0KCksCisJCQkJdlNTeXN0ZW1FdmVudFR5cGVzTGlzdC5zaXplKCksCisJCQkJdlNTeXN0ZW1FdmVudFR5cGVzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VVNTeXN0ZW1FdmVudFR5cGVzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VVNTeXN0ZW1FdmVudFR5cGVzTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTTG9jYWxBbmFseXNpcyBiYXNpY0dldFNMb2NhbEFuYWx5c2lzKCkgewotICAgICAgICBQYWNrYWdlIHZCYXNlID0gZ2V0QmFzZV9QYWNrYWdlKCk7Ci0gICAgICAgIElTTG9jYWxBbmFseXNpcyB2TG9jYWxBbmFseXNpcyA9IG51bGw7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0xvY2FsQW5hbHlzaXMgYmFzaWNHZXRTTG9jYWxBbmFseXNpcygpIHsKKwkJUGFja2FnZSB2QmFzZSA9IGdldEJhc2VfUGFja2FnZSgpOworCQlJU0xvY2FsQW5hbHlzaXMgdkxvY2FsQW5hbHlzaXMgPSBudWxsOwogCi0gICAgICAgIGlmICh2QmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IHZPd25lciA9IHZCYXNlLmdldE93bmVyKCk7Ci0gICAgICAgICAgICBFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2T3duZXIsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdkxvY2FsQW5hbHlzaXMgPSAoSVNMb2NhbEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2TG9jYWxBbmFseXNpczsKLSAgICB9CisJCWlmICh2QmFzZSAhPSBudWxsKSB7CisJCQlFbGVtZW50IHZPd25lciA9IHZCYXNlLmdldE93bmVyKCk7CisJCQlFT2JqZWN0IHZTdGVyZW90eXBlQXBwbGljYXRpb24gPSBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2T3duZXIsIElTTG9jYWxBbmFseXNpcy5jbGFzcyk7CisJCQlpZiAodlN0ZXJlb3R5cGVBcHBsaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJdkxvY2FsQW5hbHlzaXMgPSAoSVNMb2NhbEFuYWx5c2lzKSB2U3RlcmVvdHlwZUFwcGxpY2F0aW9uOworCQkJfQorCQl9CisJCXJldHVybiB2TG9jYWxBbmFseXNpczsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZmxvY2FsYW5hbHlzaXMvaW1wbC9NU1VudGltZWx5RmFpbHVyZU1vZGUuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCmluZGV4IGE1NjhjMjAuLmJmNTQ5NzcgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmbG9jYWxhbmFseXNpcy9pbXBsL01TVW50aW1lbHlGYWlsdXJlTW9kZS5qYXZhCkBAIC0yNiw3OSArMjYsNzkgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIE1TVW50aW1lbHlGYWlsdXJlTW9kZQotICAgIGV4dGVuZHMgU1VudGltZWx5RmFpbHVyZU1vZGUKLSAgICBpbXBsZW1lbnRzIElNU1VudGltZWx5RmFpbHVyZU1vZGUgeworCWV4dGVuZHMgU1VudGltZWx5RmFpbHVyZU1vZGUKKwlpbXBsZW1lbnRzIElNU1VudGltZWx5RmFpbHVyZU1vZGUgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNVbnRpbWVseUZhaWx1cmVNb2RlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBNU1VudGltZWx5RmFpbHVyZU1vZGUoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNFbGVtZW50LmdldE5hbWUoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVVUlEKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVVUlEKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0VVVJRChnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNCbG9ja0xBbmFseXNpcyBiYXNpY0dldFNCbG9ja0xBbmFseXNpcygpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRTQmxvY2tMQW5hbHlzaXMoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU0Jsb2NrTEFuYWx5c2lzIGJhc2ljR2V0U0Jsb2NrTEFuYWx5c2lzKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0ZhaWx1cmVNb2RlTEFuYWx5c2lzLmdldFNCbG9ja0xBbmFseXNpcyhnZXRCYXNlX1Byb3BlcnR5KCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFic3RyYWN0U0ZhaWx1cmVNb2RlT3duZXIgYmFzaWNHZXRPd25lcigpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWNBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcy5nZXRPd25lcihnZXRCYXNlX1Byb3BlcnR5KCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElBYnN0cmFjdFNGYWlsdXJlTW9kZU93bmVyIGJhc2ljR2V0T3duZXIoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRmFpbHVyZU1vZGVMQW5hbHlzaXMuZ2V0T3duZXIoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9Ci0gICAgICAgICAgICBHZW5lcmljQWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50LmdldEluU1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gZ2V0SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QgPQorCQkJR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRJblNQcm9wYWdhdGlvbkxpbmtzTGlzdChnZXRCYXNlX1Byb3BlcnR5KCkpOwogCi0gICAgICAgIFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdkluU1Byb3BhZ2F0aW9uTGlua3NMaXN0LnNpemUoKSwKLSAgICAgICAgICAgIHZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOworCQlVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZJblNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCisJCQl2SW5TUHJvcGFnYXRpb25MaW5rc0xpc3QudG9BcnJheSgpKTsKIAotICAgICAgICByZXR1cm4gdlVJblNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VUluU1Byb3BhZ2F0aW9uTGlua3NMaXN0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IGdldE91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpIHsKLSAgICAgICAgRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QgPQotICAgICAgICAgICAgR2VuZXJpY0Fic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudC5nZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoZ2V0QmFzZV9Qcm9wZXJ0eSgpKTsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiBnZXRPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSB7CisJCUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0KKwkJCUdlbmVyaWNBYnN0cmFjdFNQcm9wYWdhdGlvbkVsZW1lbnQuZ2V0T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0KGdldEJhc2VfUHJvcGVydHkoKSk7CiAKLSAgICAgICAgVW5tb2RpZmlhYmxlRUxpc3Q8SVNQcm9wYWdhdGlvbkxpbms+IHZVT3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0ID0gbmV3IFVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RTUHJvcGFnYXRpb25FbGVtZW50X091dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCgpLAotICAgICAgICAgICAgdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC5zaXplKCksCi0gICAgICAgICAgICB2T3V0U1Byb3BhZ2F0aW9uTGlua3NMaXN0LnRvQXJyYXkoKSk7CisJCVVubW9kaWZpYWJsZUVMaXN0PElTUHJvcGFnYXRpb25MaW5rPiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdCA9IG5ldyBVbm1vZGlmaWFibGVFTGlzdDxJU1Byb3BhZ2F0aW9uTGluaz4oCisJCQl0aGlzLAorCQkJRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0U1Byb3BhZ2F0aW9uRWxlbWVudF9PdXRTUHJvcGFnYXRpb25MaW5rc0xpc3QoKSwKKwkJCXZPdXRTUHJvcGFnYXRpb25MaW5rc0xpc3Quc2l6ZSgpLAorCQkJdk91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdC50b0FycmF5KCkpOwogCi0gICAgICAgIHJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKLSAgICB9CisJCXJldHVybiB2VU91dFNQcm9wYWdhdGlvbkxpbmtzTGlzdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9FU0ZMb2NhbEFuYWx5c2lzUG9yZmlsZUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvRVNGTG9jYWxBbmFseXNpc1BvcmZpbGVBY3RpdmF0b3IuamF2YQppbmRleCA0YjI5Zjc2Li4zMWUyYjQ3IDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9FU0ZMb2NhbEFuYWx5c2lzUG9yZmlsZUFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL0VTRkxvY2FsQW5hbHlzaXNQb3JmaWxlQWN0aXZhdG9yLmphdmEKQEAgLTIzLDg1ICsyMyw4NSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxODMgJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGTG9jYWxBbmFseXNpc1BvcmZpbGVBY3RpdmF0b3IKLSAgICBleHRlbmRzIEVNRlBsdWdpbgotICAgIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKKwlleHRlbmRzIEVNRlBsdWdpbgorCWltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkxvY2FsQW5hbHlzaXNQb3JmaWxlQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNQb3JmaWxlQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc1BvcmZpbGVBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGTG9jYWxBbmFseXNpc1BvcmZpbGVBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZMb2NhbEFuYWx5c2lzUG9yZmlsZUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1BvcmZpbGVBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IEJ1bmRsZXhDb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBCdW5kbGVDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKIAotICAgICAgICAvLyBNYW51YWxseSBjcmVhdGUgdGhlIHBsdWdpbiBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzUGx1Z2luID0gbmV3IEltcGxlbWVudGF0aW9uKCk7Ci0gICAgfQorCQkvLyBNYW51YWxseSBjcmVhdGUgdGhlIHBsdWdpbiBpbXBsZW1lbnRhdGlvbgorCQlzUGx1Z2luID0gbmV3IEltcGxlbWVudGF0aW9uKCk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBudWxsOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0gICAgfQorCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXQvRVNGTG9jYWxBbmFseXNpc1NldC5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvc2V0L0VTRkxvY2FsQW5hbHlzaXNTZXQuamF2YQppbmRleCA0ZTdiODYxLi5kYjI4NWYyIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9zZXQvRVNGTG9jYWxBbmFseXNpc1NldC5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9wcm9maWxlL3NldC9FU0ZMb2NhbEFuYWx5c2lzU2V0LmphdmEKQEAgLTM0LDM0ICszNCwzNCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGTG9jYWxBbmFseXNpc1NldCB7Ci0gICAgLyoqIEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZSBwYXRoLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfUEFUSCA9Ci0gICAgICAgICJwYXRobWFwOi8vRVNGTE9DQUxBTkFMWVNJU19QUk9GSUxFL2VzZmxvY2FsYW5hbHlzaXMucHJvZmlsZS51bWwiOyAvLyROT04tTkxTLTEkCisJLyoqIEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZSBwYXRoLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfUEFUSCA9CisJCSJwYXRobWFwOi8vRVNGTE9DQUxBTkFMWVNJU19QUk9GSUxFL2VzZmxvY2FsYW5hbHlzaXMucHJvZmlsZS51bWwiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlIFVSSS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX1VSSSA9Ci0gICAgICAgICJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGTG9jYWxBbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKKwkvKiogRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlIFVSSS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX1VSSSA9CisJCSJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGTG9jYWxBbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBMaXN0IG9mIExvZ2ljYWwgR2F0ZXMgZGVmaW5lZCBieSBFU0ZMb2NhbEFuYWx5c2lzIHByb2ZpbGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgSUFic3RyYWN0U0xvZ2ljYWxHYXRlTEFuYWx5c2lzPj4gU0xPR0lDQUxHQVRFU19MSVNUID0KLSAgICAgICAgQXJyYXlzLmFzTGlzdChJU09yR2F0ZUxBbmFseXNpcy5jbGFzcywgSVNBbmRHYXRlTEFuYWx5c2lzLmNsYXNzKTsKKwkvKiogTGlzdCBvZiBMb2dpY2FsIEdhdGVzIGRlZmluZWQgYnkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNMb2dpY2FsR2F0ZUxBbmFseXNpcz4+IFNMT0dJQ0FMR0FURVNfTElTVCA9CisJCUFycmF5cy5hc0xpc3QoSVNPckdhdGVMQW5hbHlzaXMuY2xhc3MsIElTQW5kR2F0ZUxBbmFseXNpcy5jbGFzcyk7CiAKLSAgICAvKiogTGlzdCBvZiBGYWlsdXJlIE1vZGVzIGRlZmluZWQgYnkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IFNGQUlMVVJFTU9ERVNfTElTVCA9Ci0gICAgICAgIEFycmF5cy5hc0xpc3QoSVNBYnNlbnRGYWlsdXJlTW9kZS5jbGFzcywgSVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5jbGFzcywgSVNVbnRpbWVseUZhaWx1cmVNb2RlLmNsYXNzKTsKKwkvKiogTGlzdCBvZiBGYWlsdXJlIE1vZGVzIGRlZmluZWQgYnkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlTW9kZUxBbmFseXNpcz4+IFNGQUlMVVJFTU9ERVNfTElTVCA9CisJCUFycmF5cy5hc0xpc3QoSVNBYnNlbnRGYWlsdXJlTW9kZS5jbGFzcywgSVNFcnJvbmVvdXNGYWlsdXJlTW9kZS5jbGFzcywgSVNVbnRpbWVseUZhaWx1cmVNb2RlLmNsYXNzKTsKIAotICAgIC8qKiBMaXN0IG9mIEZhaWx1cmUgRXZlbnRzIGRlZmluZWQgYnkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+PiBTRkFJTFVSRUVWRU5UU19MSVNUID0KLSAgICAgICAgQXJyYXlzLmFzTGlzdChJU0xvY2FsRXZlbnQuY2xhc3MsIElTU3lzdGVtRXZlbnQuY2xhc3MpOworCS8qKiBMaXN0IG9mIEZhaWx1cmUgRXZlbnRzIGRlZmluZWQgYnkgRVNGTG9jYWxBbmFseXNpcyBwcm9maWxlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIElBYnN0cmFjdFNGYWlsdXJlRXZlbnRMQW5hbHlzaXM+PiBTRkFJTFVSRUVWRU5UU19MSVNUID0KKwkJQXJyYXlzLmFzTGlzdChJU0xvY2FsRXZlbnQuY2xhc3MsIElTU3lzdGVtRXZlbnQuY2xhc3MpOwogCi0gICAgLyoqIExpc3Qgb2YgRmFpbHVyZSBNb2RlcyBPd25lciBkZWZpbmVkIGJ5IEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcj4+IFNGQUlMVVJFTU9ERVNPV05FUl9MSVNUID0KLSAgICAgICAgQXJyYXlzLmFzTGlzdChJU1BvcnRMQW5hbHlzaXMuY2xhc3MsIElTQmFycmllckxBbmFseXNpcy5jbGFzcyk7CisJLyoqIExpc3Qgb2YgRmFpbHVyZSBNb2RlcyBPd25lciBkZWZpbmVkIGJ5IEVTRkxvY2FsQW5hbHlzaXMgcHJvZmlsZS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBJQWJzdHJhY3RTRmFpbHVyZU1vZGVPd25lcj4+IFNGQUlMVVJFTU9ERVNPV05FUl9MSVNUID0KKwkJQXJyYXlzLmFzTGlzdChJU1BvcnRMQW5hbHlzaXMuY2xhc3MsIElTQmFycmllckxBbmFseXNpcy5jbGFzcyk7CiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGTG9jYWxBbmFseXNpc1NldCgpIHsKLSAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgRVNGTG9jYWxBbmFseXNpc1NldCgpIHsKKwkgLy8gTm90aGluZyB0byBkbworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZWxlbmcvYnVpbGQucHJvcGVydGllcyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZWxlbmcvYnVpbGQucHJvcGVydGllcwppbmRleCA5NGJiODgzLi4zZDQ1YjRmIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucmVsZW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlbGVuZy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xLDQgKzEsNCBAQAogYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAogICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKICAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKKyAgICAgICAgICAgICAgIGVwbC12MjAuaHRtbApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlbGVuZy9mZWF0dXJlLnByb3BlcnRpZXMgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCA4YWJiNTVjLi4yZDMzMmFlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMSwxNiArMSwxNyBAQAotZmVhdHVyZU5hbWUgPSBFU0YgTG9jYWwgQW5hbHlzaXMgKEluY3ViYXRpb24pCitmZWF0dXJlTmFtZSA9IEVTRiBDb3JlIChNYW5kYXRvcnkpIChJbmN1YmF0aW9uKQogcHJvdmlkZXJOYW1lID0gUG9sYXJTeXMKLWRlc2NyaXB0aW9uID0gTG9jYWwgQW5hbHlzaXMgZmVhdHVyZSBvZiBFU0YuIChJbmN1YmF0aW9uKQorZGVzY3JpcHRpb24gPSBUZWNobmljYWwgQ29yZSBmZWF0dXJlIG9mIEVTRiAoTWFuZGF0b3J5KS4gKEluY3ViYXRpb24pCiBjb3B5cmlnaHQ9XAogQ29weXJpZ2h0IChjKSAyMDE2IEFMTDRURUMgJiBDRUEgTElTVC5cblwKIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wXG5cCiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK2h0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG5cCiBcblwKIENvbnRyaWJ1dG9yczpcblwKICAgICBKb25hdGhhbiBEdW1vbnQgKEFMTDRURUMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCisgICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuXAorCUFuc2dhciBSYWRlcm1hY2hlciAoQ0VBIExJU1QpIC0gdXBncmFkZSB0byAyMDE4LTEyIGFuZCBpbXByb3ZlbWVudHNcbgogbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKIGxpY2Vuc2U9XAogRWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKQEAgLTI5LDggKzMwLDggQEAKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wXG5cCi0oIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMFxuXAorKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKIENvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlNcblwKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZWxlbmcvbGljZW5zZS5odG1sIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlbGVuZy9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uNjM3YTE4MSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlbGVuZy9saWNlbnNlLmh0bWwKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlbGVuZy9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDMwMCBAQAogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIDx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAyLjA8L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsKKyAgICAgICAgbWFyZ2luOiAxLjVlbSAzZW07CisgICAgICB9CisgICAgICBoMXsKKyAgICAgICAgZm9udC1zaXplOjEuNWVtOworICAgICAgfQorICAgICAgaDJ7CisgICAgICAgIGZvbnQtc2l6ZToxZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206MC41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MWVtOworICAgICAgfQorICAgICAgcCB7CisgICAgICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgICB9CisgICAgICB1bCwgb2x7CisgICAgICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDIuMDwvaDE+CisgICAgPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICAgIFBVQkxJQyBMSUNFTlNFICgmbGRxdW87QUdSRUVNRU5UJnJkcXVvOykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICAgIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCYjMDM5O1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkZWZpbml0aW9ucyI+MS4gREVGSU5JVElPTlM8L2gyPgorICAgIDxwPiZsZHF1bztDb250cmlidXRpb24mcmRxdW87IG1lYW5zOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvbnRlbnQKKyAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgICAgICAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICAgICAgICZsZHF1bztvcmlnaW5hdGVzJnJkcXVvOyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvciYjMDM5O3MgYmVoYWxmLgorICAgICAgICBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGNoYW5nZXMgb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHRoYXQKKyAgICAgICAgYXJlIG5vdCBNb2RpZmllZCBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0b3ImcmRxdW87IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9wPgorICAgIDxwPiZsZHF1bztMaWNlbnNlZCBQYXRlbnRzJnJkcXVvOyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCisgICAgICBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCisgICAgICBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztQcm9ncmFtJnJkcXVvOyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBEaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworICAgICAgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UmVjaXBpZW50JnJkcXVvOyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICBvciBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UgKGFzIGFwcGxpY2FibGUpLCBpbmNsdWRpbmcgQ29udHJpYnV0b3JzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGVyaXZhdGl2ZSBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgUHJvZ3JhbSBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztNb2RpZmllZCBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yayBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtIHRoYXQKKyAgICAgIHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZQorICAgICAgY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCisgICAgICBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgY29udGFpbnMgYW55IGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLiBNb2RpZmllZAorICAgICAgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCBjb250YWluIG9ubHkgZGVjbGFyYXRpb25zLCBpbnRlcmZhY2VzLAorICAgICAgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseSBpbiBlYWNoIGNhc2UKKyAgICAgIGluIG9yZGVyIHRvIGxpbmsgdG8sIGJpbmQgYnkgbmFtZSwgb3Igc3ViY2xhc3MgdGhlIFByb2dyYW0gb3IgTW9kaWZpZWQKKyAgICAgIFdvcmtzIHRoZXJlb2YuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEaXN0cmlidXRlJnJkcXVvOyBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQorICAgICAgaW4gYW55IG1hbm5lciB0aGF0IGVuYWJsZXMgdGhlIHRyYW5zZmVyIG9mIGEgY29weS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NvdXJjZSBDb2RlJnJkcXVvOyBtZWFucyB0aGUgZm9ybSBvZiBhIFByb2dyYW0gcHJlZmVycmVkIGZvciBtYWtpbmcKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCisgICAgICBkb2N1bWVudGF0aW9uIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTZWNvbmRhcnkgTGljZW5zZSZyZHF1bzsgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICAgIFZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CisgICAgICBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXMgaWRlbnRpZmllZCBieSB0aGUgaW5pdGlhbAorICAgICAgQ29udHJpYnV0b3IuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ3JhbnQtb2YtcmlnaHRzIj4yLiBHUkFOVCBPRiBSSUdIVFM8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAorICAgICAgICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgICBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICAgICAgICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICAgICAgICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgICAgICAgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICAgICAgICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsCisgICAgICAgIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCisgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorICAgICAgICBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkKKyAgICAgICAgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyCisgICAgICAgIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCisgICAgICAgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgICAgICAgIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorICAgICAgICBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LgorICAgICAgICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgICAgICAgIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCisgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cworICAgICAgICBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwKKyAgICAgICAgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0bworICAgICAgICBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50JiMwMzk7cworICAgICAgICByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50CisgICAgICAgIGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorICAgICAgPC9saT4KKyAgICAgIDxsaT5lKSBOb3R3aXRoc3RhbmRpbmcgdGhlIHRlcm1zIG9mIGFueSBTZWNvbmRhcnkgTGljZW5zZSwgbm8gQ29udHJpYnV0b3IKKyAgICAgICAgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbiB0aG9zZSBzZXQgZm9ydGgKKyAgICAgICAgaW4gdGhpcyBBZ3JlZW1lbnQpIGFzIGEgcmVzdWx0IG9mIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByZWNlaXB0IG9mIHRoZQorICAgICAgICBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlIChpZiBwZXJtaXR0ZWQgdW5kZXIKKyAgICAgICAgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMykuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPjMuIFJFUVVJUkVNRU5UUzwvaDI+CisgICAgPHA+My4xIElmIGEgQ29udHJpYnV0b3IgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0gaW4gYW55IGZvcm0sIHRoZW46PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSB0aGUgUHJvZ3JhbSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMgU291cmNlIENvZGUsIGluCisgICAgICAgIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDMuMiwgYW5kIHRoZSBDb250cmlidXRvciBtdXN0IGFjY29tcGFueQorICAgICAgICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICAgICAgICBpcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZCBpbmZvcm1zIFJlY2lwaWVudHMgaG93IHRvCisgICAgICAgIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICAgICAgICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsCisgICAgICAgICAgICBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paWkpIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMmIzAzOTsgcmlnaHRzIGluIHRoZQorICAgICAgICAgICAgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPml2KSByZXF1aXJlcyBhbnkgc3Vic2VxdWVudCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYW55IHBhcnR5CisgICAgICAgICAgICB0byBiZSB1bmRlciBhIGxpY2Vuc2UgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIHNlY3Rpb24gMy4KKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgb3IgaWYgdGhlIFByb2dyYW0gKGkpCisgICAgICAgIGlzIGNvbWJpbmVkIHdpdGggb3RoZXIgbWF0ZXJpYWwgaW4gYSBzZXBhcmF0ZSBmaWxlIG9yIGZpbGVzIG1hZGUgYXZhaWxhYmxlCisgICAgICAgIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGF0dGFjaGVkIHRvCisgICAgICAgIHRoZSBTb3VyY2UgQ29kZSB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiBFeGhpYml0IEEgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICAgIHRoZW4gdGhlIFByb2dyYW0gbWF5IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoCisgICAgICAgIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLAorICAgICAgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eQorICAgICAgKCZsc3F1bztub3RpY2VzJnJzcXVvOykgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mIHRoZSBQcm9ncmFtIHdoaWNoCisgICAgICB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQgdGhlaXIgb3duIGFwcHJvcHJpYXRlCisgICAgICBub3RpY2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImNvbW1lcmNpYWwtZGlzdHJpYnV0aW9uIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvaDI+CisgICAgPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKKyAgICAgIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcworICAgICAgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCisgICAgICBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkCisgICAgICBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIKKyAgICAgIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEKKyAgICAgIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJmxkcXVvO0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcmRxdW87KQorICAgICAgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgorICAgICAgKCZsZHF1bztJbmRlbW5pZmllZCBDb250cmlidXRvciZyZHF1bzspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKKyAgICAgIChjb2xsZWN0aXZlbHkgJmxkcXVvO0xvc3NlcyZyZHF1bzspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCisgICAgICBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudAorICAgICAgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbgorICAgICAgd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLgorICAgICAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcKKyAgICAgIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0bworICAgICAgcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorICAgICAgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLAorICAgICAgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQKKyAgICAgIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisgICAgPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0KKyAgICAgIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorICAgICAgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zCisgICAgICBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJiMwMzk7cyByZXNwb25zaWJpbGl0eSBhbG9uZS4KKyAgICAgIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zCisgICAgICBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCisgICAgICB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzCisgICAgICBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJ3YXJyYW50eSI+NS4gTk8gV0FSUkFOVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmbGRxdW87QVMgSVMmcmRxdW87IEJBU0lTLCBXSVRIT1VUCisgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorICAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlCisgICAgICByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZQorICAgICAgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgorICAgICAgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGlzY2xhaW1lciI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWQorICAgICAgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCisgICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAgICAgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCisgICAgICBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ2VuZXJhbCI+Ny4gR0VORVJBTDwvaDI+CisgICAgPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKKyAgICAgIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUKKyAgICAgIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZQorICAgICAgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudAorICAgICAgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorICAgIDwvcD4KKyAgICA8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgorICAgICAgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKKyAgICAgIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByaWdodHMgZ3JhbnRlZAorICAgICAgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgICAgPC9wPgorICAgIDxwPkFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KKyAgICAgIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQKKyAgICAgIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZworICAgICAgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQorICAgICAgYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQmIzAzOTtzIG9ibGlnYXRpb25zIHVuZGVyCisgICAgICB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZQorICAgICAgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKyAgICA8L3A+CisgICAgPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5CisgICAgICBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMKKyAgICAgIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodAorICAgICAgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudAorICAgICAgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcworICAgICAgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mCisgICAgICB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyAgICAgIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uCisgICAgICBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3CisgICAgICB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZQorICAgICAgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorICAgIDwvcD4KKyAgICA8cD5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKKyAgICAgIHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorICAgICAgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKKyAgICAgIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKKyAgICAgIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAorICAgICAgdG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KKyAgICAgIE5vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJleGhpYml0LWEiPkV4aGliaXQgQSAmbmRhc2g7IEZvcm0gb2YgU2Vjb25kYXJ5IExpY2Vuc2VzIE5vdGljZTwvaDI+CisgICAgPHA+JmxkcXVvO1RoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyAKKyAgICAJU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCAKKyAgICAJaW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAorICAgIAl2ZXJzaW9uKHMpLCBhbmQgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGhlcmV9LiZyZHF1bzsKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5TaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgICAgICAgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIHVuZGVyIFNlY29uZGFyeSBMaWNlbnNlcy4KKyAgICAgIDwvcD4KKyAgICAgIDxwPklmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIGZpbGUsCisgICAgICAgIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UgZmlsZSBpbiBhCisgICAgICAgIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yCisgICAgICAgIHN1Y2ggYSBub3RpY2UuCisgICAgICA8L3A+CisgICAgICA8cD5Zb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC48L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlc291cmNlcy5ncmFwaGljYWwvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZXNvdXJjZXMuZ3JhcGhpY2FsL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlc291cmNlcy5ncmFwaGljYWwvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucmVzb3VyY2VzLmdyYXBoaWNhbC9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMucmVzb3VyY2VzLmdyYXBoaWNhbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy9yZXNvdXJjZXMvZ3JhcGhpY2FsL0VTRkxvY2FsQW5hbHlzaXNSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCmluZGV4IDkxNWQxOGIuLmVkNGY3N2UgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCkBAIC0yMywxMDEgKzIzLDEwMSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwlleHRlbmRzIEVNRlBsdWdpbiB7CiAKLSAgICAvKiogVGhlIHBsdWctaW4gSUQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy5yZXNvdXJjZXMuZ3JhcGhpY2FsIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBUaGUgcGx1Zy1pbiBJRC4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnJlc291cmNlcy5ncmFwaGljYWwiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGlzIHNpbmdsZXRvbiBhY3RpdmF0b3IuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvciBJTlNUQU5DRSA9Ci0gICAgICAgIG5ldyBFU0ZMb2NhbEFuYWx5c2lzUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhpcyBzaW5nbGV0b24gYWN0aXZhdG9yLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTRkxvY2FsQW5hbHlzaXNSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IgSU5TVEFOQ0UgPQorCQluZXcgRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcigpOwogCi0gICAgLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1Jlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIEVTRkxvY2FsQW5hbHlzaXNSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBXYXJuaW5nIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIFdhcm5pbmcgc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhIFdhcm5pbmcgc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgV2FybmluZyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCisJICoKKwkgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCisJICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnRhYmxlL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnRhYmxlL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvdGFibGUvRVNGTG9jYWxBbmFseXNpc1RhYmxlQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS9FU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuamF2YQppbmRleCBmYjE4NWUzLi4wNWFhODFjIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS9FU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS9FU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuamF2YQpAQCAtMjUsMTM0ICsyNSwxMzQgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNUYWJsZUFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luCi0gICAgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCWV4dGVuZHMgRU1GUGx1Z2luCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIFRoZSBwbHVnLWluIElELiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUiOyAvLyROT04tTkxTLTEkCisJLyoqIFRoZSBwbHVnLWluIElELiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogVGhlIFRhYmxlIFR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVFlQRSA9ICJTU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKiBUaGUgVGFibGUgVHlwZS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9UWVBFID0gIlNTeXN0ZW1FdmVudHNMaWJyYXJ5VGFibGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGTG9jYWxBbmFseXNpc1RhYmxlQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc1RhYmxlQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNUYWJsZUFjdGl2YXRvcigpOwogCi0gICAgLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOworCS8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KKwlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEVTRkxvY2FsQW5hbHlzaXNUYWJsZUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGTG9jYWxBbmFseXNpc1RhYmxlQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBCdW5kbGV4Q29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CiAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBwbHVnaW4gaW1wbGVtZW50YXRpb24gbWFudWFsbHkKLSAgICAgICAgc1BsdWdpbiA9IG5ldyBJbXBsZW1lbnRhdGlvbigpOwotICAgIH0KKwkJLy8gQ3JlYXRlIHRoZSBwbHVnaW4gaW1wbGVtZW50YXRpb24gbWFudWFsbHkKKwkJc1BsdWdpbiA9IG5ldyBJbXBsZW1lbnRhdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXJyb3Igc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEVycm9yIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLldBUk5JTkcsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYSBXYXJuaW5nIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIFdhcm5pbmcgc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS9tYW5hZ2VyL2F4aXMvU1N5c3RlbUV2ZW50c0xpYnJhcnlBeGlzTWFuYWdlci5qYXZhIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvdGFibGUvbWFuYWdlci9heGlzL1NTeXN0ZW1FdmVudHNMaWJyYXJ5QXhpc01hbmFnZXIuamF2YQppbmRleCA0MTlkMTgzLi4wNDEwZGVjIDEwMDY0NAotLS0gYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS9tYW5hZ2VyL2F4aXMvU1N5c3RlbUV2ZW50c0xpYnJhcnlBeGlzTWFuYWdlci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3RhYmxlL21hbmFnZXIvYXhpcy9TU3lzdGVtRXZlbnRzTGlicmFyeUF4aXNNYW5hZ2VyLmphdmEKQEAgLTI4LDY5ICsyOCw2OSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgU1N5c3RlbUV2ZW50c0xpYnJhcnlBeGlzTWFuYWdlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RTdGVyZW90eXBlZEVsZW1lbnRVTUxTeW5jaHJvbml6ZWRPbkZlYXR1cmVBeGlzTWFuYWdlcjxJU1N5c3RlbUV2ZW50VHlwZT4geworCWV4dGVuZHMgQWJzdHJhY3RTdGVyZW90eXBlZEVsZW1lbnRVTUxTeW5jaHJvbml6ZWRPbkZlYXR1cmVBeGlzTWFuYWdlcjxJU1N5c3RlbUV2ZW50VHlwZT4gewogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTU3lzdGVtRXZlbnRzTGlicmFyeUF4aXNNYW5hZ2VyKCkgewotICAgIH0KKwkvKioKKwkgKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFNTeXN0ZW1FdmVudHNMaWJyYXJ5QXhpc01hbmFnZXIoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlQXhpc0VsZW1lbnQoZmluYWwgU3RyaW5nIHBFbGVtZW50SWQpIHsKLSAgICAgICAgSVNwZWNpYWxpemF0aW9uVHlwZSB2VHlwZSA9IChJU3BlY2lhbGl6YXRpb25UeXBlKSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgIC5nZXRUeXBlKEVTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5TU1lTVEVNRVZFTlRUWVBFX1RZUEVfSUQpOwotICAgICAgICByZXR1cm4gdlR5cGUuZ2V0SWQoKS5lcXVhbHMocEVsZW1lbnRJZCk7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZUF4aXNFbGVtZW50KGZpbmFsIFN0cmluZyBwRWxlbWVudElkKSB7CisJCUlTcGVjaWFsaXphdGlvblR5cGUgdlR5cGUgPSAoSVNwZWNpYWxpemF0aW9uVHlwZSkgRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCisJCQkuZ2V0VHlwZShFU0ZMb2NhbEFuYWx5c2lzVHlwZXNTZXQuU1NZU1RFTUVWRU5UVFlQRV9UWVBFX0lEKTsKKwkJcmV0dXJuIHZUeXBlLmdldElkKCkuZXF1YWxzKHBFbGVtZW50SWQpOworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldFN0ZXJlb3R5cGVCYXNlRWxlbWVudChmaW5hbCBJU1N5c3RlbUV2ZW50VHlwZSBwU3RlcmVvdHlwZUFwcGxpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBwU3RlcmVvdHlwZUFwcGxpY2F0aW9uLmdldEJhc2VfQ2xhc3MoKTsKLSAgICB9CisJLyoqCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVsZW1lbnQgZ2V0U3RlcmVvdHlwZUJhc2VFbGVtZW50KGZpbmFsIElTU3lzdGVtRXZlbnRUeXBlIHBTdGVyZW90eXBlQXBwbGljYXRpb24pIHsKKwkJcmV0dXJuIHBTdGVyZW90eXBlQXBwbGljYXRpb24uZ2V0QmFzZV9DbGFzcygpOworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5zdGFuY2VPZlJlcXVpcmVkU3RlcmVvdHlwZUFwcGxpY2F0aW9uKGZpbmFsIE9iamVjdCBwT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBwT2JqZWN0IGluc3RhbmNlb2YgSVNTeXN0ZW1FdmVudFR5cGU7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzSW5zdGFuY2VPZlJlcXVpcmVkU3RlcmVvdHlwZUFwcGxpY2F0aW9uKGZpbmFsIE9iamVjdCBwT2JqZWN0KSB7CisJCXJldHVybiBwT2JqZWN0IGluc3RhbmNlb2YgSVNTeXN0ZW1FdmVudFR5cGU7CisJfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbGxvd2VkQXNCYXNlRWxlbWVudChmaW5hbCBFbGVtZW50IHBFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBwRWxlbWVudCBpbnN0YW5jZW9mIENsYXNzOwotICAgIH0KKwkvKioKKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FsbG93ZWRBc0Jhc2VFbGVtZW50KGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJcmV0dXJuIHBFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElTU3lzdGVtRXZlbnRUeXBlIGdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihmaW5hbCBFbGVtZW50IHBFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihwRWxlbWVudCwgSVNTeXN0ZW1FdmVudFR5cGUuY2xhc3MpOwotICAgIH0KKwkvKioKKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSVNTeXN0ZW1FdmVudFR5cGUgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKKwkJcmV0dXJuIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHBFbGVtZW50LCBJU1N5c3RlbUV2ZW50VHlwZS5jbGFzcyk7CisJfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25CYXNlUHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gRVNGTG9jYWxBbmFseXNpc1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTeXN0ZW1FdmVudFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uQmFzZVByb3BlcnR5TmFtZSgpIHsKKwkJcmV0dXJuIEVTRkxvY2FsQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRTU3lzdGVtRXZlbnRUeXBlKCkuZ2V0TmFtZSgpOworCX0KIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvdGFibGUvc2V0L0VTRkxvY2FsQW5hbHlzaXNUYWJsZXNTZXQuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3RhYmxlL3NldC9FU0ZMb2NhbEFuYWx5c2lzVGFibGVzU2V0LmphdmEKaW5kZXggNDc3MjI5Mi4uM2NkY2E2YSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvdGFibGUvc2V0L0VTRkxvY2FsQW5hbHlzaXNUYWJsZXNTZXQuamF2YQorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS9zZXQvRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldC5qYXZhCkBAIC0xOCwyOCArMTgsMjggQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNUYWJsZXNTZXQgewogCi0gICAgLyoqCi0gICAgICogU1N5c3RlbUV2ZW50c2xpYnJhcnkgVGFibGUgSUQuCi0gICAgICogTk9URTogVGhlIElEIG11c3QgYmUgdGhlIHNhbWUgaW46Ci0gICAgICogIC0gc1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZS5jb25maWd1cmF0aW9uCi0gICAgICogIC0gc1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZS5uYXR0YWJsZWNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU1lTVEVNRVZFTlRTTElCUkFSWV9UQUJMRV9JRCA9Ci0gICAgICAgICJTU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFNTeXN0ZW1FdmVudHNsaWJyYXJ5IFRhYmxlIElELgorCSAqIE5PVEU6IFRoZSBJRCBtdXN0IGJlIHRoZSBzYW1lIGluOgorCSAqICAtIHNTeXN0ZW1FdmVudHNMaWJyYXJ5VGFibGUuY29uZmlndXJhdGlvbgorCSAqICAtIHNTeXN0ZW1FdmVudHNMaWJyYXJ5VGFibGUubmF0dGFibGVjb25maWd1cmF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NZU1RFTUVWRU5UU0xJQlJBUllfVEFCTEVfSUQgPQorCQkiU1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFNTeXN0ZW1FdmVudHNsaWJyYXJ5IFRhYmxlIG5hbWUuCi0gICAgICogTk9URTogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZSBpbjoKLSAgICAgKiAgLSBzU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlLm5hdHRhYmxlY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX05BTUUgPQotICAgICAgICAiU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFNTeXN0ZW1FdmVudHNsaWJyYXJ5IFRhYmxlIG5hbWUuCisJICogTk9URTogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZSBpbjoKKwkgKiAgLSBzU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlLm5hdHRhYmxlY29uZmlndXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTWVNURU1FVkVOVFNMSUJSQVJZX1RBQkxFX05BTUUgPQorCQkiU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlIjsgLy8kTk9OLU5MUy0xJAogCiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldCgpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgRVNGTG9jYWxBbmFseXNpc1RhYmxlc1NldCgpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3RhYmxlL3Rlc3Rlci9TU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlVGVzdGVyLmphdmEgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3RhYmxlL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy90YWJsZS90ZXN0ZXIvU1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZVRlc3Rlci5qYXZhCmluZGV4IDJjOTQyYTYuLmUxYjUyN2UgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3RhYmxlL3Rlc3Rlci9TU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlVGVzdGVyLmphdmEKKysrIGIvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy90YWJsZS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2xvY2FsYW5hbHlzaXMvdGFibGUvdGVzdGVyL1NTeXN0ZW1FdmVudHNMaWJyYXJ5VGFibGVUZXN0ZXIuamF2YQpAQCAtMzEsNTggKzMxLDU4IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlVGVzdGVyCi0gICAgaW1wbGVtZW50cyBJVGFibGVUZXN0ZXIgeworCWltcGxlbWVudHMgSVRhYmxlVGVzdGVyIHsKIAotICAgIC8qKgotICAgICAqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU1N5c3RlbUV2ZW50c0xpYnJhcnlUYWJsZVRlc3RlcigpIHsKLSAgICB9CisJLyoqCisJICoKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBTU3lzdGVtRXZlbnRzTGlicmFyeVRhYmxlVGVzdGVyKCkgeworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGlzQWxsb3dlZChmaW5hbCBPYmplY3QgcENvbnRleHQpIHsKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbnVsbDsKLSAgICAgICAgaWYgKHBDb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgRWxlbWVudCB2RWwgPSAoRWxlbWVudCkgcENvbnRleHQ7Ci0gICAgICAgICAgICBJU3BlY2lhbGl6YXRpb25UeXBlIHZUeXBlID0gKElTcGVjaWFsaXphdGlvblR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5nZXRUeXBlKEVTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UWVBFX0lEKTsKLSAgICAgICAgICAgIGlmICh2VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUVsZW1lbnRNYXRjaGVyIHZNYXRjaGVyID0gdlR5cGUuZ2V0TWF0Y2hlcigpOwotICAgICAgICAgICAgICAgIFByb2ZpbGUgdlByb2ZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dCBpbnN0YW5jZW9mIFBhY2thZ2UgfHwgdk1hdGNoZXIubWF0Y2hlcyh2RWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZQcm9maWxlID0gVU1MVXRpbC5nZXRQcm9maWxlKElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UsIHZFbCk7Ci0gICAgICAgICAgICAgICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGlzQWxsb3dlZChmaW5hbCBPYmplY3QgcENvbnRleHQpIHsKKwkJSVN0YXR1cyB2U3RhdHVzID0gbnVsbDsKKwkJaWYgKHBDb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgeworCQkJRWxlbWVudCB2RWwgPSAoRWxlbWVudCkgcENvbnRleHQ7CisJCQlJU3BlY2lhbGl6YXRpb25UeXBlIHZUeXBlID0gKElTcGVjaWFsaXphdGlvblR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQorCQkJCS5nZXRUeXBlKEVTRkxvY2FsQW5hbHlzaXNUeXBlc1NldC5TU1lTVEVNRVZFTlRTTElCUkFSWV9UWVBFX0lEKTsKKwkJCWlmICh2VHlwZSAhPSBudWxsKSB7CisJCQkJSUVsZW1lbnRNYXRjaGVyIHZNYXRjaGVyID0gdlR5cGUuZ2V0TWF0Y2hlcigpOworCQkJCVByb2ZpbGUgdlByb2ZpbGUgPSBudWxsOworCQkJCWlmIChwQ29udGV4dCBpbnN0YW5jZW9mIFBhY2thZ2UgfHwgdk1hdGNoZXIubWF0Y2hlcyh2RWwpKSB7CisJCQkJCXZQcm9maWxlID0gVU1MVXRpbC5nZXRQcm9maWxlKElFU0ZMb2NhbEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UsIHZFbCk7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgaWYgKHZQcm9maWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZQYWNrYWdlUU4gPSB2UHJvZmlsZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2RWwuZ2V0TmVhcmVzdFBhY2thZ2UoKS5nZXRBcHBsaWVkUHJvZmlsZSh2UGFja2FnZVFOLCB0cnVlKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2U3RhdHVzID0gbmV3IFN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLk9LLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRkxvY2FsQW5hbHlzaXNUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjb250ZXh0IGFsbG93ZWQgdG8gY3JlYXRlIGEgU1N5c3RlbUV2ZW50c0xpYnJhcnkgVGFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdlN0YXR1cyA9IG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcHJvZmlsZSAiICsgdlBhY2thZ2VRTiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYXBwbGllZCBvbiB0aGUgbW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJaWYgKHZQcm9maWxlICE9IG51bGwpIHsKKwkJCQkJZmluYWwgU3RyaW5nIHZQYWNrYWdlUU4gPSB2UHJvZmlsZS5nZXRRdWFsaWZpZWROYW1lKCk7CisJCQkJCWlmICh2RWwuZ2V0TmVhcmVzdFBhY2thZ2UoKS5nZXRBcHBsaWVkUHJvZmlsZSh2UGFja2FnZVFOLCB0cnVlKSAhPSBudWxsKSB7CisJCQkJCQl2U3RhdHVzID0gbmV3IFN0YXR1cygKKwkJCQkJCQlJU3RhdHVzLk9LLAorCQkJCQkJCUVTRkxvY2FsQW5hbHlzaXNUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCisJCQkJCQkJIlRoZSBjb250ZXh0IGFsbG93ZWQgdG8gY3JlYXRlIGEgU1N5c3RlbUV2ZW50c0xpYnJhcnkgVGFibGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJdlN0YXR1cyA9IG5ldyBTdGF0dXMoCisJCQkJCQkJSVN0YXR1cy5FUlJPUiwKKwkJCQkJCQlFU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAorCQkJCQkJCSJUaGUgcHJvZmlsZSAiICsgdlBhY2thZ2VRTiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgIiBpcyBub3QgYXBwbGllZCBvbiB0aGUgbW9kZWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgaWYgKHZTdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdlN0YXR1cyA9IG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICBFU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJUaGUgY29udGV4dCBpcyBub3QgYW4gVU1MIEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2U3RhdHVzOwotICAgIH0KKwkJaWYgKHZTdGF0dXMgPT0gbnVsbCkgeworCQkJdlN0YXR1cyA9IG5ldyBTdGF0dXMoCisJCQkJSVN0YXR1cy5FUlJPUiwKKwkJCQlFU0ZMb2NhbEFuYWx5c2lzVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAorCQkJCSJUaGUgY29udGV4dCBpcyBub3QgYW4gVU1MIEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiB2U3RhdHVzOworCX0KIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy91aS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudWkvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdWkvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnVpL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvbG9jYWxhbmFseXNpcy91aS9vcmcucG9sYXJzeXMuZXNmLmxvY2FsYW5hbHlzaXMudWkvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3VpL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy51aS9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9sb2NhbGFuYWx5c2lzL3VpL29yZy5wb2xhcnN5cy5lc2YubG9jYWxhbmFseXNpcy51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvbG9jYWxhbmFseXNpcy91aS9FU0ZMb2NhbEFuYWx5c2lzVUlBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdWkvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3VpL0VTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvci5qYXZhCmluZGV4IGNhNDdhNzkuLmQ1YTMzMjAgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdWkvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3VpL0VTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL2xvY2FsYW5hbHlzaXMvdWkvb3JnLnBvbGFyc3lzLmVzZi5sb2NhbGFuYWx5c2lzLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9sb2NhbGFuYWx5c2lzL3VpL0VTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvci5qYXZhCkBAIC0yMyw4MyArMjMsODMgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIEVTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvciBleHRlbmRzIEVNRlBsdWdpbiBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGTG9jYWxBbmFseXNpc1VJQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZMb2NhbEFuYWx5c2lzVUlBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwkvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZMb2NhbEFuYWx5c2lzVUlBY3RpdmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICovCisJcHVibGljIEVTRkxvY2FsQW5hbHlzaXNVSUFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgQnVuZGxleENvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKLSAgICAgKi8KLSAgICBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc0J1bmRsZUNvbnRleHQ7Ci0gICAgfQorCS8qKgorCSAqIEdldCBCdW5kbGV4Q29udGV4dC4KKwkgKgorCSAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAorCSAqLworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBzQnVuZGxlQ29udGV4dDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKIAotICAgIH0KKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICB9CisJCQkvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCisJCQlzUGx1Z2luID0gdGhpczsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9kb2Mvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZG9jL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9zYWZldHlyZXEvZG9jL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmRvYy9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9kb2Mvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZG9jL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL2RvYy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5kb2MvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9FU0ZTYWZldHlSZXFFeGVjdXRpb25VSUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9leGVjdXRpb24vdWkvRVNGU2FmZXR5UmVxRXhlY3V0aW9uVUlBY3RpdmF0b3IuamF2YQppbmRleCA4NWFlMTU1Li4yNGZlMGMxIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9FU0ZTYWZldHlSZXFFeGVjdXRpb25VSUFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL0VTRlNhZmV0eVJlcUV4ZWN1dGlvblVJQWN0aXZhdG9yLmphdmEKQEAgLTI0LDEwNSArMjQsMTA1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZTYWZldHlSZXFFeGVjdXRpb25VSUFjdGl2YXRvciBleHRlbmRzIEVNRlBsdWdpbiB7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZTYWZldHlSZXFFeGVjdXRpb25VSUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZTYWZldHlSZXFFeGVjdXRpb25VSUFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRlNhZmV0eVJlcUV4ZWN1dGlvblVJQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRlNhZmV0eVJlcUV4ZWN1dGlvblVJQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZTYWZldHlSZXFFeGVjdXRpb25VSUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGU2FmZXR5UmVxRXhlY3V0aW9uVUlBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGFuIEVycm9yIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBFcnJvciBzdGF0dXMKKwkJSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CisJLyoqCisJICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKKwkJLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cworCQlJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgc1BsdWdpbi5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5XQVJOSU5HLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEluZm8gc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSW5mbyBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyB2U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHNQbHVnaW4uZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBzUGx1Z2luLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLklORk8sIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKIAotICAgICAgICAvLyBMb2cgaXQKLSAgICAgICAgSU5TVEFOQ0UubG9nKHZTdGF0dXMpOwotICAgIH0KKwkJLy8gTG9nIGl0CisJCUlOU1RBTkNFLmxvZyh2U3RhdHVzKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotICAgICAgICAgICAgc1BsdWdpbiA9IHRoaXM7CisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJc1BsdWdpbiA9IHRoaXM7CiAKLSAgICAgICAgfQorCQl9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0KHBDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCXN1cGVyLnN0YXJ0KHBDb250ZXh0KTsKKwkJfQorCX0KIAogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0FwcGx5U3lzTUxQcm9maWxlSGFuZGxlci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9leGVjdXRpb24vdWkvaGFuZGxlci9BcHBseVN5c01MUHJvZmlsZUhhbmRsZXIuamF2YQppbmRleCBkODdlZmY4Li44OWM0MDQ1IDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0FwcGx5U3lzTUxQcm9maWxlSGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQXBwbHlTeXNNTFByb2ZpbGVIYW5kbGVyLmphdmEKQEAgLTI5LDM3ICsyOSwzNyBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgQXBwbHlTeXNNTFByb2ZpbGVIYW5kbGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFwcGx5U3lzTUxQcm9maWxlSGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQXBwbHlTeXNNTFByb2ZpbGVIYW5kbGVyKCkgeworCX0KIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgYW4gZWxlbWVudCBhbmQgYXBwbHkgU3lzTUwgcHJvZmlsZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgYW4gZWxlbWVudCBhbmQgYXBwbHkgU3lzTUwgcHJvZmlsZS4KKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIE5hbWVkRWxlbWVudCB2U2VsZWN0ZWRFbGVtZW50ID0KLSAgICAgICAgICAgIChOYW1lZEVsZW1lbnQpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkpOworCQlmaW5hbCBOYW1lZEVsZW1lbnQgdlNlbGVjdGVkRWxlbWVudCA9CisJCQkoTmFtZWRFbGVtZW50KSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKIAotICAgICAgICBpZiAodlNlbGVjdGVkRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNb2RlbCB2RVNGTW9kZWwgPSBNb2RlbFV0aWwuZ2V0V29ya2luZ01vZGVsKCk7Ci0gICAgICAgICAgICBpZiAodkVTRk1vZGVsICE9IG51bGwpIHsKKwkJaWYgKHZTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCkgeworCQkJTW9kZWwgdkVTRk1vZGVsID0gTW9kZWxVdGlsLmdldFdvcmtpbmdNb2RlbCgpOworCQkJaWYgKHZFU0ZNb2RlbCAhPSBudWxsKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIFN5c01MIHByb2ZpbGUKLSAgICAgICAgICAgICAgICBpZiAodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKHN5c21sUGFja2FnZS5lTlNfUFJFRklYKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwuYXBwbHlTeXNNTFByb2ZpbGUodkVTRk1vZGVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCQkvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIFN5c01MIHByb2ZpbGUKKwkJCQlpZiAodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKHN5c21sUGFja2FnZS5lTlNfUFJFRklYKSA9PSBudWxsKSB7CisJCQkJCUVTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwuYXBwbHlTeXNNTFByb2ZpbGUodkVTRk1vZGVsKTsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJCXJldHVybiBudWxsOworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVIYW5kbGVyLmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZUVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlSGFuZGxlci5qYXZhCmluZGV4IDE1YThjMDguLmM4MWQzMzYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVIYW5kbGVyLmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9leGVjdXRpb24vdWkvaGFuZGxlci9DcmVhdGVFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZUhhbmRsZXIuamF2YQpAQCAtMzIsNTUgKzMyLDU1IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBDcmVhdGVFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZUhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVIYW5kbGVyKCkgewotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBDcmVhdGVFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZUhhbmRsZXIoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50IChQYWNrYWdlL01vZGVsKSBhbmQgY2FsbCB0aGUgYWN0aW9uIGZvciBjcmVhdGluZyBhbiBFU0ZTYWZldHlSZXF1aXJlbWVudHMgVGFibGUuCi0gICAgICoKLSAgICAgKiBUYWJsZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkvKioKKwkgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFBhY2thZ2UvTW9kZWwpIGFuZCBjYWxsIHRoZSBhY3Rpb24gZm9yIGNyZWF0aW5nIGFuIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBUYWJsZS4KKwkgKgorCSAqIFRhYmxlLgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCi0gICAgICAgIElTZWxlY3Rpb24gdlNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb24ocEV2ZW50KTsKKwkJSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOwogCi0gICAgICAgIGZpbmFsIFBhY2thZ2UgdlNlbGVjdGVkUGFja2FnZSA9Ci0gICAgICAgICAgICAoUGFja2FnZSkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlKCkpOworCQlmaW5hbCBQYWNrYWdlIHZTZWxlY3RlZFBhY2thZ2UgPQorCQkJKFBhY2thZ2UpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZSgpKTsKIAotICAgICAgICBpZiAodlNlbGVjdGVkUGFja2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNb2RlbCB2RVNGTW9kZWwgPSBNb2RlbFV0aWwuZ2V0V29ya2luZ01vZGVsKCk7Ci0gICAgICAgICAgICBpZiAodkVTRk1vZGVsICE9IG51bGwpIHsKKwkJaWYgKHZTZWxlY3RlZFBhY2thZ2UgIT0gbnVsbCkgeworCQkJTW9kZWwgdkVTRk1vZGVsID0gTW9kZWxVdGlsLmdldFdvcmtpbmdNb2RlbCgpOworCQkJaWYgKHZFU0ZNb2RlbCAhPSBudWxsKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBwcm9maWxlCi0gICAgICAgICAgICAgICAgaWYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmVOU19QUkVGSVgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5hcHBseUVTRlNhZmV0eVJlcXVpcmVtZW50c1Byb2ZpbGUodkVTRk1vZGVsKTsKLSAgICAgICAgICAgICAgICB9CisJCQkJLy8gVmVyaWZ5IGFuZCBhcHBseSAoaWYgbmVjZXNzYXJ5KSBFU0ZTYWZldHlSZXF1aXJlbWVudHMgcHJvZmlsZQorCQkJCWlmICh2RVNGTW9kZWwuZ2V0QXBwbGllZFByb2ZpbGUoRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lTlNfUFJFRklYKSA9PSBudWxsKSB7CisJCQkJCUVTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwuYXBwbHlFU0ZTYWZldHlSZXF1aXJlbWVudHNQcm9maWxlKHZFU0ZNb2RlbCk7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgLy8gVmVyaWZ5IGFuZCBhcHBseSAoaWYgbmVjZXNzYXJ5KSBTeXNNTCBwcm9maWxlCi0gICAgICAgICAgICAgICAgaWYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShzeXNtbFBhY2thZ2UuZU5TX1BSRUZJWCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBFU0ZTYWZldHlSZXF1aXJlbWVudHNVdGlsLmFwcGx5U3lzTUxQcm9maWxlKHZFU0ZNb2RlbCk7Ci0gICAgICAgICAgICAgICAgfQorCQkJCS8vIFZlcmlmeSBhbmQgYXBwbHkgKGlmIG5lY2Vzc2FyeSkgU3lzTUwgcHJvZmlsZQorCQkJCWlmICh2RVNGTW9kZWwuZ2V0QXBwbGllZFByb2ZpbGUoc3lzbWxQYWNrYWdlLmVOU19QUkVGSVgpID09IG51bGwpIHsKKwkJCQkJRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5hcHBseVN5c01MUHJvZmlsZSh2RVNGTW9kZWwpOworCQkJCX0KIAotICAgICAgICAgICAgICAgIGlmICgodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1BSRUZJWCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShzeXNtbFBhY2thZ2UuZU5TX1BSRUZJWCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBUYWJsZQotICAgICAgICAgICAgICAgICAgICBFU0ZUYWJsZXNVdGlsLmNyZWF0ZVRhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVzU2V0LlNBRkVUWVJFUV9UQUJMRV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlc1NldC5TQUZFVFlSRVFfVEFCTEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZTZWxlY3RlZFBhY2thZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQkJCWlmICgodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1BSRUZJWCkgIT0gbnVsbCkKKwkJCQkJJiYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShzeXNtbFBhY2thZ2UuZU5TX1BSRUZJWCkgIT0gbnVsbCkpIHsKKwkJCQkJLy8gQ3JlYXRlIGFuIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBUYWJsZQorCQkJCQlFU0ZUYWJsZXNVdGlsLmNyZWF0ZVRhYmxlKAorCQkJCQkJRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVzU2V0LlNBRkVUWVJFUV9UQUJMRV9JRCwKKwkJCQkJCUVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlc1NldC5TQUZFVFlSRVFfVEFCTEVfTkFNRSwKKwkJCQkJCXZTZWxlY3RlZFBhY2thZ2UpOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJcmV0dXJuIG51bGw7CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL0NyZWF0ZVNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50SGFuZGxlci5qYXZhCmluZGV4IDdjMDY1ODkuLmUzOGMxNjQgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50SGFuZGxlci5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL2hhbmRsZXIvQ3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50SGFuZGxlci5qYXZhCkBAIC0zMCw0OCArMzAsNDggQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIENyZWF0ZVNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50SGFuZGxlcigpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50SGFuZGxlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKFBhY2thZ2UvTW9kZWwpIGFuZCBhbmQgY2FsbCB0aGUgYWN0aW9uIGZvciBjcmVhdGluZyBhIFNTYWZldHlSZXF1aXJlbWVudC4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoUGFja2FnZS9Nb2RlbCkgYW5kIGFuZCBjYWxsIHRoZSBhY3Rpb24gZm9yIGNyZWF0aW5nIGEgU1NhZmV0eVJlcXVpcmVtZW50LgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBwRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlJU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKHBFdmVudCk7CiAKLSAgICAgICAgZmluYWwgUGFja2FnZSB2U2VsZWN0ZWRQYWNrYWdlID0KLSAgICAgICAgICAgIChQYWNrYWdlKSBNb2RlbFV0aWwuZ2V0U2VsZWN0ZWRFT2JqZWN0T2ZUeXBlKHZTZWxlY3Rpb24sIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2UoKSk7CisJCWZpbmFsIFBhY2thZ2UgdlNlbGVjdGVkUGFja2FnZSA9CisJCQkoUGFja2FnZSkgTW9kZWxVdGlsLmdldFNlbGVjdGVkRU9iamVjdE9mVHlwZSh2U2VsZWN0aW9uLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlKCkpOwogCi0gICAgICAgIGlmICh2U2VsZWN0ZWRQYWNrYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1vZGVsIHZFU0ZNb2RlbCA9IE1vZGVsVXRpbC5nZXRXb3JraW5nTW9kZWwoKTsKLSAgICAgICAgICAgIGlmICh2RVNGTW9kZWwgIT0gbnVsbCkgeworCQlpZiAodlNlbGVjdGVkUGFja2FnZSAhPSBudWxsKSB7CisJCQlNb2RlbCB2RVNGTW9kZWwgPSBNb2RlbFV0aWwuZ2V0V29ya2luZ01vZGVsKCk7CisJCQlpZiAodkVTRk1vZGVsICE9IG51bGwpIHsKIAotICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBhbmQgYXBwbHkgKGlmIG5lY2Vzc2FyeSkgRVNGU2FmZXR5UmVxdWlyZW1lbnRzIHByb2ZpbGUKLSAgICAgICAgICAgICAgICBpZiAodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1BSRUZJWCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBFU0ZTYWZldHlSZXF1aXJlbWVudHNVdGlsLmFwcGx5RVNGU2FmZXR5UmVxdWlyZW1lbnRzUHJvZmlsZSh2RVNGTW9kZWwpOwotICAgICAgICAgICAgICAgIH0KKwkJCQkvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBwcm9maWxlCisJCQkJaWYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmVOU19QUkVGSVgpID09IG51bGwpIHsKKwkJCQkJRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5hcHBseUVTRlNhZmV0eVJlcXVpcmVtZW50c1Byb2ZpbGUodkVTRk1vZGVsKTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICAvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIFN5c01MIHByb2ZpbGUKLSAgICAgICAgICAgICAgICBpZiAodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKHN5c21sUGFja2FnZS5lTlNfUFJFRklYKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwuYXBwbHlTeXNNTFByb2ZpbGUodkVTRk1vZGVsKTsKLSAgICAgICAgICAgICAgICB9CisJCQkJLy8gVmVyaWZ5IGFuZCBhcHBseSAoaWYgbmVjZXNzYXJ5KSBTeXNNTCBwcm9maWxlCisJCQkJaWYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShzeXNtbFBhY2thZ2UuZU5TX1BSRUZJWCkgPT0gbnVsbCkgeworCQkJCQlFU0ZTYWZldHlSZXF1aXJlbWVudHNVdGlsLmFwcGx5U3lzTUxQcm9maWxlKHZFU0ZNb2RlbCk7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgaWYgKCh2RVNGTW9kZWwuZ2V0QXBwbGllZFByb2ZpbGUoRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lTlNfUFJFRklYKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAmJiAodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKHN5c21sUGFja2FnZS5lTlNfUFJFRklYKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgJ1NTYWZldHlSZXF1aXJlbWVudCcgRWxlbWVudAotICAgICAgICAgICAgICAgICAgICBFU0ZTYWZldHlSZXF1aXJlbWVudHNVdGlsLmNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudCh2U2VsZWN0ZWRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCQlpZiAoKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmVOU19QUkVGSVgpICE9IG51bGwpCisJCQkJCSYmICh2RVNGTW9kZWwuZ2V0QXBwbGllZFByb2ZpbGUoc3lzbWxQYWNrYWdlLmVOU19QUkVGSVgpICE9IG51bGwpKSB7CisJCQkJCS8vIENyZWF0ZSAnU1NhZmV0eVJlcXVpcmVtZW50JyBFbGVtZW50CisJCQkJCUVTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwuY3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50KHZTZWxlY3RlZFBhY2thZ2UpOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJcmV0dXJuIG51bGw7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9leGVjdXRpb24vdWkvaGFuZGxlci9TZXRTU2FmZXR5UmVxdWlyZW1lbnRIYW5kbGVyLmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1NldFNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIuamF2YQppbmRleCA0MTRjYzU1Li4xZjRlMzRkIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1NldFNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS9oYW5kbGVyL1NldFNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIuamF2YQpAQCAtMzIsNDIgKzMyLDQyIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXRTU2FmZXR5UmVxdWlyZW1lbnRIYW5kbGVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNldFNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIoKSB7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFNldFNTYWZldHlSZXF1aXJlbWVudEhhbmRsZXIoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50IChTeXNNTCBSZXF1aXJlbWVudCkgYW5kIHNldCBhcyBhIFNTYWZldHlSZXF1aXJlbWVudC4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgcEV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiB2U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihwRXZlbnQpOworCS8qKgorCSAqIEdldCB0aGUgc2VsZWN0ZWQgZWxlbWVudCAoU3lzTUwgUmVxdWlyZW1lbnQpIGFuZCBzZXQgYXMgYSBTU2FmZXR5UmVxdWlyZW1lbnQuCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IHBFdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCUlTZWxlY3Rpb24gdlNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb24ocEV2ZW50KTsKIAotICAgICAgICBmaW5hbCBDbGFzcyB2U2VsZWN0ZWRDbGFzcyA9Ci0gICAgICAgICAgICAoQ2xhc3MpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xhc3NfKCkpOworCQlmaW5hbCBDbGFzcyB2U2VsZWN0ZWRDbGFzcyA9CisJCQkoQ2xhc3MpIE1vZGVsVXRpbC5nZXRTZWxlY3RlZEVPYmplY3RPZlR5cGUodlNlbGVjdGlvbiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xhc3NfKCkpOwogCi0gICAgICAgIGlmICgodlNlbGVjdGVkQ2xhc3MgIT0gbnVsbCkgJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBSZXF1aXJlbWVudC5jbGFzcykgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIE1vZGVsIHZFU0ZNb2RlbCA9IE1vZGVsVXRpbC5nZXRXb3JraW5nTW9kZWwoKTsKLSAgICAgICAgICAgIGlmICh2RVNGTW9kZWwgIT0gbnVsbCkgeworCQlpZiAoKHZTZWxlY3RlZENsYXNzICE9IG51bGwpICYmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2U2VsZWN0ZWRDbGFzcywgUmVxdWlyZW1lbnQuY2xhc3MpICE9IG51bGwpKSB7CisJCQlNb2RlbCB2RVNGTW9kZWwgPSBNb2RlbFV0aWwuZ2V0V29ya2luZ01vZGVsKCk7CisJCQlpZiAodkVTRk1vZGVsICE9IG51bGwpIHsKIAotICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBhbmQgYXBwbHkgKGlmIG5lY2Vzc2FyeSkgRVNGU2FmZXR5UmVxdWlyZW1lbnRzIHByb2ZpbGUKLSAgICAgICAgICAgICAgICBpZiAodkVTRk1vZGVsLmdldEFwcGxpZWRQcm9maWxlKEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1BSRUZJWCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBFU0ZTYWZldHlSZXF1aXJlbWVudHNVdGlsLmFwcGx5RVNGU2FmZXR5UmVxdWlyZW1lbnRzUHJvZmlsZSh2RVNGTW9kZWwpOwotICAgICAgICAgICAgICAgIH0KKwkJCQkvLyBWZXJpZnkgYW5kIGFwcGx5IChpZiBuZWNlc3NhcnkpIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBwcm9maWxlCisJCQkJaWYgKHZFU0ZNb2RlbC5nZXRBcHBsaWVkUHJvZmlsZShFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmVOU19QUkVGSVgpID09IG51bGwpIHsKKwkJCQkJRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5hcHBseUVTRlNhZmV0eVJlcXVpcmVtZW50c1Byb2ZpbGUodkVTRk1vZGVsKTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICBpZiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odlNlbGVjdGVkQ2xhc3MsIElTU2FmZXR5UmVxdWlyZW1lbnQuY2xhc3MpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgJ1NTYWZldHlSZXF1aXJlbWVudCcgU3RlcmVvdHlwZQotICAgICAgICAgICAgICAgICAgICBFU0ZTYWZldHlSZXF1aXJlbWVudHNVdGlsLmFwcGx5U1NhZmV0eVJlcXVpcmVtZW50U3RlcmVvdHlwZSh2U2VsZWN0ZWRDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZTZWxlY3RlZENsYXNzLCBJU1NhZmV0eVJlcXVpcmVtZW50LmNsYXNzKSA9PSBudWxsKSB7CisJCQkJCS8vIEFwcGx5ICdTU2FmZXR5UmVxdWlyZW1lbnQnIFN0ZXJlb3R5cGUKKwkJCQkJRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5hcHBseVNTYWZldHlSZXF1aXJlbWVudFN0ZXJlb3R5cGUodlNlbGVjdGVkQ2xhc3MpOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkJcmV0dXJuIG51bGw7CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9leGVjdXRpb24vdWkvdGVzdGVyL1N5c01MUmVxdWlyZW1lbnRUZXN0ZXIuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9leGVjdXRpb24vb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEuZXhlY3V0aW9uLnVpL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvZXhlY3V0aW9uL3VpL3Rlc3Rlci9TeXNNTFJlcXVpcmVtZW50VGVzdGVyLmphdmEKaW5kZXggOGNkYTIyYy4uZDg1MWE1NSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL2V4ZWN1dGlvbi9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5leGVjdXRpb24udWkvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9leGVjdXRpb24vdWkvdGVzdGVyL1N5c01MUmVxdWlyZW1lbnRUZXN0ZXIuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvZXhlY3V0aW9uL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLmV4ZWN1dGlvbi51aS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL2V4ZWN1dGlvbi91aS90ZXN0ZXIvU3lzTUxSZXF1aXJlbWVudFRlc3Rlci5qYXZhCkBAIC0yNiw1OCArMjYsNTggQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIFN5c01MUmVxdWlyZW1lbnRUZXN0ZXIKLSAgICBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKKwlleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKIAotICAgIC8qKiBQcm9wZXJ0eSAiaXNTeXNNTFJlcXVpcmVtZW50Ii4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU1lTTUxfUkVRVUlSRU1FTlQgPSAiaXNTeXNNTFJlcXVpcmVtZW50IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBQcm9wZXJ0eSAiaXNTeXNNTFJlcXVpcmVtZW50Ii4gKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU1lTTUxfUkVRVUlSRU1FTlQgPSAiaXNTeXNNTFJlcXVpcmVtZW50IjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3lzTUxSZXF1aXJlbWVudFRlc3RlcigpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFN5c01MUmVxdWlyZW1lbnRUZXN0ZXIoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KAotICAgICAgICBmaW5hbCBPYmplY3QgcFJlY2VpdmVyLAotICAgICAgICBmaW5hbCBTdHJpbmcgcFByb3BlcnR5LAotICAgICAgICBmaW5hbCBPYmplY3RbXSBwQXJncywKLSAgICAgICAgZmluYWwgT2JqZWN0IHBFeHBlY3RlZFZhbHVlKSB7Ci0gICAgICAgIGJvb2xlYW4gdkFuc3dlciA9IGZhbHNlOworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KAorCQlmaW5hbCBPYmplY3QgcFJlY2VpdmVyLAorCQlmaW5hbCBTdHJpbmcgcFByb3BlcnR5LAorCQlmaW5hbCBPYmplY3RbXSBwQXJncywKKwkJZmluYWwgT2JqZWN0IHBFeHBlY3RlZFZhbHVlKSB7CisJCWJvb2xlYW4gdkFuc3dlciA9IGZhbHNlOwogCi0gICAgICAgIGlmIChJU19TWVNNTF9SRVFVSVJFTUVOVC5lcXVhbHMocFByb3BlcnR5KSAmJiBwUmVjZWl2ZXIgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gdlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgcFJlY2VpdmVyOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZGaXJzdEVsZW1lbnQgPSB2U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQlpZiAoSVNfU1lTTUxfUkVRVUlSRU1FTlQuZXF1YWxzKHBQcm9wZXJ0eSkgJiYgcFJlY2VpdmVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHZTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHBSZWNlaXZlcjsKKwkJCWZpbmFsIE9iamVjdCB2Rmlyc3RFbGVtZW50ID0gdlNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKIAotICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgZWxlbWVudCBpbiBhIEVkaXRQYXJ0Ci0gICAgICAgICAgICBpZiAodkZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgRWRpdFBhcnQgdkVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSB2Rmlyc3RFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICh2RWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgVmlldyB2VmlldyA9IChWaWV3KSB2RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdkNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZWaWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Q2xhc3MgPSAoQ2xhc3MpIHZWaWV3LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKHZDbGFzcyAhPSBudWxsKSAmJiAoVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24odkNsYXNzLCBSZXF1aXJlbWVudC5jbGFzcykgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZBbnN3ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2Rmlyc3RFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdFRyZWVFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgTW9kZWwgRXhwbG9yZXIKLSAgICAgICAgICAgICAgICBFT2JqZWN0VHJlZUVsZW1lbnQgdlRyZWVFbCA9IChFT2JqZWN0VHJlZUVsZW1lbnQpIHZGaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHZUcmVlRWwuZ2V0RU9iamVjdCgpIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdkNsYXNzID0gKENsYXNzKSB2VHJlZUVsLmdldEVPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZDbGFzcywgUmVxdWlyZW1lbnQuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZBbnN3ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQm9vbGVhbih2QW5zd2VyKS5lcXVhbHMocEV4cGVjdGVkVmFsdWUpOwotICAgIH0KKwkJCS8vIElmIHNlbGVjdGVkIGVsZW1lbnQgaW4gYSBFZGl0UGFydAorCQkJaWYgKHZGaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgeworCQkJCUVkaXRQYXJ0IHZFZGl0UGFydCA9IChFZGl0UGFydCkgdkZpcnN0RWxlbWVudDsKKwkJCQlpZiAodkVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7CisJCQkJCVZpZXcgdlZpZXcgPSAoVmlldykgdkVkaXRQYXJ0LmdldE1vZGVsKCk7CisJCQkJCUNsYXNzIHZDbGFzcyA9IG51bGw7CisJCQkJCWlmICh2Vmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBDbGFzcykgeworCQkJCQkJdkNsYXNzID0gKENsYXNzKSB2Vmlldy5nZXRFbGVtZW50KCk7CisJCQkJCX0KKwkJCQkJaWYgKCh2Q2xhc3MgIT0gbnVsbCkgJiYgKFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHZDbGFzcywgUmVxdWlyZW1lbnQuY2xhc3MpICE9IG51bGwpKSB7CisJCQkJCQl2QW5zd2VyID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAodkZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3RUcmVlRWxlbWVudCkgeworCQkJCS8vIElmIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIE1vZGVsIEV4cGxvcmVyCisJCQkJRU9iamVjdFRyZWVFbGVtZW50IHZUcmVlRWwgPSAoRU9iamVjdFRyZWVFbGVtZW50KSB2Rmlyc3RFbGVtZW50OworCQkJCWlmICh2VHJlZUVsLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIENsYXNzKSB7CisJCQkJCUNsYXNzIHZDbGFzcyA9IChDbGFzcykgdlRyZWVFbC5nZXRFT2JqZWN0KCk7CisJCQkJCWlmIChVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbih2Q2xhc3MsIFJlcXVpcmVtZW50LmNsYXNzKSAhPSBudWxsKSB7CisJCQkJCQl2QW5zd2VyID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV3IEJvb2xlYW4odkFuc3dlcikuZXF1YWxzKHBFeHBlY3RlZFZhbHVlKTsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEubWV0YW1vZGVsL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9zYWZldHlyZXEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLm1ldGFtb2RlbC9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9tZXRhbW9kZWwvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEubWV0YW1vZGVsL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5tZXRhbW9kZWwvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL21ldGFtb2RlbC9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5tZXRhbW9kZWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9tZXRhbW9kZWwvRVNGU2FmZXR5UmVxTWV0YW1vZGVsQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLm1ldGFtb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL21ldGFtb2RlbC9FU0ZTYWZldHlSZXFNZXRhbW9kZWxBY3RpdmF0b3IuamF2YQppbmRleCAxZDA3YzllLi40MTcxOWNlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLm1ldGFtb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL21ldGFtb2RlbC9FU0ZTYWZldHlSZXFNZXRhbW9kZWxBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvbWV0YW1vZGVsL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLm1ldGFtb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL21ldGFtb2RlbC9FU0ZTYWZldHlSZXFNZXRhbW9kZWxBY3RpdmF0b3IuamF2YQpAQCAtMjEsNTIgKzIxLDUyIEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OSAkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZTYWZldHlSZXFNZXRhbW9kZWxBY3RpdmF0b3IKLSAgICBleHRlbmRzIEVNRlBsdWdpbiB7CisJZXh0ZW5kcyBFTUZQbHVnaW4gewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGU2FmZXR5UmVxTWV0YW1vZGVsQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRlNhZmV0eVJlcU1ldGFtb2RlbEFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRlNhZmV0eVJlcU1ldGFtb2RlbEFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZTYWZldHlSZXFNZXRhbW9kZWxBY3RpdmF0b3IoKTsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEVTRlNhZmV0eVJlcU1ldGFtb2RlbEFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGU2FmZXR5UmVxTWV0YW1vZGVsQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnNlcnZpY2UudHlwZXMvYWJvdXQuaHRtbAppbmRleCBkMzVkNWFlLi43NzhlMWJhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnNlcnZpY2UudHlwZXMvYWJvdXQuaHRtbAorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnNlcnZpY2UudHlwZXMvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL0VTRlNhZmV0eVJlcVNlcnZpY2VUeXBlc0FjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL0VTRlNhZmV0eVJlcVNlcnZpY2VUeXBlc0FjdGl2YXRvci5qYXZhCmluZGV4IDZiMjc3ZjYuLmVkMGQ2OWIgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Byb2ZpbGUvc2VydmljZS90eXBlcy9FU0ZTYWZldHlSZXFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3NlcnZpY2UvdHlwZXMvRVNGU2FmZXR5UmVxU2VydmljZVR5cGVzQWN0aXZhdG9yLmphdmEKQEAgLTIzLDg0ICsyMyw4NCBAQAogICovCiBwdWJsaWMgY2xhc3MgRVNGU2FmZXR5UmVxU2VydmljZVR5cGVzQWN0aXZhdG9yIGV4dGVuZHMgRU1GUGx1Z2luIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVTRlNhZmV0eVJlcVNlcnZpY2VUeXBlc0FjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZTYWZldHlSZXFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZTYWZldHlSZXFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGU2FmZXR5UmVxU2VydmljZVR5cGVzQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGU2FmZXR5UmVxU2VydmljZVR5cGVzQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBFU0ZTYWZldHlSZXFTZXJ2aWNlVHlwZXNBY3RpdmF0b3IoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7CisJfQogCi0gICAgLyoqCi0gICAgICogR2V0IEJ1bmRsZXhDb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBCdW5kbGVDb250ZXh0Ci0gICAgICovCi0gICAgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHNCdW5kbGVDb250ZXh0OwotICAgIH0KKwkvKioKKwkgKiBHZXQgQnVuZGxleENvbnRleHQuCisJICoKKwkgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKKwkgKi8KKwlzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgeworCQlyZXR1cm4gc0J1bmRsZUNvbnRleHQ7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CiAKLSAgICB9CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBudWxsOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Byb2ZpbGUvc2VydmljZS90eXBlcy9zZXQvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVHlwZXNTZXQuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUuc2VydmljZS50eXBlcy9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Byb2ZpbGUvc2VydmljZS90eXBlcy9zZXQvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVHlwZXNTZXQuamF2YQppbmRleCAxNjY5NjUxLi45NzdkY2JlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnNlcnZpY2UudHlwZXMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3NlcnZpY2UvdHlwZXMvc2V0L0VTRlNhZmV0eVJlcXVpcmVtZW50c1R5cGVzU2V0LmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS5zZXJ2aWNlLnR5cGVzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS9zZXJ2aWNlL3R5cGVzL3NldC9FU0ZTYWZldHlSZXF1aXJlbWVudHNUeXBlc1NldC5qYXZhCkBAIC0xOCwxNCArMTgsMTQgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEVTRlNhZmV0eVJlcXVpcmVtZW50c1R5cGVzU2V0IHsKIAotICAgIC8qKiBTcGVjaWFsaXplZCBUeXBlcyBJRCBvZiBTU2FmZXR5UmVxdWlyZW1lbnQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NBRkVUWVJFUVVJUkVNRU5UX1RZUEVfSUQgPQotICAgICAgICAib3JnLnBvbGFyc3lzLmVzZi5FU0ZTYWZldHlSZXF1aXJlbWVudHMuU1NhZmV0eVJlcXVpcmVtZW50IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBTcGVjaWFsaXplZCBUeXBlcyBJRCBvZiBTU2FmZXR5UmVxdWlyZW1lbnQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NBRkVUWVJFUVVJUkVNRU5UX1RZUEVfSUQgPQorCQkib3JnLnBvbGFyc3lzLmVzZi5FU0ZTYWZldHlSZXF1aXJlbWVudHMuU1NhZmV0eVJlcXVpcmVtZW50IjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVTRlNhZmV0eVJlcXVpcmVtZW50c1R5cGVzU2V0KCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCisJICovCisJcHJpdmF0ZSBFU0ZTYWZldHlSZXF1aXJlbWVudHNUeXBlc1NldCgpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvYWJvdXQuaHRtbAppbmRleCBkMzVkNWFlLi43NzhlMWJhIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnRvb2xzL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS50b29scy9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS90b29scy9FU0ZTYWZldHlSZXFQcm9maWxlVG9vbHNBY3RpdmF0b3IuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3Rvb2xzL0VTRlNhZmV0eVJlcVByb2ZpbGVUb29sc0FjdGl2YXRvci5qYXZhCmluZGV4IGZkM2RhOGUuLjVmYzhjZGEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3Rvb2xzL0VTRlNhZmV0eVJlcVByb2ZpbGVUb29sc0FjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3Rvb2xzL0VTRlNhZmV0eVJlcVByb2ZpbGVUb29sc0FjdGl2YXRvci5qYXZhCkBAIC0yMyw4NCArMjMsODQgQEAKICAqLwogcHVibGljIGNsYXNzIEVTRlNhZmV0eVJlcVByb2ZpbGVUb29sc0FjdGl2YXRvciBleHRlbmRzIEVNRlBsdWdpbiBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7CiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZTYWZldHlSZXFQcm9maWxlVG9vbHNBY3RpdmF0b3IgSU5TVEFOQ0UgPSBuZXcgRVNGU2FmZXR5UmVxUHJvZmlsZVRvb2xzQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGU2FmZXR5UmVxUHJvZmlsZVRvb2xzQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRlNhZmV0eVJlcVByb2ZpbGVUb29sc0FjdGl2YXRvcigpOwogCi0gICAgLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOworCS8qKiBFeGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGJ1bmRsZS4gKi8KKwlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKIAotICAgIC8qKiBLZWVwIHRyYWNrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBzaW5nbGV0b24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEVTRlNhZmV0eVJlcVByb2ZpbGVUb29sc0FjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGU2FmZXR5UmVxUHJvZmlsZVRvb2xzQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBCdW5kbGV4Q29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OwogCi0gICAgfQorCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNCdW5kbGVDb250ZXh0ID0gbnVsbDsKLSAgICB9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQWRkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdGl2YXRvciBjYW4gd29yayB3aXRoIHRoZSBwcm9maWxlIG1lY2hhbmlzbXMuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc0J1bmRsZUNvbnRleHQgPSBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotICAgICAgICByZXR1cm4gc1BsdWdpbjsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCi0gICAgICAgIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgorCQlleHRlbmRzIEVjbGlwc2VQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciBvZiB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlLnRvb2xzL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS90b29scy91dGlsL0VTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3Rvb2xzL3V0aWwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5qYXZhCmluZGV4IDZiZGJkODQuLjZkOTA3ZTUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3Rvb2xzL3V0aWwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUudG9vbHMvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3Rvb2xzL3V0aWwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbC5qYXZhCkBAIC0zMywxNDQgKzMzLDE0NCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbCB7CiAKLSAgICAvKiogQXBwbHkgRVNGU1NhZmV0eVJlcSBwcm9maWxlIGxhYmVsLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMWV9FU0ZTQUZFVFlSRVFVSVJFTUVOVFNfUFJPRklMRV9MQUJFTCA9ICJBcHBseSBFU0ZTU2FmZXR5UmVxdWlybWVudHMgcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogQXBwbHkgRVNGU1NhZmV0eVJlcSBwcm9maWxlIGxhYmVsLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMWV9FU0ZTQUZFVFlSRVFVSVJFTUVOVFNfUFJPRklMRV9MQUJFTCA9ICJBcHBseSBFU0ZTU2FmZXR5UmVxdWlybWVudHMgcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBBcHBseSBTeXNNTCBwcm9maWxlIGxhYmVsLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMWV9TWVNNTF9QUk9GSUxFX0xBQkVMID0gIkFwcGx5IFN5c01MIHByb2ZpbGUiOyAvLyROT04tTkxTLTEkCisJLyoqIEFwcGx5IFN5c01MIHByb2ZpbGUgbGFiZWwuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX1NZU01MX1BST0ZJTEVfTEFCRUwgPSAiQXBwbHkgU3lzTUwgcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBDcmVhdGUgU1NhZmV0eVJlcXVpcm1lbnQgbGFiZWwuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TU0FGRVRZUkVRVUlSRU1FTlRfTEFCRUwgPSAiQ3JlYXRlIFNTYWZldHlSZXF1aXJtZW50IjsgLy8kTk9OLU5MUy0xJAorCS8qKiBDcmVhdGUgU1NhZmV0eVJlcXVpcm1lbnQgbGFiZWwuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TU0FGRVRZUkVRVUlSRU1FTlRfTEFCRUwgPSAiQ3JlYXRlIFNTYWZldHlSZXF1aXJtZW50IjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIEFwcGx5IFNTYWZldHlSZXF1aXJtZW50IHN0ZXJlb3R5cGUgbGFiZWwuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX1NTQUZFVFlSRVFVSVJFTUVOVF9TVEVSRU9UWVBFX0xBQkVMID0gIkFwcGx5IFNTYWZldHlSZXF1aXJtZW50IHN0ZXJlb3R5cGUiOyAvLyROT04tTkxTLTEkCisJLyoqIEFwcGx5IFNTYWZldHlSZXF1aXJtZW50IHN0ZXJlb3R5cGUgbGFiZWwuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX1NTQUZFVFlSRVFVSVJFTUVOVF9TVEVSRU9UWVBFX0xBQkVMID0gIkFwcGx5IFNTYWZldHlSZXF1aXJtZW50IHN0ZXJlb3R5cGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRVNGU2FmZXR5UmVxdWlyZW1lbnRzVXRpbCgpIHsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwcml2YXRlIEVTRlNhZmV0eVJlcXVpcmVtZW50c1V0aWwoKSB7CisJfQogCi0gICAgLyoqCi0gICAgICogQXBwbHkgRVNGU2FmZXR5UmVxdWlyZW1lbnRzIHByb2ZpbGUgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1vZGVsIFRoZSBtb2RlbCB0YXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlFU0ZTYWZldHlSZXF1aXJlbWVudHNQcm9maWxlKGZpbmFsIE1vZGVsIHBNb2RlbCkgewotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBNb2RlbCk7CisJLyoqCisJICogQXBwbHkgRVNGU2FmZXR5UmVxdWlyZW1lbnRzIHByb2ZpbGUgdG8gdGhlIGdpdmVuIG1vZGVsIGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcE1vZGVsIFRoZSBtb2RlbCB0YXJnZXQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlFU0ZTYWZldHlSZXF1aXJlbWVudHNQcm9maWxlKGZpbmFsIE1vZGVsIHBNb2RlbCkgeworCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBNb2RlbCk7CiAKLSAgICAgICAgUmVjb3JkaW5nQ29tbWFuZCB2QXBwbHlFU0ZTYWZldHlSZXFQcm9maWxlQ21kID0KLSAgICAgICAgICAgIG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIEFQUExZX0VTRlNBRkVUWVJFUVVJUkVNRU5UU19QUk9GSUxFX0xBQkVMKSB7CisJCVJlY29yZGluZ0NvbW1hbmQgdkFwcGx5RVNGU2FmZXR5UmVxUHJvZmlsZUNtZCA9CisJCQluZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBBUFBMWV9FU0ZTQUZFVFlSRVFVSVJFTUVOVFNfUFJPRklMRV9MQUJFTCkgewogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBFU0ZTU2FmZXR5UmVxdWlyZW1lbnRzIHByb2ZpbGUgYW5kIGFwcGx5IGl0Ci0gICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgdkVTRlNTYWZldHlSZXF1aXJlbWVudHNQcm9maWxlID0gKFByb2ZpbGUpIFBhY2thZ2VVdGlsLmxvYWRQYWNrYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZVVSSShFU0ZTYWZldHlSZXF1aXJlbWVudHNTZXQuUFJPRklMRV9QQVRIKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNb2RlbC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7CisJCQkJCS8vIFJldHJpZXZlIEVTRlNTYWZldHlSZXF1aXJlbWVudHMgcHJvZmlsZSBhbmQgYXBwbHkgaXQKKwkJCQkJUHJvZmlsZSB2RVNGU1NhZmV0eVJlcXVpcmVtZW50c1Byb2ZpbGUgPSAoUHJvZmlsZSkgUGFja2FnZVV0aWwubG9hZFBhY2thZ2UoCisJCQkJCQlVUkkuY3JlYXRlVVJJKEVTRlNhZmV0eVJlcXVpcmVtZW50c1NldC5QUk9GSUxFX1BBVEgpLAorCQkJCQkJcE1vZGVsLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICh2RVNGU1NhZmV0eVJlcXVpcmVtZW50c1Byb2ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZVV0aWwuYXBwbHlQcm9maWxlKHBNb2RlbCwgdkVTRlNTYWZldHlSZXF1aXJlbWVudHNQcm9maWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07CisJCQkJCWlmICh2RVNGU1NhZmV0eVJlcXVpcmVtZW50c1Byb2ZpbGUgIT0gbnVsbCkgeworCQkJCQkJUGFja2FnZVV0aWwuYXBwbHlQcm9maWxlKHBNb2RlbCwgdkVTRlNTYWZldHlSZXF1aXJlbWVudHNQcm9maWxlLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2QXBwbHlFU0ZTYWZldHlSZXFQcm9maWxlQ21kLmNhbkV4ZWN1dGUoKSkgewotICAgICAgICAgICAgLy8gRXhlY3V0ZSBjb21tYW5kCi0gICAgICAgICAgICB2RG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodkFwcGx5RVNGU2FmZXR5UmVxUHJvZmlsZUNtZCk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8vIFZlcmlmeSBpZiBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorCQlpZiAodkFwcGx5RVNGU2FmZXR5UmVxUHJvZmlsZUNtZC5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZBcHBseUVTRlNhZmV0eVJlcVByb2ZpbGVDbWQpOworCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogQXBwbHkgJ1NTYWZldHlSZXF1aXJlbWVudCcgU3RlcmVvdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwUmVxdWlyZW1lbnQgVGhlIHJlcXVpcmVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5U1NhZmV0eVJlcXVpcmVtZW50U3RlcmVvdHlwZShmaW5hbCBDbGFzcyBwUmVxdWlyZW1lbnQpIHsKLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwUmVxdWlyZW1lbnQpOworCS8qKgorCSAqIEFwcGx5ICdTU2FmZXR5UmVxdWlyZW1lbnQnIFN0ZXJlb3R5cGUuCisJICoKKwkgKiBAcGFyYW0gcFJlcXVpcmVtZW50IFRoZSByZXF1aXJlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVNTYWZldHlSZXF1aXJlbWVudFN0ZXJlb3R5cGUoZmluYWwgQ2xhc3MgcFJlcXVpcmVtZW50KSB7CisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHZEb21haW4gPSBNb2RlbFV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4ocFJlcXVpcmVtZW50KTsKIAotICAgICAgICBSZWNvcmRpbmdDb21tYW5kIHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZCA9Ci0gICAgICAgICAgICBuZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBBUFBMWV9TU0FGRVRZUkVRVUlSRU1FTlRfU1RFUkVPVFlQRV9MQUJFTCkgeworCQlSZWNvcmRpbmdDb21tYW5kIHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZCA9CisJCQluZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBBUFBMWV9TU0FGRVRZUkVRVUlSRU1FTlRfU1RFUkVPVFlQRV9MQUJFTCkgewogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZShwUmVxdWlyZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwbHlTdGVyZW90eXBlKHBSZXF1aXJlbWVudCwgRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgeworCQkJCQlVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZShwUmVxdWlyZW1lbnQpCisJCQkJCQkuYXBwbHlTdGVyZW90eXBlKHBSZXF1aXJlbWVudCwgRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkpOworCQkJCX0KKwkJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2QXBwbHlTU2FmZXR5UmVxdWlyZW1lbnRDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2QXBwbHlTU2FmZXR5UmVxdWlyZW1lbnRDbWQpOwotICAgICAgICB9Ci0gICAgfQorCQkvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKKwkJaWYgKHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZC5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZCk7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBBcHBseSBTeXNNTCBwcm9maWxlIHRvIHRoZSBnaXZlbiBtb2RlbCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNb2RlbCBUaGUgbW9kZWwgdGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5U3lzTUxQcm9maWxlKGZpbmFsIE1vZGVsIHBNb2RlbCkgewotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBNb2RlbCk7CisJLyoqCisJICogQXBwbHkgU3lzTUwgcHJvZmlsZSB0byB0aGUgZ2l2ZW4gbW9kZWwgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBwTW9kZWwgVGhlIG1vZGVsIHRhcmdldAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVN5c01MUHJvZmlsZShmaW5hbCBNb2RlbCBwTW9kZWwpIHsKKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwTW9kZWwpOwogCi0gICAgICAgIFJlY29yZGluZ0NvbW1hbmQgdkFwcGx5U3lzTUxQcm9maWxlQ21kID0KLSAgICAgICAgICAgIG5ldyBSZWNvcmRpbmdDb21tYW5kKHZEb21haW4sIEFQUExZX1NZU01MX1BST0ZJTEVfTEFCRUwpIHsKKwkJUmVjb3JkaW5nQ29tbWFuZCB2QXBwbHlTeXNNTFByb2ZpbGVDbWQgPQorCQkJbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQVBQTFlfU1lTTUxfUFJPRklMRV9MQUJFTCkgewogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBTeXNNTCBwcm9maWxlIGFuZCBhcHBseSBpdAotICAgICAgICAgICAgICAgICAgICBQcm9maWxlIHZTeXNNTFByb2ZpbGUgPSAoUHJvZmlsZSkgUGFja2FnZVV0aWwubG9hZFBhY2thZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlVVJJKFN5c01MUmVzb3VyY2UuUFJPRklMRV9VUkkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcE1vZGVsLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKKwkJCQkJLy8gUmV0cmlldmUgU3lzTUwgcHJvZmlsZSBhbmQgYXBwbHkgaXQKKwkJCQkJUHJvZmlsZSB2U3lzTUxQcm9maWxlID0gKFByb2ZpbGUpIFBhY2thZ2VVdGlsLmxvYWRQYWNrYWdlKAorCQkJCQkJVVJJLmNyZWF0ZVVSSShTeXNNTFJlc291cmNlLlBST0ZJTEVfVVJJKSwKKwkJCQkJCXBNb2RlbC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAodlN5c01MUHJvZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlVXRpbC5hcHBseVByb2ZpbGUocE1vZGVsLCB2U3lzTUxQcm9maWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07CisJCQkJCWlmICh2U3lzTUxQcm9maWxlICE9IG51bGwpIHsKKwkJCQkJCVBhY2thZ2VVdGlsLmFwcGx5UHJvZmlsZShwTW9kZWwsIHZTeXNNTFByb2ZpbGUsIHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJfTsKIAotICAgICAgICAvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKLSAgICAgICAgaWYgKHZBcHBseVN5c01MUHJvZmlsZUNtZC5jYW5FeGVjdXRlKCkpIHsKLSAgICAgICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZAotICAgICAgICAgICAgdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZBcHBseVN5c01MUHJvZmlsZUNtZCk7Ci0gICAgICAgIH0KKwkJLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCisJCWlmICh2QXBwbHlTeXNNTFByb2ZpbGVDbWQuY2FuRXhlY3V0ZSgpKSB7CisJCQkvLyBFeGVjdXRlIGNvbW1hbmQKKwkJCXZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2QXBwbHlTeXNNTFByb2ZpbGVDbWQpOworCQl9CiAKLSAgICB9CisJfQogCiAKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBTU2FmZXR5UmVxdWlyZW1lbnQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwUGFja2FnZSBUaGUgcGFja2FnZSB3aGVyZSB0aGUgU1NhZmV0eVJlcXVpcmVtZW50IG11c3QgYmUgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTU2FmZXR5UmVxdWlyZW1lbnQoZmluYWwgUGFja2FnZSBwUGFja2FnZSkgewotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB2RG9tYWluID0gTW9kZWxVdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHBQYWNrYWdlKTsKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgU1NhZmV0eVJlcXVpcmVtZW50IGVsZW1lbnQuCisJICoKKwkgKiBAcGFyYW0gcFBhY2thZ2UgVGhlIHBhY2thZ2Ugd2hlcmUgdGhlIFNTYWZldHlSZXF1aXJlbWVudCBtdXN0IGJlIGNyZWF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50KGZpbmFsIFBhY2thZ2UgcFBhY2thZ2UpIHsKKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdkRvbWFpbiA9IE1vZGVsVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihwUGFja2FnZSk7CiAKLSAgICAgICAgUmVjb3JkaW5nQ29tbWFuZCB2QXBwbHlTU2FmZXR5UmVxdWlyZW1lbnRDbWQgPQotICAgICAgICAgICAgbmV3IFJlY29yZGluZ0NvbW1hbmQodkRvbWFpbiwgQ1JFQVRFX1NTQUZFVFlSRVFVSVJFTUVOVF9MQUJFTCkgeworCQlSZWNvcmRpbmdDb21tYW5kIHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZCA9CisJCQluZXcgUmVjb3JkaW5nQ29tbWFuZCh2RG9tYWluLCBDUkVBVEVfU1NBRkVUWVJFUVVJUkVNRU5UX0xBQkVMKSB7CiAKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2TmFtZSA9IFNTYWZldHlSZXF1aXJlbWVudC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyBwUGFja2FnZS5nZXRPd25lZEVsZW1lbnRzKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU1NhZmV0eVJlcXVpcmVtZW50IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdlNTYWZldHlSZXF1aXJlbWVudCA9IHBQYWNrYWdlLmNyZWF0ZU93bmVkQ2xhc3Modk5hbWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgJ1NTYWZldHlSZXF1aXJlbWVudCcgc3RlcmVvdHlwZSBvbiB0aGUgY3JlYXRlZCBjbGFzcwotICAgICAgICAgICAgICAgICAgICBVTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5nZXRJbnN0YW5jZSh2U1NhZmV0eVJlcXVpcmVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5U3RlcmVvdHlwZSh2U1NhZmV0eVJlcXVpcmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTYWZldHlSZXF1aXJlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgJ1JlcXVpcmVtZW50JyBzdGVyZW90eXBlIG9uIHRoZSBjcmVhdGVkIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIFVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKHZTU2FmZXR5UmVxdWlyZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwbHlTdGVyZW90eXBlKHZTU2FmZXR5UmVxdWlyZW1lbnQsIFJlcXVpcmVtZW50c1BhY2thZ2VJbXBsLmVJTlNUQU5DRS5nZXRSZXF1aXJlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKKwkJCQkJU3RyaW5nIHZOYW1lID0gU1NhZmV0eVJlcXVpcmVtZW50LmNsYXNzLmdldFNpbXBsZU5hbWUoKSArIHBQYWNrYWdlLmdldE93bmVkRWxlbWVudHMoKS5zaXplKCk7CisJCQkJCS8vIENyZWF0ZSBhIG5ldyBTU2FmZXR5UmVxdWlyZW1lbnQgZWxlbWVudAorCQkJCQlDbGFzcyB2U1NhZmV0eVJlcXVpcmVtZW50ID0gcFBhY2thZ2UuY3JlYXRlT3duZWRDbGFzcyh2TmFtZSwgZmFsc2UpOworCQkJCQkvLyBBcHBseSAnU1NhZmV0eVJlcXVpcmVtZW50JyBzdGVyZW90eXBlIG9uIHRoZSBjcmVhdGVkIGNsYXNzCisJCQkJCVVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKHZTU2FmZXR5UmVxdWlyZW1lbnQpCisJCQkJCQkuYXBwbHlTdGVyZW90eXBlKHZTU2FmZXR5UmVxdWlyZW1lbnQsCisJCQkJCQkJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkpOworCQkJCQkvLyBBcHBseSAnUmVxdWlyZW1lbnQnIHN0ZXJlb3R5cGUgb24gdGhlIGNyZWF0ZWQgY2xhc3MKKwkJCQkJVU1MVXRpbC5TdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UodlNTYWZldHlSZXF1aXJlbWVudCkKKwkJCQkJCS5hcHBseVN0ZXJlb3R5cGUodlNTYWZldHlSZXF1aXJlbWVudCwgUmVxdWlyZW1lbnRzUGFja2FnZUltcGwuZUlOU1RBTkNFLmdldFJlcXVpcmVtZW50KCkpOworCQkJCX0KKwkJCX07CiAKLSAgICAgICAgLy8gVmVyaWZ5IGlmIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCi0gICAgICAgIGlmICh2QXBwbHlTU2FmZXR5UmVxdWlyZW1lbnRDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKLSAgICAgICAgICAgIHZEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh2QXBwbHlTU2FmZXR5UmVxdWlyZW1lbnRDbWQpOwotICAgICAgICB9Ci0gICAgfQorCQkvLyBWZXJpZnkgaWYgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQKKwkJaWYgKHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZC5jYW5FeGVjdXRlKCkpIHsKKwkJCS8vIEV4ZWN1dGUgY29tbWFuZAorCQkJdkRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHZBcHBseVNTYWZldHlSZXF1aXJlbWVudENtZCk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL2Fib3V0Lmh0bWwgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMiBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDUsIDIwMDc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLzwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5qYXZhCmluZGV4IDljNDVlMWEuLmE5YmJkNzEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL0lFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5LmphdmEKQEAgLTIyLDM2ICsyMiwzNiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5Ci0gICAgZXh0ZW5kcyBFRmFjdG9yeSB7CisJZXh0ZW5kcyBFRmFjdG9yeSB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5IGVJTlNUQU5DRSA9Ci0gICAgICAgIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLmltcGwuRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5pbml0KCk7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBlSU5TVEFOQ0UgPQorCQlvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLkVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuaW5pdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TU2FmZXR5IFJlcXVpcmVtZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TU2FmZXR5IFJlcXVpcmVtZW50PC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJU1NhZmV0eVJlcXVpcmVtZW50IGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudCgpOworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSVNTYWZldHlSZXF1aXJlbWVudCBjcmVhdGVTU2FmZXR5UmVxdWlyZW1lbnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgZ2V0RVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgZ2V0RVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSgpOwogCiB9IC8vIElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL0lFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL0lFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmphdmEKaW5kZXggYTU2YmFhYi4uNmY5MTlmMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuamF2YQpAQCAtMzYsMjY1ICszNiwyNjUgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZQotICAgIGV4dGVuZHMgRVBhY2thZ2UgeworCWV4dGVuZHMgRVBhY2thZ2UgewogCi0gICAgLyoqCi0gICAgICogVGhlIHBhY2thZ2UgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5BTUUgPSAiZXNmc2FmZXR5cmVxdWlyZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImVzZnNhZmV0eXJlcXVpcmVtZW50cyI7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5wb2xhcnN5cy5vcmcvZXNmLzAuNy4wL0VTRlNhZmV0eVJlcXVpcmVtZW50cyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cucG9sYXJzeXMub3JnL2VzZi8wLjcuMC9FU0ZTYWZldHlSZXF1aXJlbWVudHMiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJFU0ZTYWZldHlSZXF1aXJlbWVudHMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAiRVNGU2FmZXR5UmVxdWlyZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqCi0gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBlSU5TVEFOQ0UgPQotICAgICAgICBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLkVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuaW5pdCgpOworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgZUlOU1RBTkNFID0KKwkJb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuaW1wbC5FU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmluaXQoKTsKIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuaW1wbC5TU2FmZXR5UmVxdWlyZW1lbnQgPGVtPlNTYWZldHkKLSAgICAgKiBSZXF1aXJlbWVudDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLmltcGwuU1NhZmV0eVJlcXVpcmVtZW50Ci0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLkVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UjZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFNTQUZFVFlfUkVRVUlSRU1FTlQgPSAwOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuaW1wbC5TU2FmZXR5UmVxdWlyZW1lbnQgPGVtPlNTYWZldHkKKwkgKiBSZXF1aXJlbWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLmltcGwuU1NhZmV0eVJlcXVpcmVtZW50CisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLkVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UjZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNTQUZFVFlfUkVRVUlSRU1FTlQgPSAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU0FGRVRZX1JFUVVJUkVNRU5UX19VVUlEID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NSRVFVSVJFTUVOVF9fVVVJRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVVJRDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTQUZFVFlfUkVRVUlSRU1FTlRfX1VVSUQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX19VVUlEOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU0FGRVRZX1JFUVVJUkVNRU5UX19OQU1FID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NSRVFVSVJFTUVOVF9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTQUZFVFlfUkVRVUlSRU1FTlRfX05BTUUgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX19OQU1FOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgU1NBRkVUWV9SRVFVSVJFTUVOVF9fREVTQ1JJUFRJT04gPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU0FGRVRZX1JFUVVJUkVNRU5UX19ERVNDUklQVElPTiA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfX0RFU0NSSVBUSU9OOwogCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNFbGVtZW50cyBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU0FGRVRZX1JFUVVJUkVNRU5UX19TRUxFTUVOVFNfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfX1NFTEVNRU5UU19MSVNUOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRWxlbWVudHMgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0VMRU1FTlRTX0xJU1QgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX19TRUxFTUVOVFNfTElTVDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTQUZFVFlfUkVRVUlSRU1FTlRfX0NSSVRJQ0FMSVRZID0gSUVTRkNvcmVQYWNrYWdlLkFCU1RSQUNUX1NSRVFVSVJFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU0FGRVRZX1JFUVVJUkVNRU5UX19DUklUSUNBTElUWSA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU0FGRVRZX1JFUVVJUkVNRU5UX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1QgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TRmFpbHVyZSBNb2RlcyBGTUVBIExpc3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTQUZFVFlfUkVRVUlSRU1FTlRfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1MgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1NBRkVUWV9SRVFVSVJFTUVOVF9fQkFTRV9DTEFTUyA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU0FGRVRZX1JFUVVJUkVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBJRVNGQ29yZVBhY2thZ2UuQUJTVFJBQ1RfU1JFUVVJUkVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TU2FmZXR5IFJlcXVpcmVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNTQUZFVFlfUkVRVUlSRU1FTlRfRkVBVFVSRV9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBTU0FGRVRZX1JFUVVJUkVNRU5UX09QRVJBVElPTl9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTU0FGRVRZX1JFUVVJUkVNRU5UX09QRVJBVElPTl9DT1VOVCA9IElFU0ZDb3JlUGFja2FnZS5BQlNUUkFDVF9TUkVRVUlSRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQgPGVtPlNTYWZldHkKLSAgICAgKiBSZXF1aXJlbWVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TU2FmZXR5IFJlcXVpcmVtZW50PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSVNTYWZldHlSZXF1aXJlbWVudAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSVNTYWZldHlSZXF1aXJlbWVudCA8ZW0+U1NhZmV0eQorCSAqIFJlcXVpcmVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNTYWZldHkgUmVxdWlyZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldENyaXRpY2FsaXR5IDxlbT5Dcml0aWNhbGl0eTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyaXRpY2FsaXR5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSVNTYWZldHlSZXF1aXJlbWVudCNnZXRDcml0aWNhbGl0eSgpCi0gICAgICogQHNlZSAjZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRTU2FmZXR5UmVxdWlyZW1lbnRfQ3JpdGljYWxpdHkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZQorCSAqICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSVNTYWZldHlSZXF1aXJlbWVudCNnZXRDcml0aWNhbGl0eSA8ZW0+Q3JpdGljYWxpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbGl0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQjZ2V0Q3JpdGljYWxpdHkoKQorCSAqIEBzZWUgI2dldFNTYWZldHlSZXF1aXJlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0NyaXRpY2FsaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0Ci0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCA8ZW0+U0ZhaWx1cmUgTW9kZXMKLSAgICAgKiBGTUVBIExpc3Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQjZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkKLSAgICAgKiBAc2VlICNnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0CisJICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCA8ZW0+U0ZhaWx1cmUgTW9kZXMKKwkgKiBGTUVBIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQjZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkKKwkgKiBAc2VlICNnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlCi0gICAgICogJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldEJhc2VfQ2xhc3MgPGVtPkJhc2UgQ2xhc3M8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5CYXNlIENsYXNzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSVNTYWZldHlSZXF1aXJlbWVudCNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAc2VlICNnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFUmVmZXJlbmNlIGdldFNTYWZldHlSZXF1aXJlbWVudF9CYXNlX0NsYXNzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UKKwkgKiAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZSBDbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldEJhc2VfQ2xhc3MoKQorCSAqIEBzZWUgI2dldFNTYWZldHlSZXF1aXJlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0Jhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5IGdldEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBnZXRFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KCk7CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiA8bGk+ZWFjaCBvcGVyYXRpb24gb2YgZWFjaCBjbGFzcyw8L2xpPgotICAgICAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAgICAgKiA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgTGl0ZXJhbHMgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLlNTYWZldHlSZXF1aXJlbWVudAotICAgICAgICAgKiA8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLlNTYWZldHlSZXF1aXJlbWVudAotICAgICAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLmltcGwuRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSNnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgU1NBRkVUWV9SRVFVSVJFTUVOVCA9IGVJTlNUQU5DRS5nZXRTU2FmZXR5UmVxdWlyZW1lbnQoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLlNTYWZldHlSZXF1aXJlbWVudAorCQkgKiA8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5pbXBsLlNTYWZldHlSZXF1aXJlbWVudAorCQkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLmltcGwuRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSNnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1NBRkVUWV9SRVFVSVJFTUVOVCA9IGVJTlNUQU5DRS5nZXRTU2FmZXR5UmVxdWlyZW1lbnQoKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFNTQUZFVFlfUkVRVUlSRU1FTlRfX0NSSVRJQ0FMSVRZID0gZUlOU1RBTkNFLmdldFNTYWZldHlSZXF1aXJlbWVudF9Dcml0aWNhbGl0eSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyaXRpY2FsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNTQUZFVFlfUkVRVUlSRU1FTlRfX0NSSVRJQ0FMSVRZID0gZUlOU1RBTkNFLmdldFNTYWZldHlSZXF1aXJlbWVudF9Dcml0aWNhbGl0eSgpOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVSZWZlcmVuY2UgU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUID0KLSAgICAgICAgICAgIGVJTlNUQU5DRS5nZXRTU2FmZXR5UmVxdWlyZW1lbnRfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUID0KKwkJCWVJTlNUQU5DRS5nZXRTU2FmZXR5UmVxdWlyZW1lbnRfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFUmVmZXJlbmNlIFNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0Jhc2VfQ2xhc3MoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0Jhc2VfQ2xhc3MoKTsKIAotICAgIH0KKwl9CiAKIH0gLy8gSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSVNTYWZldHlSZXF1aXJlbWVudC5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JU1NhZmV0eVJlcXVpcmVtZW50LmphdmEKaW5kZXggNWQ2MWIzNy4uOWZmNmZmMCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JU1NhZmV0eVJlcXVpcmVtZW50LmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JU1NhZmV0eVJlcXVpcmVtZW50LmphdmEKQEAgLTM2LDgyICszNiw4MiBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTU2FmZXR5UmVxdWlyZW1lbnQKLSAgICBleHRlbmRzIElBYnN0cmFjdFNSZXF1aXJlbWVudCB7CisJZXh0ZW5kcyBJQWJzdHJhY3RTUmVxdWlyZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRDcml0aWNhbGl0eShpbnQpCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSNnZXRTU2FmZXR5UmVxdWlyZW1lbnRfQ3JpdGljYWxpdHkoKQotICAgICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgKiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IGdldENyaXRpY2FsaXR5KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDcml0aWNhbGl0eShpbnQpCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSNnZXRTU2FmZXR5UmVxdWlyZW1lbnRfQ3JpdGljYWxpdHkoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKKwkgKiBvcmRlcmVkPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldENyaXRpY2FsaXR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldENyaXRpY2FsaXR5Ci0gICAgICogPGVtPkNyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q3JpdGljYWxpdHkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENyaXRpY2FsaXR5KGludCB2YWx1ZSk7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSVNTYWZldHlSZXF1aXJlbWVudCNnZXRDcml0aWNhbGl0eQorCSAqIDxlbT5Dcml0aWNhbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWxpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENyaXRpY2FsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDcml0aWNhbGl0eShpbnQgdmFsdWUpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U0ZhaWx1cmUgTW9kZXMgRk1FQSBMaXN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2ZmbWVhLklTRmFpbHVyZU1vZGVGTUVBfS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlI2dldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKQotICAgICAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IGdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmZm1lYS5JU0ZhaWx1cmVNb2RlRk1FQX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlcyBGTUVBIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TRmFpbHVyZSBNb2RlcyBGTUVBIExpc3Q8L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSNnZXRTU2FmZXR5UmVxdWlyZW1lbnRfU0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkKKwkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PElTRmFpbHVyZU1vZGVGTUVBPiBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0gICAgICogQHNlZSAjc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykKLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlI2dldFNTYWZldHlSZXF1aXJlbWVudF9CYXNlX0NsYXNzKCkKLSAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBnZXRCYXNlX0NsYXNzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKQorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UjZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0Jhc2VfQ2xhc3MoKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCW9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGdldEJhc2VfQ2xhc3MoKTsKIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQjZ2V0QmFzZV9DbGFzcyA8ZW0+QmFzZQotICAgICAqIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLSAgICAgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRCYXNlX0NsYXNzKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHZhbHVlKTsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50I2dldEJhc2VfQ2xhc3MgPGVtPkJhc2UKKwkgKiBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDbGFzczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmFzZV9DbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QmFzZV9DbGFzcyhvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyB2YWx1ZSk7CiAKIH0gLy8gSVNTYWZldHlSZXF1aXJlbWVudApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9pbXBsL0VTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5LmphdmEKaW5kZXggOTM2NDE5MS4uYzQ4OGRkMyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9pbXBsL0VTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL2ltcGwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5qYXZhCkBAIC0yOCw4OCArMjgsODggQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkKLSAgICBleHRlbmRzIEVGYWN0b3J5SW1wbAotICAgIGltcGxlbWVudHMgSUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkgeworCWV4dGVuZHMgRUZhY3RvcnlJbXBsCisJaW1wbGVtZW50cyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSB7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBpbml0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkgdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgKElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotICAgICAgICAgICAgICAgICAgICAuZ2V0RUZhY3RvcnkoSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1VSSSk7Ci0gICAgICAgICAgICBpZiAodGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoZUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3Rvcnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSgpOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJSUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkgdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSA9CisJCQkJKElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQorCQkJCQkuZ2V0RUZhY3RvcnkoSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1VSSSk7CisJCQlpZiAodGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3Rvcnk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSgpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLSAgICAgICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50KCk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlQ6CisJCQkJcmV0dXJuIGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudCgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJU1NhZmV0eVJlcXVpcmVtZW50IGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudCgpIHsKLSAgICAgICAgU1NhZmV0eVJlcXVpcmVtZW50IHNTYWZldHlSZXF1aXJlbWVudCA9IG5ldyBTU2FmZXR5UmVxdWlyZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIHNTYWZldHlSZXF1aXJlbWVudDsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTU2FmZXR5UmVxdWlyZW1lbnQgY3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50KCkgeworCQlTU2FmZXR5UmVxdWlyZW1lbnQgc1NhZmV0eVJlcXVpcmVtZW50ID0gbmV3IFNTYWZldHlSZXF1aXJlbWVudCgpOworCQlyZXR1cm4gc1NhZmV0eVJlcXVpcmVtZW50OworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBnZXRFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gKElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlKSBnZXRFUGFja2FnZSgpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgZ2V0RVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSgpIHsKKwkJcmV0dXJuIChJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBnZXRQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFOworCX0KIAogfSAvLyBFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL2ltcGwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9pbXBsL0VTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuamF2YQppbmRleCBjYjNmNmU3Li44MTMwNGM5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL2ltcGwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9FU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmphdmEKQEAgLTM3LDI5MCArMzcsMjkwIEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlCi0gICAgZXh0ZW5kcyBFUGFja2FnZUltcGwKLSAgICBpbXBsZW1lbnRzIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlIHsKKwlleHRlbmRzIEVQYWNrYWdlSW1wbAorCWltcGxlbWVudHMgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgewogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3MgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0gICAgICogcGFja2FnZSBVUkkgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotICAgICAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0gICAgICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLSAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotICAgICAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2ZzYWZldHlyZXF1aXJlbWVudHMuSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UjZU5TX1VSSQotICAgICAqIEBzZWUgI2luaXQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UoKSB7Ci0gICAgICAgIHN1cGVyKGVOU19VUkksIElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5LmVJTlNUQU5DRSk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPgorCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlKCkgeworCQlzdXBlcihlTlNfVVJJLCBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgaW5pdCgpIHsKLSAgICAgICAgaWYgKGlzSW5pdGVkKQotICAgICAgICAgICAgcmV0dXJuIChJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLSAgICAgICAgICAgICAgICAuZ2V0RVBhY2thZ2UoSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1VSSSk7CisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkKKwkJCXJldHVybiAoSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCisJCQkJLmdldEVQYWNrYWdlKElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmVOU19VUkkpOwogCi0gICAgICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLSAgICAgICAgRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSB0aGVFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlID0KLSAgICAgICAgICAgIChFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLSAgICAgICAgICAgICAgICAuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZQotICAgICAgICAgICAgICAgICAgICA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKQotICAgICAgICAgICAgICAgICAgICA6IG5ldyBFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlKCkpOworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSA9CisJCQkoRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCisJCQkJLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UKKwkJCQkJPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkKKwkJCQkJOiBuZXcgRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSgpKTsKIAotICAgICAgICBpc0luaXRlZCA9IHRydWU7CisJCWlzSW5pdGVkID0gdHJ1ZTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLSAgICAgICAgSUVTRkZNRUFQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUlFU0ZGTUVBUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0gICAgICAgIHRoZUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5mcmVlemUoKTsKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmZyZWV6ZSgpOwogCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotICAgICAgICBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZU5TX1VSSSwgdGhlRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSk7Ci0gICAgICAgIHJldHVybiB0aGVFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlOwotICAgIH0KKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lTlNfVVJJLCB0aGVFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTU2FmZXR5UmVxdWlyZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkgeworCQlyZXR1cm4gc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNTYWZldHlSZXF1aXJlbWVudF9Dcml0aWNhbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0NyaXRpY2FsaXR5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNTYWZldHlSZXF1aXJlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSkgc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U1NhZmV0eVJlcXVpcmVtZW50X0Jhc2VfQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNTYWZldHlSZXF1aXJlbWVudF9CYXNlX0NsYXNzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNTYWZldHlSZXF1aXJlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBnZXRFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBnZXRFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KCkgeworCQlyZXR1cm4gKElFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzQ3JlYXRlZCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaXNDcmVhdGVkID0gdHJ1ZTsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpCisJCQlyZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CiAKLSAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgICAgIHNTYWZldHlSZXF1aXJlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTU0FGRVRZX1JFUVVJUkVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3MsIFNTQUZFVFlfUkVRVUlSRU1FTlRfX0NSSVRJQ0FMSVRZKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3MsIFNTQUZFVFlfUkVRVUlSRU1FTlRfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLCBTU0FGRVRZX1JFUVVJUkVNRU5UX19CQVNFX0NMQVNTKTsKLSAgICB9CisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1NBRkVUWV9SRVFVSVJFTUVOVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLCBTU0FGRVRZX1JFUVVJUkVNRU5UX19DUklUSUNBTElUWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLCBTU0FGRVRZX1JFUVVJUkVNRU5UX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKHNTYWZldHlSZXF1aXJlbWVudEVDbGFzcywgU1NBRkVUWV9SRVFVSVJFTUVOVF9fQkFTRV9DTEFTUyk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwogCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gVGhpcwotICAgICAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKQorCQkJcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UKLSAgICAgICAgc2V0TmFtZShlTkFNRSk7Ci0gICAgICAgIHNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotICAgICAgICBzZXROc1VSSShlTlNfVVJJKTsKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CiAKLSAgICAgICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotICAgICAgICBJRVNGQ29yZVBhY2thZ2UgdGhlRVNGQ29yZVBhY2thZ2UgPQotICAgICAgICAgICAgKElFU0ZDb3JlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSUVTRkNvcmVQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBUeXBlc1BhY2thZ2UgdGhlVHlwZXNQYWNrYWdlID0gKFR5cGVzUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHlwZXNQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBJRVNGRk1FQVBhY2thZ2UgdGhlRVNGRk1FQVBhY2thZ2UgPQotICAgICAgICAgICAgKElFU0ZGTUVBUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSUVTRkZNRUFQYWNrYWdlLmVOU19VUkkpOwotICAgICAgICBVTUxQYWNrYWdlIHRoZVVNTFBhY2thZ2UgPSAoVU1MUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVU1MUGFja2FnZS5lTlNfVVJJKTsKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlJRVNGQ29yZVBhY2thZ2UgdGhlRVNGQ29yZVBhY2thZ2UgPQorCQkJKElFU0ZDb3JlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSUVTRkNvcmVQYWNrYWdlLmVOU19VUkkpOworCQlUeXBlc1BhY2thZ2UgdGhlVHlwZXNQYWNrYWdlID0gKFR5cGVzUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHlwZXNQYWNrYWdlLmVOU19VUkkpOworCQlJRVNGRk1FQVBhY2thZ2UgdGhlRVNGRk1FQVBhY2thZ2UgPQorCQkJKElFU0ZGTUVBUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSUVTRkZNRUFQYWNrYWdlLmVOU19VUkkpOworCQlVTUxQYWNrYWdlIHRoZVVNTFBhY2thZ2UgPSAoVU1MUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVU1MUGFja2FnZS5lTlNfVVJJKTsKIAotICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKIAotICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLSAgICAgICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotICAgICAgICBzU2FmZXR5UmVxdWlyZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRVNGQ29yZVBhY2thZ2UuZ2V0QWJzdHJhY3RTUmVxdWlyZW1lbnQoKSk7CisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVTRkNvcmVQYWNrYWdlLmdldEFic3RyYWN0U1JlcXVpcmVtZW50KCkpOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycwotICAgICAgICBpbml0RUNsYXNzKAotICAgICAgICAgICAgc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLAotICAgICAgICAgICAgSVNTYWZldHlSZXF1aXJlbWVudC5jbGFzcywKLSAgICAgICAgICAgICJTU2FmZXR5UmVxdWlyZW1lbnQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAhSVNfQUJTVFJBQ1QsCi0gICAgICAgICAgICAhSVNfSU5URVJGQUNFLAotICAgICAgICAgICAgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoCi0gICAgICAgICAgICBnZXRTU2FmZXR5UmVxdWlyZW1lbnRfQ3JpdGljYWxpdHkoKSwKLSAgICAgICAgICAgIHRoZVR5cGVzUGFja2FnZS5nZXRJbnRlZ2VyKCksCi0gICAgICAgICAgICAiY3JpdGljYWxpdHkiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBJU1NhZmV0eVJlcXVpcmVtZW50LmNsYXNzLAotICAgICAgICAgICAgSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX1VOU0VUVEFCTEUsCi0gICAgICAgICAgICAhSVNfSUQsCi0gICAgICAgICAgICBJU19VTklRVUUsCi0gICAgICAgICAgICBJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKSwKLSAgICAgICAgICAgIHRoZUVTRkZNRUFQYWNrYWdlLmdldFNGYWlsdXJlTW9kZUZNRUEoKSwKLSAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAic0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAtMSwKLSAgICAgICAgICAgIElTU2FmZXR5UmVxdWlyZW1lbnQuY2xhc3MsCi0gICAgICAgICAgICAhSVNfVFJBTlNJRU5ULAotICAgICAgICAgICAgIUlTX1ZPTEFUSUxFLAotICAgICAgICAgICAgSVNfQ0hBTkdFQUJMRSwKLSAgICAgICAgICAgICFJU19DT01QT1NJVEUsCi0gICAgICAgICAgICBJU19SRVNPTFZFX1BST1hJRVMsCi0gICAgICAgICAgICAhSVNfVU5TRVRUQUJMRSwKLSAgICAgICAgICAgIElTX1VOSVFVRSwKLSAgICAgICAgICAgICFJU19ERVJJVkVELAotICAgICAgICAgICAgIUlTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZSgKLSAgICAgICAgICAgIGdldFNTYWZldHlSZXF1aXJlbWVudF9CYXNlX0NsYXNzKCksCi0gICAgICAgICAgICB0aGVVTUxQYWNrYWdlLmdldENsYXNzXygpLAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICJiYXNlX0NsYXNzIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgSVNTYWZldHlSZXF1aXJlbWVudC5jbGFzcywKLSAgICAgICAgICAgICFJU19UUkFOU0lFTlQsCi0gICAgICAgICAgICAhSVNfVk9MQVRJTEUsCi0gICAgICAgICAgICBJU19DSEFOR0VBQkxFLAotICAgICAgICAgICAgIUlTX0NPTVBPU0lURSwKLSAgICAgICAgICAgIElTX1JFU09MVkVfUFJPWElFUywKLSAgICAgICAgICAgICFJU19VTlNFVFRBQkxFLAotICAgICAgICAgICAgSVNfVU5JUVVFLAotICAgICAgICAgICAgIUlTX0RFUklWRUQsCi0gICAgICAgICAgICAhSVNfT1JERVJFRCk7CisJCS8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKAorCQkJc1NhZmV0eVJlcXVpcmVtZW50RUNsYXNzLAorCQkJSVNTYWZldHlSZXF1aXJlbWVudC5jbGFzcywKKwkJCSJTU2FmZXR5UmVxdWlyZW1lbnQiLCAvLyROT04tTkxTLTEkCisJCQkhSVNfQUJTVFJBQ1QsCisJCQkhSVNfSU5URVJGQUNFLAorCQkJSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoCisJCQlnZXRTU2FmZXR5UmVxdWlyZW1lbnRfQ3JpdGljYWxpdHkoKSwKKwkJCXRoZVR5cGVzUGFja2FnZS5nZXRJbnRlZ2VyKCksCisJCQkiY3JpdGljYWxpdHkiLCAvLyROT04tTkxTLTEkCisJCQludWxsLAorCQkJMSwKKwkJCTEsCisJCQlJU1NhZmV0eVJlcXVpcmVtZW50LmNsYXNzLAorCQkJSVNfVFJBTlNJRU5ULAorCQkJSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX1VOU0VUVEFCTEUsCisJCQkhSVNfSUQsCisJCQlJU19VTklRVUUsCisJCQlJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTYWZldHlSZXF1aXJlbWVudF9TRmFpbHVyZU1vZGVzRk1FQUxpc3QoKSwKKwkJCXRoZUVTRkZNRUFQYWNrYWdlLmdldFNGYWlsdXJlTW9kZUZNRUEoKSwKKwkJCW51bGwsCisJCQkic0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0IiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTAsCisJCQktMSwKKwkJCUlTU2FmZXR5UmVxdWlyZW1lbnQuY2xhc3MsCisJCQkhSVNfVFJBTlNJRU5ULAorCQkJIUlTX1ZPTEFUSUxFLAorCQkJSVNfQ0hBTkdFQUJMRSwKKwkJCSFJU19DT01QT1NJVEUsCisJCQlJU19SRVNPTFZFX1BST1hJRVMsCisJCQkhSVNfVU5TRVRUQUJMRSwKKwkJCUlTX1VOSVFVRSwKKwkJCSFJU19ERVJJVkVELAorCQkJIUlTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZSgKKwkJCWdldFNTYWZldHlSZXF1aXJlbWVudF9CYXNlX0NsYXNzKCksCisJCQl0aGVVTUxQYWNrYWdlLmdldENsYXNzXygpLAorCQkJbnVsbCwKKwkJCSJiYXNlX0NsYXNzIiwgLy8kTk9OLU5MUy0xJAorCQkJbnVsbCwKKwkJCTEsCisJCQkxLAorCQkJSVNTYWZldHlSZXF1aXJlbWVudC5jbGFzcywKKwkJCSFJU19UUkFOU0lFTlQsCisJCQkhSVNfVk9MQVRJTEUsCisJCQlJU19DSEFOR0VBQkxFLAorCQkJIUlTX0NPTVBPU0lURSwKKwkJCUlTX1JFU09MVkVfUFJPWElFUywKKwkJCSFJU19VTlNFVFRBQkxFLAorCQkJSVNfVU5JUVVFLAorCQkJIUlTX0RFUklWRUQsCisJCQkhSVNfT1JERVJFRCk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CiAKLSAgICAgICAgLy8gQ3JlYXRlIGFubm90YXRpb25zCi0gICAgICAgIC8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwKLSAgICAgICAgY3JlYXRlVU1MQW5ub3RhdGlvbnMoKTsKLSAgICB9CisJCS8vIENyZWF0ZSBhbm5vdGF0aW9ucworCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MCisJCWNyZWF0ZVVNTEFubm90YXRpb25zKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MPC9iPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVTUxBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRBbm5vdGF0aW9uKHRoaXMsIHNvdXJjZSwgbmV3IFN0cmluZ1tdIHsib3JpZ2luYWxOYW1lIiwgIkVTRlNhZmV0eVJlcXVpcmVtZW50cyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0pOwotICAgIH0KKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUw8L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVVNTEFubm90YXRpb25zKCkgeworCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiOyAvLyROT04tTkxTLTEkCisJCWFkZEFubm90YXRpb24odGhpcywgc291cmNlLCBuZXcgU3RyaW5nW10geyJvcmlnaW5hbE5hbWUiLCAiRVNGU2FmZXR5UmVxdWlyZW1lbnRzIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfSk7CisJfQogCiB9IC8vIEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9TU2FmZXR5UmVxdWlyZW1lbnQuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9TU2FmZXR5UmVxdWlyZW1lbnQuamF2YQppbmRleCAzOWM2MzA2Li44NmUxMTI5IDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL2ltcGwvU1NhZmV0eVJlcXVpcmVtZW50LmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9pbXBsL1NTYWZldHlSZXF1aXJlbWVudC5qYXZhCkBAIC00NywyNDAgKzQ3LDI0MCBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgU1NhZmV0eVJlcXVpcmVtZW50Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdFNSZXF1aXJlbWVudAotICAgIGltcGxlbWVudHMgSVNTYWZldHlSZXF1aXJlbWVudCB7CisJZXh0ZW5kcyBBYnN0cmFjdFNSZXF1aXJlbWVudAorCWltcGxlbWVudHMgSVNTYWZldHlSZXF1aXJlbWVudCB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxpdHkoKSA8ZW0+Q3JpdGljYWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBzZWUgI2dldENyaXRpY2FsaXR5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUklUSUNBTElUWV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRpY2FsaXR5KCkgPGVtPkNyaXRpY2FsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRDcml0aWNhbGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JJVElDQUxJVFlfRURFRkFVTFQgPSAwOwogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkgPGVtPlNGYWlsdXJlIE1vZGVzIEZNRUEgTGlzdDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gc0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpIDxlbT5TRmFpbHVyZSBNb2RlcyBGTUVBIExpc3Q8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IHNGYWlsdXJlTW9kZXNGTUVBTGlzdDsKIAotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VfQ2xhc3MoKSA8ZW0+QmFzZSBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0QmFzZV9DbGFzcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2VfQ2xhc3M7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZV9DbGFzcygpIDxlbT5CYXNlIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRCYXNlX0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgYmFzZV9DbGFzczsKIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTU2FmZXR5UmVxdWlyZW1lbnQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTU2FmZXR5UmVxdWlyZW1lbnQoKSB7CisJCXN1cGVyKCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5MaXRlcmFscy5TU0FGRVRZX1JFUVVJUkVNRU5UOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLkxpdGVyYWxzLlNTQUZFVFlfUkVRVUlSRU1FTlQ7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDcml0aWNhbGl0eSgpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0NyaXRpY2FsaXR5JyBhdHRyaWJ1dGUKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q3JpdGljYWxpdHkoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICdDcml0aWNhbGl0eScgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENyaXRpY2FsaXR5KGludCBuZXdDcml0aWNhbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnQ3JpdGljYWxpdHknIGF0dHJpYnV0ZQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3JpdGljYWxpdHkoaW50IG5ld0NyaXRpY2FsaXR5KSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICdDcml0aWNhbGl0eScgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkgewotICAgICAgICBpZiAoc0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNGYWlsdXJlTW9kZXNGTUVBTGlzdCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+KAotICAgICAgICAgICAgICAgIElTRmFpbHVyZU1vZGVGTUVBLmNsYXNzLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0OwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SVNGYWlsdXJlTW9kZUZNRUE+IGdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpIHsKKwkJaWYgKHNGYWlsdXJlTW9kZXNGTUVBTGlzdCA9PSBudWxsKSB7CisJCQlzRmFpbHVyZU1vZGVzRk1FQUxpc3QgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PElTRmFpbHVyZU1vZGVGTUVBPigKKwkJCQlJU0ZhaWx1cmVNb2RlRk1FQS5jbGFzcywKKwkJCQl0aGlzLAorCQkJCUlFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVCk7CisJCX0KKwkJcmV0dXJuIHNGYWlsdXJlTW9kZXNGTUVBTGlzdDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgZ2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgaWYgKGJhc2VfQ2xhc3MgIT0gbnVsbCAmJiBiYXNlX0NsYXNzLmVJc1Byb3h5KCkpIHsKLSAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRCYXNlX0NsYXNzID0gKEludGVybmFsRU9iamVjdCkgYmFzZV9DbGFzczsKLSAgICAgICAgICAgIGJhc2VfQ2xhc3MgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIGVSZXNvbHZlUHJveHkob2xkQmFzZV9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYmFzZV9DbGFzcyAhPSBvbGRCYXNlX0NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fQkFTRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX0NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfQ2xhc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZV9DbGFzczsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGdldEJhc2VfQ2xhc3MoKSB7CisJCWlmIChiYXNlX0NsYXNzICE9IG51bGwgJiYgYmFzZV9DbGFzcy5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZV9DbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpIGJhc2VfQ2xhc3M7CisJCQliYXNlX0NsYXNzID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBlUmVzb2x2ZVByb3h5KG9sZEJhc2VfQ2xhc3MpOworCQkJaWYgKGJhc2VfQ2xhc3MgIT0gb2xkQmFzZV9DbGFzcykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeSgKKwkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAorCQkJCQkJCUlFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1MsCisJCQkJCQkJb2xkQmFzZV9DbGFzcywKKwkJCQkJCQliYXNlX0NsYXNzKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhc2VfQ2xhc3M7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIGJhc2ljR2V0QmFzZV9DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBiYXNpY0dldEJhc2VfQ2xhc3MoKSB7CisJCXJldHVybiBiYXNlX0NsYXNzOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgewotICAgICAgICBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKLSAgICAgICAgYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkoCi0gICAgICAgICAgICAgICAgbmV3IEVOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uU0VULAotICAgICAgICAgICAgICAgICAgICBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19CQVNFX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICBvbGRCYXNlX0NsYXNzLAotICAgICAgICAgICAgICAgICAgICBiYXNlX0NsYXNzKSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2VfQ2xhc3Mob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MgbmV3QmFzZV9DbGFzcykgeworCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBvbGRCYXNlX0NsYXNzID0gYmFzZV9DbGFzczsKKwkJYmFzZV9DbGFzcyA9IG5ld0Jhc2VfQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkoCisJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAorCQkJCQl0aGlzLAorCQkJCQlOb3RpZmljYXRpb24uU0VULAorCQkJCQlJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19CQVNFX0NMQVNTLAorCQkJCQlvbGRCYXNlX0NsYXNzLAorCQkJCQliYXNlX0NsYXNzKSk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19DUklUSUNBTElUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3JpdGljYWxpdHkoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKTsKLSAgICAgICAgICAgIGNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJhc2VfQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRCYXNlX0NsYXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fQ1JJVElDQUxJVFk6CisJCQkJcmV0dXJuIGdldENyaXRpY2FsaXR5KCk7CisJCQljYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVDoKKwkJCQlyZXR1cm4gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJCQljYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1M6CisJCQkJaWYgKHJlc29sdmUpCisJCQkJCXJldHVybiBnZXRCYXNlX0NsYXNzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFzZV9DbGFzcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0NSSVRJQ0FMSVRZOgotICAgICAgICAgICAgICAgIHNldENyaXRpY2FsaXR5KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRTRmFpbHVyZU1vZGVzRk1FQUxpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTRmFpbHVyZU1vZGVGTUVBPikgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fQkFTRV9DTEFTUzoKLSAgICAgICAgICAgICAgICBzZXRCYXNlX0NsYXNzKChvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcykgbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19DUklUSUNBTElUWToKKwkJCQlzZXRDcml0aWNhbGl0eSgoSW50ZWdlcikgbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUOgorCQkJCWdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpLmNsZWFyKCk7CisJCQkJZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU0ZhaWx1cmVNb2RlRk1FQT4pIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1M6CisJCQkJc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19DUklUSUNBTElUWToKLSAgICAgICAgICAgICAgICBzZXRDcml0aWNhbGl0eShDUklUSUNBTElUWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1Q6Ci0gICAgICAgICAgICAgICAgZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1M6Ci0gICAgICAgICAgICAgICAgc2V0QmFzZV9DbGFzcygob3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MpIG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fQ1JJVElDQUxJVFk6CisJCQkJc2V0Q3JpdGljYWxpdHkoQ1JJVElDQUxJVFlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fU0ZBSUxVUkVfTU9ERVNfRk1FQV9MSVNUOgorCQkJCWdldFNGYWlsdXJlTW9kZXNGTUVBTGlzdCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19CQVNFX0NMQVNTOgorCQkJCXNldEJhc2VfQ2xhc3MoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzKSBudWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQogCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuU1NBRkVUWV9SRVFVSVJFTUVOVF9fQ1JJVElDQUxJVFk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENyaXRpY2FsaXR5KCkgIT0gQ1JJVElDQUxJVFlfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX1NGQUlMVVJFX01PREVTX0ZNRUFfTElTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0ICE9IG51bGwgJiYgIXNGYWlsdXJlTW9kZXNGTUVBTGlzdC5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0JBU0VfQ0xBU1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VfQ2xhc3MgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlRfX0NSSVRJQ0FMSVRZOgorCQkJCXJldHVybiBnZXRDcml0aWNhbGl0eSgpICE9IENSSVRJQ0FMSVRZX0VERUZBVUxUOworCQkJY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19TRkFJTFVSRV9NT0RFU19GTUVBX0xJU1Q6CisJCQkJcmV0dXJuIHNGYWlsdXJlTW9kZXNGTUVBTGlzdCAhPSBudWxsICYmICFzRmFpbHVyZU1vZGVzRk1FQUxpc3QuaXNFbXB0eSgpOworCQkJY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UX19CQVNFX0NMQVNTOgorCQkJCXJldHVybiBiYXNlX0NsYXNzICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KIAogfSAvLyBTU2FmZXR5UmVxdWlyZW1lbnQKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvdXRpbC9FU0ZTYWZldHlSZXF1aXJlbWVudHNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy91dGlsL0VTRlNhZmV0eVJlcXVpcmVtZW50c0FkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggYmMxZGIxMC4uOWNjZDMyYiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy91dGlsL0VTRlNhZmV0eVJlcXVpcmVtZW50c0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy91dGlsL0VTRlNhZmV0eVJlcXVpcmVtZW50c0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTMyLDE1NCArMzIsMTU0IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZTYWZldHlSZXF1aXJlbWVudHNBZGFwdGVyRmFjdG9yeQotICAgIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwlleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBtb2RlbFBhY2thZ2U7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UgbW9kZWxQYWNrYWdlOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFU0ZTYWZldHlSZXF1aXJlbWVudHNBZGFwdGVyRmFjdG9yeSgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFU0ZTYWZldHlSZXF1aXJlbWVudHNBZGFwdGVyRmFjdG9yeSgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZQotICAgICAqIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2UKKwkgKiBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFU0ZTYWZldHlSZXF1aXJlbWVudHNTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPSBuZXcgRVNGU2FmZXR5UmVxdWlyZW1lbnRzU3dpdGNoPEFkYXB0ZXI+KCkgeworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRVNGU2FmZXR5UmVxdWlyZW1lbnRzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IEVTRlNhZmV0eVJlcXVpcmVtZW50c1N3aXRjaDxBZGFwdGVyPigpIHsKIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVNTYWZldHlSZXF1aXJlbWVudChJU1NhZmV0eVJlcXVpcmVtZW50IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudEFkYXB0ZXIoKTsKLSAgICAgICAgfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZVNTYWZldHlSZXF1aXJlbWVudChJU1NhZmV0eVJlcXVpcmVtZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudEFkYXB0ZXIoKTsKKwkJfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTRWxlbWVudChJQWJzdHJhY3RTRWxlbWVudCBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpOwotICAgICAgICB9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlQWJzdHJhY3RTRWxlbWVudChJQWJzdHJhY3RTRWxlbWVudCBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpOworCQl9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNSZXF1aXJlbWVudChJQWJzdHJhY3RTUmVxdWlyZW1lbnQgb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWJzdHJhY3RTUmVxdWlyZW1lbnRBZGFwdGVyKCk7Ci0gICAgICAgIH0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VBYnN0cmFjdFNSZXF1aXJlbWVudChJQWJzdHJhY3RTUmVxdWlyZW1lbnQgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlQWJzdHJhY3RTUmVxdWlyZW1lbnRBZGFwdGVyKCk7CisJCX0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotICAgICAgICB9Ci0gICAgfTsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJfQorCX07CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotICAgICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotICAgICAgICByZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQKLSAgICAgKiA8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5wb2xhcnN5cy5lc2YuZXNmc2FmZXR5cmVxdWlyZW1lbnRzLklTU2FmZXR5UmVxdWlyZW1lbnQKKwkgKiA8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZnNhZmV0eXJlcXVpcmVtZW50cy5JU1NhZmV0eVJlcXVpcmVtZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNFbGVtZW50IDxlbT5BYnN0cmFjdAotICAgICAqIFNFbGVtZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTRWxlbWVudAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNFbGVtZW50IDxlbT5BYnN0cmFjdAorCSAqIFNFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5wb2xhcnN5cy5lc2YuZXNmY29yZS5JQWJzdHJhY3RTRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1JlcXVpcmVtZW50IDxlbT5BYnN0cmFjdAotICAgICAqIFNSZXF1aXJlbWVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcucG9sYXJzeXMuZXNmLmVzZmNvcmUuSUFic3RyYWN0U1JlcXVpcmVtZW50Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFic3RyYWN0U1JlcXVpcmVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNSZXF1aXJlbWVudCA8ZW0+QWJzdHJhY3QKKwkgKiBTUmVxdWlyZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLnBvbGFyc3lzLmVzZi5lc2Zjb3JlLklBYnN0cmFjdFNSZXF1aXJlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnN0cmFjdFNSZXF1aXJlbWVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KIAogfSAvLyBFU0ZTYWZldHlSZXF1aXJlbWVudHNBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy91dGlsL0VTRlNhZmV0eVJlcXVpcmVtZW50c1N3aXRjaC5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMtZ2VuL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy91dGlsL0VTRlNhZmV0eVJlcXVpcmVtZW50c1N3aXRjaC5qYXZhCmluZGV4IDIxMzdkZjIuLmQzNmRhNmYgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjLWdlbi9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvdXRpbC9FU0ZTYWZldHlSZXF1aXJlbWVudHNTd2l0Y2guamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy1nZW4vbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL3V0aWwvRVNGU2FmZXR5UmVxdWlyZW1lbnRzU3dpdGNoLmphdmEKQEAgLTM1LDEzNSArMzUsMTM1IEBACiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZTYWZldHlSZXF1aXJlbWVudHNTd2l0Y2g8VD4KLSAgICBleHRlbmRzIFN3aXRjaDxUPiB7CisJZXh0ZW5kcyBTd2l0Y2g8VD4gewogCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBtb2RlbFBhY2thZ2U7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZSBtb2RlbFBhY2thZ2U7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVTRlNhZmV0eVJlcXVpcmVtZW50c1N3aXRjaCgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICB9CisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFU0ZTYWZldHlSZXF1aXJlbWVudHNTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gSUVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZVBhY2thZ2UgdGhlIHBhY2thZ2UgaW4gcXVlc3Rpb24uCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N3aXRjaEZvcihFUGFja2FnZSBlUGFja2FnZSkgewotICAgICAgICByZXR1cm4gZVBhY2thZ2UgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGlzIGEgc3dpdGNoIGZvciB0aGUgZ2l2ZW4gcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBlUGFja2FnZSB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbi4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzU3dpdGNoRm9yKEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCXJldHVybiBlUGFja2FnZSA9PSBtb2RlbFBhY2thZ2U7CisJfQogCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdAotICAgICAqIHJlc3VsdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotICAgICAgICBzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotICAgICAgICAgICAgY2FzZSBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5TU0FGRVRZX1JFUVVJUkVNRU5UOiB7Ci0gICAgICAgICAgICAgICAgSVNTYWZldHlSZXF1aXJlbWVudCBzU2FmZXR5UmVxdWlyZW1lbnQgPSAoSVNTYWZldHlSZXF1aXJlbWVudCkgdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VTU2FmZXR5UmVxdWlyZW1lbnQoc1NhZmV0eVJlcXVpcmVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhc2VBYnN0cmFjdFNSZXF1aXJlbWVudChzU2FmZXR5UmVxdWlyZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FzZUFic3RyYWN0U0VsZW1lbnQoc1NhZmV0eVJlcXVpcmVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0CisJICogcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLlNTQUZFVFlfUkVRVUlSRU1FTlQ6IHsKKwkJCQlJU1NhZmV0eVJlcXVpcmVtZW50IHNTYWZldHlSZXF1aXJlbWVudCA9IChJU1NhZmV0eVJlcXVpcmVtZW50KSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNTYWZldHlSZXF1aXJlbWVudChzU2FmZXR5UmVxdWlyZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUFic3RyYWN0U1JlcXVpcmVtZW50KHNTYWZldHlSZXF1aXJlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlQWJzdHJhY3RTRWxlbWVudChzU2FmZXR5UmVxdWlyZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1NhZmV0eSBSZXF1aXJlbWVudDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNTYWZldHkgUmVxdWlyZW1lbnQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VTU2FmZXR5UmVxdWlyZW1lbnQoSVNTYWZldHlSZXF1aXJlbWVudCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNTYWZldHkgUmVxdWlyZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TU2FmZXR5IFJlcXVpcmVtZW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU1NhZmV0eVJlcXVpcmVtZW50KElTU2FmZXR5UmVxdWlyZW1lbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNFbGVtZW50PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0VsZW1lbnQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VBYnN0cmFjdFNFbGVtZW50KElBYnN0cmFjdFNFbGVtZW50IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzdHJhY3QgU0VsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnN0cmFjdCBTRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U0VsZW1lbnQoSUFic3RyYWN0U0VsZW1lbnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNSZXF1aXJlbWVudDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNSZXF1aXJlbWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUFic3RyYWN0U1JlcXVpcmVtZW50KElBYnN0cmFjdFNSZXF1aXJlbWVudCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNSZXF1aXJlbWVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFic3RyYWN0IFNSZXF1aXJlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFic3RyYWN0U1JlcXVpcmVtZW50KElBYnN0cmFjdFNSZXF1aXJlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CiAKIH0gLy8gRVNGU2FmZXR5UmVxdWlyZW1lbnRzU3dpdGNoCmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5LmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5LmphdmEKaW5kZXggNjhlNmZjMi4uM2I2MjcxZCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL0lNRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9JTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuamF2YQpAQCAtMTksMTQgKzE5LDE0IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5Ci0gICAgZXh0ZW5kcyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSB7CisJZXh0ZW5kcyBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSB7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWFsaXNlIHRoZSBlSU5TVEFOQ0UgaW5pdGlhbGlzYXRpb24gd2l0aCB0aGUgbmV3IGludGVyZmFjZSB0eXBlCi0gICAgICogKG92ZXJyaWRkZW4gaW4gdGhlIG92ZXJyaWRlX2ZhY3RvcnkgZXh0ZW5zaW9uKS4KLSAgICAgKi8KLSAgICBJTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkgSU5TVEFOQ0UgPSBNRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5pbml0KCk7CisJLyoqCisJICogU3BlY2lhbGlzZSB0aGUgZUlOU1RBTkNFIGluaXRpYWxpc2F0aW9uIHdpdGggdGhlIG5ldyBpbnRlcmZhY2UgdHlwZQorCSAqIChvdmVycmlkZGVuIGluIHRoZSBvdmVycmlkZV9mYWN0b3J5IGV4dGVuc2lvbikuCisJICovCisJSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5IElOU1RBTkNFID0gTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuaW5pdCgpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgSVNTYWZldHlSZXF1aXJlbWVudCBjcmVhdGVTU2FmZXR5UmVxdWlyZW1lbnQoKTsKKwlAT3ZlcnJpZGUKKwlJU1NhZmV0eVJlcXVpcmVtZW50IGNyZWF0ZVNTYWZldHlSZXF1aXJlbWVudCgpOwogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL0lNU1NhZmV0eVJlcXVpcmVtZW50LmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSU1TU2FmZXR5UmVxdWlyZW1lbnQuamF2YQppbmRleCBiMzNiYmVhLi43NDE3NTQxIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSU1TU2FmZXR5UmVxdWlyZW1lbnQuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvSU1TU2FmZXR5UmVxdWlyZW1lbnQuamF2YQpAQCAtMTgsNiArMTgsNiBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzYgJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNU1NhZmV0eVJlcXVpcmVtZW50Ci0gICAgZXh0ZW5kcyBJU1NhZmV0eVJlcXVpcmVtZW50IHsKKwlleHRlbmRzIElTU2FmZXR5UmVxdWlyZW1lbnQgewogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9NRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL2ltcGwvTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuamF2YQppbmRleCBjMmU0Zjc5Li5mMGI3ZmViIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9NRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeS5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9pbXBsL01FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5LmphdmEKQEAgLTIyLDM0ICsyMiwzNCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkKLSAgICBleHRlbmRzIEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkKLSAgICBpbXBsZW1lbnRzIElNRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSB7CisJZXh0ZW5kcyBFU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5CisJaW1wbGVtZW50cyBJTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGluaXRpYWxpc2VkIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElNRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBpbml0KCkgewotICAgICAgICBJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSB2RmFjdG9yeSA9IEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuaW5pdCgpOworCS8qKgorCSAqIEByZXR1cm4gVGhlIGluaXRpYWxpc2VkIGZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElNRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSBpbml0KCkgeworCQlJRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSB2RmFjdG9yeSA9IEVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkuaW5pdCgpOwogCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmYWN0b3J5IHJldHVybmVkIGJ5IHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBjYW4gc3VpdCwKLSAgICAgICAgLy8gb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgICAgICBpZiAoISh2RmFjdG9yeSBpbnN0YW5jZW9mIElNRVNGU2FmZXR5UmVxdWlyZW1lbnRzRmFjdG9yeSkpIHsKLSAgICAgICAgICAgIHZGYWN0b3J5ID0gbmV3IE1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KCk7Ci0gICAgICAgIH0KKwkJLy8gQ2hlY2sgaWYgdGhlIGZhY3RvcnkgcmV0dXJuZWQgYnkgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGNhbiBzdWl0LAorCQkvLyBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IGluc3RhbmNlCisJCWlmICghKHZGYWN0b3J5IGluc3RhbmNlb2YgSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSkgeworCQkJdkZhY3RvcnkgPSBuZXcgTUVTRlNhZmV0eVJlcXVpcmVtZW50c0ZhY3RvcnkoKTsKKwkJfQogCi0gICAgICAgIHJldHVybiAoSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSB2RmFjdG9yeTsKLSAgICB9CisJCXJldHVybiAoSU1FU0ZTYWZldHlSZXF1aXJlbWVudHNGYWN0b3J5KSB2RmFjdG9yeTsKKwl9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1TU2FmZXR5UmVxdWlyZW1lbnQgY3JlYXRlU1NhZmV0eVJlcXVpcmVtZW50KCkgewotICAgICAgICBJTVNTYWZldHlSZXF1aXJlbWVudCB2U1NhZmV0eVJlcXVpcmVtZW50ID0gbmV3IE1TU2FmZXR5UmVxdWlyZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIHZTU2FmZXR5UmVxdWlyZW1lbnQ7Ci0gICAgfQorCUBPdmVycmlkZQorCXB1YmxpYyBJTVNTYWZldHlSZXF1aXJlbWVudCBjcmVhdGVTU2FmZXR5UmVxdWlyZW1lbnQoKSB7CisJCUlNU1NhZmV0eVJlcXVpcmVtZW50IHZTU2FmZXR5UmVxdWlyZW1lbnQgPSBuZXcgTVNTYWZldHlSZXF1aXJlbWVudCgpOworCQlyZXR1cm4gdlNTYWZldHlSZXF1aXJlbWVudDsKKwl9CiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9NU1NhZmV0eVJlcXVpcmVtZW50LmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9lc2ZzYWZldHlyZXF1aXJlbWVudHMvaW1wbC9NU1NhZmV0eVJlcXVpcmVtZW50LmphdmEKaW5kZXggN2NhNjQ1Ni4uZDUwYTBkYyAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2YvZXNmc2FmZXR5cmVxdWlyZW1lbnRzL2ltcGwvTVNTYWZldHlSZXF1aXJlbWVudC5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL2VzZnNhZmV0eXJlcXVpcmVtZW50cy9pbXBsL01TU2FmZXR5UmVxdWlyZW1lbnQuamF2YQpAQCAtMjMsNDkgKzIzLDQ5IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBNU1NhZmV0eVJlcXVpcmVtZW50Ci0gICAgZXh0ZW5kcyBTU2FmZXR5UmVxdWlyZW1lbnQKLSAgICBpbXBsZW1lbnRzIElNU1NhZmV0eVJlcXVpcmVtZW50IHsKKwlleHRlbmRzIFNTYWZldHlSZXF1aXJlbWVudAorCWltcGxlbWVudHMgSU1TU2FmZXR5UmVxdWlyZW1lbnQgewogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTVNTYWZldHlSZXF1aXJlbWVudCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgTVNTYWZldHlSZXF1aXJlbWVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX0NsYXNzKCkpOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gR2VuZXJpY0Fic3RyYWN0U0VsZW1lbnQuZ2V0TmFtZShnZXRCYXNlX0NsYXNzKCkpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfQ2xhc3MoKSk7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7CisJCXJldHVybiBHZW5lcmljQWJzdHJhY3RTRWxlbWVudC5nZXRVVUlEKGdldEJhc2VfQ2xhc3MoKSk7CisJfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q3JpdGljYWxpdHkoKSB7Ci0gICAgICAgIGludCB2Q3JpdGljYWxpdHkgPSAwOwotICAgICAgICBFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gdlNGYWlsdXJlTW9kZXNMaXN0ID0gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0Q3JpdGljYWxpdHkoKSB7CisJCWludCB2Q3JpdGljYWxpdHkgPSAwOworCQlFTGlzdDxJU0ZhaWx1cmVNb2RlRk1FQT4gdlNGYWlsdXJlTW9kZXNMaXN0ID0gZ2V0U0ZhaWx1cmVNb2Rlc0ZNRUFMaXN0KCk7CiAKLSAgICAgICAgaWYgKCF2U0ZhaWx1cmVNb2Rlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKElTRmFpbHVyZU1vZGVGTUVBIHZTRmFpbHVyZU1vZGUgOiB2U0ZhaWx1cmVNb2Rlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAodkNyaXRpY2FsaXR5IDwgdlNGYWlsdXJlTW9kZS5nZXRGaW5hbENyaXRpY2FsaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdkNyaXRpY2FsaXR5ID0gdlNGYWlsdXJlTW9kZS5nZXRGaW5hbENyaXRpY2FsaXR5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICghdlNGYWlsdXJlTW9kZXNMaXN0LmlzRW1wdHkoKSkgeworCQkJZm9yIChJU0ZhaWx1cmVNb2RlRk1FQSB2U0ZhaWx1cmVNb2RlIDogdlNGYWlsdXJlTW9kZXNMaXN0KSB7CisJCQkJaWYgKHZDcml0aWNhbGl0eSA8IHZTRmFpbHVyZU1vZGUuZ2V0RmluYWxDcml0aWNhbGl0eSgpKSB7CisJCQkJCXZDcml0aWNhbGl0eSA9IHZTRmFpbHVyZU1vZGUuZ2V0RmluYWxDcml0aWNhbGl0eSgpOworCQkJCX0KKwkJCX0KKwkJfQogCi0gICAgICAgIHJldHVybiB2Q3JpdGljYWxpdHk7Ci0gICAgfQorCQlyZXR1cm4gdkNyaXRpY2FsaXR5OworCX0KIAogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Byb2ZpbGUvRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Byb2ZpbGUvRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvci5qYXZhCmluZGV4IDRmYzVkZjguLjc4OGYxZTMgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL0VTRlNhZmV0eVJlcVByb2ZpbGVBY3RpdmF0b3IuamF2YQorKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS9FU0ZTYWZldHlSZXFQcm9maWxlQWN0aXZhdG9yLmphdmEKQEAgLTIzLDg1ICsyMyw4NSBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxODMgJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luCi0gICAgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCWV4dGVuZHMgRU1GUGx1Z2luCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZTYWZldHlSZXFQcm9maWxlQWN0aXZhdG9yKCk7CisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGVuY2Fwc3VsYXRpbmcgc2luZ2xldG9uLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZTYWZldHlSZXFQcm9maWxlQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvcigpIHsKLSAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLSAgICB9CisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgRVNGU2FmZXR5UmVxUHJvZmlsZUFjdGl2YXRvcigpIHsKKwkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBHZXQgQnVuZGxleENvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHNCdW5kbGVDb250ZXh0OwotICAgIH0KKwkvKioKKwkgKiBHZXQgQnVuZGxleENvbnRleHQuCisJICoKKwkgKiBAcmV0dXJuIEJ1bmRsZUNvbnRleHQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IHBDb250ZXh0OwogCi0gICAgICAgIC8vIE1hbnVhbGx5IGNyZWF0ZSB0aGUgcGx1Z2luIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHNQbHVnaW4gPSBuZXcgSW1wbGVtZW50YXRpb24oKTsKLSAgICB9CisJCS8vIE1hbnVhbGx5IGNyZWF0ZSB0aGUgcGx1Z2luIGltcGxlbWVudGF0aW9uCisJCXNQbHVnaW4gPSBuZXcgSW1wbGVtZW50YXRpb24oKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0aXZhdG9yIGNhbiB3b3JrIHdpdGggdGhlIHByb2ZpbGUgbWVjaGFuaXNtcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKgorCSAqIEFkZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmF0b3IgY2FuIHdvcmsgd2l0aCB0aGUgcHJvZmlsZSBtZWNoYW5pc21zLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gbnVsbDsKKwl9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHNQbHVnaW47CisJfQogCi0gICAgLyoqCi0gICAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5VSVBsdWdpbjwvYj4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbgotICAgICAgICBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3NldC9FU0ZTYWZldHlSZXF1aXJlbWVudHNTZXQuamF2YSBiL2FuYWx5c2lzL3NhZmV0eXJlcS9wcm9maWxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnByb2ZpbGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9wcm9maWxlL3NldC9FU0ZTYWZldHlSZXF1aXJlbWVudHNTZXQuamF2YQppbmRleCBlY2MzNWJmLi5mZjNiZmU1IDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcHJvZmlsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5wcm9maWxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcHJvZmlsZS9zZXQvRVNGU2FmZXR5UmVxdWlyZW1lbnRzU2V0LmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Byb2ZpbGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucHJvZmlsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Byb2ZpbGUvc2V0L0VTRlNhZmV0eVJlcXVpcmVtZW50c1NldC5qYXZhCkBAIC0xOCwxOCArMTgsMTggQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY5ICQKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEVTRlNhZmV0eVJlcXVpcmVtZW50c1NldCB7Ci0gICAgLyoqIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBwcm9maWxlIHBhdGguICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9QQVRIID0KLSAgICAgICAgInBhdGhtYXA6Ly9FU0ZTQUZFVFlSRVFVSVJFTUVOVFNfUFJPRklMRS9lc2ZzYWZldHlyZXF1aXJlbWVudHMucHJvZmlsZS51bWwiOyAvLyROT04tTkxTLTEkCisJLyoqIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBwcm9maWxlIHBhdGguICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9QQVRIID0KKwkJInBhdGhtYXA6Ly9FU0ZTQUZFVFlSRVFVSVJFTUVOVFNfUFJPRklMRS9lc2ZzYWZldHlyZXF1aXJlbWVudHMucHJvZmlsZS51bWwiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogRVNGU2FmZXR5UmVxdWlyZW1lbnRzIHByb2ZpbGUgVVJJLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfVVJJID0KLSAgICAgICAgImh0dHA6Ly93d3cucG9sYXJzeXMub3JnL2VzZi8wLjcuMC9FU0ZTYWZldHlSZXF1aXJlbWVudHMiOyAvLyROT04tTkxTLTEkCisJLyoqIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBwcm9maWxlIFVSSS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX1VSSSA9CisJCSJodHRwOi8vd3d3LnBvbGFyc3lzLm9yZy9lc2YvMC43LjAvRVNGU2FmZXR5UmVxdWlyZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVTRlNhZmV0eVJlcXVpcmVtZW50c1NldCgpIHsKLSAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcml2YXRlIGFzIGl0J3MgYSB1dGlsaXR5IGNsYXNzLgorCSAqLworCXByaXZhdGUgRVNGU2FmZXR5UmVxdWlyZW1lbnRzU2V0KCkgeworCSAvLyBOb3RoaW5nIHRvIGRvCisJfQogfQpkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZWxlbmcvYnVpbGQucHJvcGVydGllcyBiL2FuYWx5c2lzL3NhZmV0eXJlcS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVsZW5nL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggOTRiYjg4My4uM2Q0NWI0ZiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZWxlbmcvYnVpbGQucHJvcGVydGllcworKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnJlbGVuZy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xLDQgKzEsNCBAQAogYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAogICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKICAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKKyAgICAgICAgICAgICAgIGVwbC12MjAuaHRtbApkaWZmIC0tZ2l0IGEvYW5hbHlzaXMvc2FmZXR5cmVxL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZWxlbmcvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZWxlbmcvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDU5MzYwMjkuLjJkMzMyYWUgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVsZW5nL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9hbmFseXNpcy9zYWZldHlyZXEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnJlbGVuZy9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTEsMTYgKzEsMTcgQEAKLWZlYXR1cmVOYW1lID0gRVNGIFNhZmV0eVJlcSAoSW5jdWJhdGlvbikKK2ZlYXR1cmVOYW1lID0gRVNGIENvcmUgKE1hbmRhdG9yeSkgKEluY3ViYXRpb24pCiBwcm92aWRlck5hbWUgPSBQb2xhclN5cwotZGVzY3JpcHRpb24gPSBTYWZldHlSZXEgZmVhdHVyZSBvZiBFU0YuIChJbmN1YmF0aW9uKQorZGVzY3JpcHRpb24gPSBUZWNobmljYWwgQ29yZSBmZWF0dXJlIG9mIEVTRiAoTWFuZGF0b3J5KS4gKEluY3ViYXRpb24pCiBjb3B5cmlnaHQ9XAogQ29weXJpZ2h0IChjKSAyMDE2IEFMTDRURUMgJiBDRUEgTElTVC5cblwKIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wXG5cCiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK2h0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG5cCiBcblwKIENvbnRyaWJ1dG9yczpcblwKICAgICBKb25hdGhhbiBEdW1vbnQgKEFMTDRURUMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0gICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCisgICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuXAorCUFuc2dhciBSYWRlcm1hY2hlciAoQ0VBIExJU1QpIC0gdXBncmFkZSB0byAyMDE4LTEyIGFuZCBpbXByb3ZlbWVudHNcbgogbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKIGxpY2Vuc2U9XAogRWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKQEAgLTI5LDggKzMwLDggQEAKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wXG5cCi0oIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMFxuXAorKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKIENvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlNcblwKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVsZW5nL2xpY2Vuc2UuaHRtbCBiL2FuYWx5c2lzL3NhZmV0eXJlcS9yZWxlbmcvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVsZW5nL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi42MzdhMTgxIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvcmVsZW5nL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnJlbGVuZy9saWNlbnNlLmh0bWwKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3JlbGVuZy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZWxlbmcvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwzMDAgQEAKIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICA8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMi4wPC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgYm9keSB7CisgICAgICAgIG1hcmdpbjogMS41ZW0gM2VtOworICAgICAgfQorICAgICAgaDF7CisgICAgICAgIGZvbnQtc2l6ZToxLjVlbTsKKyAgICAgIH0KKyAgICAgIGgyeworICAgICAgICBmb250LXNpemU6MWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOjAuNWVtOworICAgICAgICBtYXJnaW4tdG9wOjFlbTsKKyAgICAgIH0KKyAgICAgIHAgeworICAgICAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgICAgfQorICAgICAgdWwsIG9seworICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAyLjA8L2gxPgorICAgIDxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCisgICAgICBQVUJMSUMgTElDRU5TRSAoJmxkcXVvO0FHUkVFTUVOVCZyZHF1bzspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OCisgICAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQmIzAzOTtTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGVmaW5pdGlvbnMiPjEuIERFRklOSVRJT05TPC9oMj4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0aW9uJnJkcXVvOyBtZWFuczo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb250ZW50CisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2xpPgorICAgICAgICAgIDxsaT5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICAgIHdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tCisgICAgICAgIGFuZCBhcmUgRGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgorICAgICAgICAmbGRxdW87b3JpZ2luYXRlcyZyZHF1bzsgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3ImIzAzOTtzIGJlaGFsZi4KKyAgICAgICAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgICAgICAgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dG9yJnJkcXVvOyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvcD4KKyAgICA8cD4mbGRxdW87TGljZW5zZWQgUGF0ZW50cyZyZHF1bzsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaAorICAgICAgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZQorICAgICAgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UHJvZ3JhbSZyZHF1bzsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgRGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMKKyAgICAgIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1JlY2lwaWVudCZyZHF1bzsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgb3IgYW55IFNlY29uZGFyeSBMaWNlbnNlIChhcyBhcHBsaWNhYmxlKSwgaW5jbHVkaW5nIENvbnRyaWJ1dG9ycy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rlcml2YXRpdmUgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIENvZGUgb3Igb3RoZXIKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFByb2dyYW0gYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87TW9kaWZpZWQgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmsgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybSB0aGF0CisgICAgICByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20sIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUKKyAgICAgIGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLCBpbmNsdWRpbmcsIGZvciBwdXJwb3NlcyBvZiBjbGFyaXR5IGFueSBuZXcgZmlsZQorICAgICAgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGNvbnRhaW5zIGFueSBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbS4gTW9kaWZpZWQKKyAgICAgIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgY29udGFpbiBvbmx5IGRlY2xhcmF0aW9ucywgaW50ZXJmYWNlcywKKyAgICAgIHR5cGVzLCBjbGFzc2VzLCBzdHJ1Y3R1cmVzLCBvciBmaWxlcyBvZiB0aGUgUHJvZ3JhbSBzb2xlbHkgaW4gZWFjaCBjYXNlCisgICAgICBpbiBvcmRlciB0byBsaW5rIHRvLCBiaW5kIGJ5IG5hbWUsIG9yIHN1YmNsYXNzIHRoZSBQcm9ncmFtIG9yIE1vZGlmaWVkCisgICAgICBXb3JrcyB0aGVyZW9mLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGlzdHJpYnV0ZSZyZHF1bzsgbWVhbnMgdGhlIGFjdHMgb2YgYSkgZGlzdHJpYnV0aW5nIG9yIGIpIG1ha2luZyBhdmFpbGFibGUKKyAgICAgIGluIGFueSBtYW5uZXIgdGhhdCBlbmFibGVzIHRoZSB0cmFuc2ZlciBvZiBhIGNvcHkuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTb3VyY2UgQ29kZSZyZHF1bzsgbWVhbnMgdGhlIGZvcm0gb2YgYSBQcm9ncmFtIHByZWZlcnJlZCBmb3IgbWFraW5nCisgICAgICBtb2RpZmljYXRpb25zLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLAorICAgICAgZG9jdW1lbnRhdGlvbiBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U2Vjb25kYXJ5IExpY2Vuc2UmcmRxdW87IG1lYW5zIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgICBWZXJzaW9uIDIuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRoYXQgbGljZW5zZSwgaW5jbHVkaW5nIGFueQorICAgICAgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFzIGlkZW50aWZpZWQgYnkgdGhlIGluaXRpYWwKKyAgICAgIENvbnRyaWJ1dG9yLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdyYW50LW9mLXJpZ2h0cyI+Mi4gR1JBTlQgT0YgUklHSFRTPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgICAgICAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQKKyAgICAgICAgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwKKyAgICAgICAgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAorICAgICAgICBpZiBhbnksIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwKKyAgICAgICAgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLAorICAgICAgICBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorICAgICAgICBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKKyAgICAgICAgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55CisgICAgICAgIG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlcgorICAgICAgICBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisgICAgICA8L2xpPgorICAgICAgPGxpPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZQorICAgICAgICBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZQorICAgICAgICBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKKyAgICAgICAgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4KKyAgICAgICAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcworICAgICAgICBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorICAgICAgICBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMKKyAgICAgICAgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsCisgICAgICAgIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8KKyAgICAgICAgYWxsb3cgUmVjaXBpZW50IHRvIERpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCYjMDM5O3MKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudAorICAgICAgICBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vIENvbnRyaWJ1dG9yCisgICAgICAgIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4gdGhvc2Ugc2V0IGZvcnRoCisgICAgICAgIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmVjZWlwdCBvZiB0aGUKKyAgICAgICAgUHJvZ3JhbSB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZSAoaWYgcGVybWl0dGVkIHVuZGVyCisgICAgICAgIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDMpLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj4zLiBSRVFVSVJFTUVOVFM8L2gyPgorICAgIDxwPjMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgdGhlIFByb2dyYW0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGFzIFNvdXJjZSBDb2RlLCBpbgorICAgICAgICBhY2NvcmRhbmNlIHdpdGggc2VjdGlvbiAzLjIsIGFuZCB0aGUgQ29udHJpYnV0b3IgbXVzdCBhY2NvbXBhbnkKKyAgICAgICAgdGhlIFByb2dyYW0gd2l0aCBhIHN0YXRlbWVudCB0aGF0IHRoZSBTb3VyY2UgQ29kZSBmb3IgdGhlIFByb2dyYW0KKyAgICAgICAgaXMgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgaW5mb3JtcyBSZWNpcGllbnRzIGhvdyB0bworICAgICAgICBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5CisgICAgICAgIHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlOyBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIHRoZSBDb250cmlidXRvciBtYXkgRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSB1bmRlciBhIGxpY2Vuc2UKKyAgICAgICAgZGlmZmVyZW50IHRoYW4gdGhpcyBBZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQgc3VjaCBsaWNlbnNlOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbAorICAgICAgICAgICAgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWlpKSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzJiMwMzk7IHJpZ2h0cyBpbiB0aGUKKyAgICAgICAgICAgIFNvdXJjZSBDb2RlIHVuZGVyIHNlY3Rpb24gMy4yOyBhbmQKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5pdikgcmVxdWlyZXMgYW55IHN1YnNlcXVlbnQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFueSBwYXJ0eQorICAgICAgICAgICAgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBzZWN0aW9uIDMuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjIgV2hlbiB0aGUgUHJvZ3JhbSBpcyBEaXN0cmlidXRlZCBhcyBTb3VyY2UgQ29kZTo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZSBQcm9ncmFtIChpKQorICAgICAgICBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvciBmaWxlcyBtYWRlIGF2YWlsYWJsZQorICAgICAgICB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbCBDb250cmlidXRvciBhdHRhY2hlZCB0bworICAgICAgICB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgICB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaAorICAgICAgICBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4zIENvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywKKyAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LCBvciBsaW1pdGF0aW9ucyBvZiBsaWFiaWxpdHkKKyAgICAgICgmbHNxdW87bm90aWNlcyZyc3F1bzspIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0gZnJvbSBhbnkgY29weSBvZiB0aGUgUHJvZ3JhbSB3aGljaAorICAgICAgdGhleSBEaXN0cmlidXRlLCBwcm92aWRlZCB0aGF0IENvbnRyaWJ1dG9ycyBtYXkgYWRkIHRoZWlyIG93biBhcHByb3ByaWF0ZQorICAgICAgbm90aWNlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJjb21tZXJjaWFsLWRpc3RyaWJ1dGlvbiI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2gyPgorICAgIDxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCisgICAgICB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMKKyAgICAgIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZQorICAgICAgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZAorICAgICAgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyCisgICAgICBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhCisgICAgICBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZsZHF1bztDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnJkcXVvOykKKyAgICAgIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IKKyAgICAgICgmbGRxdW87SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcmRxdW87KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzCisgICAgICAoY29sbGVjdGl2ZWx5ICZsZHF1bztMb3NzZXMmcmRxdW87KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworICAgICAgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQKKyAgICAgIGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24KKyAgICAgIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4KKyAgICAgIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nCisgICAgICB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8KKyAgICAgIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKKyAgICAgIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwKKyAgICAgIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkCisgICAgICBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorICAgIDwvcD4KKyAgICA8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtCisgICAgICBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKKyAgICAgIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcworICAgICAgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciYjMDM5O3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCisgICAgICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcworICAgICAgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAorICAgICAgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcworICAgICAgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0id2FycmFudHkiPjUuIE5PIFdBUlJBTlRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJmxkcXVvO0FTIElTJnJkcXVvOyBCQVNJUywgV0lUSE9VVAorICAgICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKKyAgICAgIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZQorICAgICAgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UKKyAgICAgIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKKyAgICAgIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRpc2NsYWltZXIiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkKKyAgICAgIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorICAgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAgICAgIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUworICAgICAgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdlbmVyYWwiPjcuIEdFTkVSQUw8L2gyPgorICAgIDxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCisgICAgICBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlCisgICAgICByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUKKyAgICAgIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQKKyAgICAgIG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKyAgICA8L3A+CisgICAgPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYKKyAgICAgIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCisgICAgICBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQmIzAzOTtzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIGdyYW50ZWQKKyAgICAgIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICAgIDwvcD4KKyAgICA8cD5BbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvCisgICAgICBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kCisgICAgICBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcKKyAgICAgIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KKyAgICAgIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50JiMwMzk7cyBvYmxpZ2F0aW9ucyB1bmRlcgorICAgICAgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUKKyAgICAgIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisgICAgPC9wPgorICAgIDxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heQorICAgICAgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzCisgICAgICB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50CisgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQKKyAgICAgIHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQKKyAgICAgIFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMKKyAgICAgIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZgorICAgICAgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisgICAgICAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgRGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbgorICAgICAgb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldworICAgICAgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIERpc3RyaWJ1dGUKKyAgICAgIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4KKyAgICA8L3A+CisgICAgPHA+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50CisgICAgICByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkKKyAgICAgIENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCisgICAgICBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkCisgICAgICB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuIE5vdGhpbmcgaW4gdGhpcyBBZ3JlZW1lbnQgaXMgaW50ZW5kZWQKKyAgICAgIHRvIGJlIGVuZm9yY2VhYmxlIGJ5IGFueSBlbnRpdHkgdGhhdCBpcyBub3QgYSBDb250cmlidXRvciBvciBSZWNpcGllbnQuCisgICAgICBObyB0aGlyZC1wYXJ0eSBiZW5lZmljaWFyeSByaWdodHMgYXJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZXhoaWJpdC1hIj5FeGhpYml0IEEgJm5kYXNoOyBGb3JtIG9mIFNlY29uZGFyeSBMaWNlbnNlcyBOb3RpY2U8L2gyPgorICAgIDxwPiZsZHF1bztUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgCisgICAgCVNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggCisgICAgCWluIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKKyAgICAJdmVyc2lvbihzKSwgYW5kIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBoZXJlfS4mcmRxdW87CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHA+U2ltcGx5IGluY2x1ZGluZyBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyB0aGlzIEV4aGliaXQgQQorICAgICAgICBpcyBub3Qgc3VmZmljaWVudCB0byBsaWNlbnNlIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBTZWNvbmRhcnkgTGljZW5zZXMuCisgICAgICA8L3A+CisgICAgICA8cD5JZiBpdCBpcyBub3QgcG9zc2libGUgb3IgZGVzaXJhYmxlIHRvIHB1dCB0aGUgbm90aWNlIGluIGEgcGFydGljdWxhciBmaWxlLAorICAgICAgICB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFIGZpbGUgaW4gYQorICAgICAgICByZWxldmFudCBkaXJlY3RvcnkpIHdoZXJlIGEgcmVjaXBpZW50IHdvdWxkIGJlIGxpa2VseSB0byBsb29rIGZvcgorICAgICAgICBzdWNoIGEgbm90aWNlLgorICAgICAgPC9wPgorICAgICAgPHA+WW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuPC9wPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVzb3VyY2VzLmdyYXBoaWNhbC9hYm91dC5odG1sIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZXNvdXJjZXMuZ3JhcGhpY2FsL2Fib3V0Lmh0bWwKaW5kZXggZDM1ZDVhZS4uNzc4ZTFiYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZXNvdXJjZXMuZ3JhcGhpY2FsL2Fib3V0Lmh0bWwKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZXNvdXJjZXMuZ3JhcGhpY2FsL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTIgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC88L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVzb3VyY2VzLmdyYXBoaWNhbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGU2FmZXR5UmVxUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yLmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvcmVzb3VyY2VzL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnJlc291cmNlcy5ncmFwaGljYWwvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS9yZXNvdXJjZXMvZ3JhcGhpY2FsL0VTRlNhZmV0eVJlcVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvci5qYXZhCmluZGV4IDFhNjlhNWUuLmI5NjUyYTkgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS9yZXNvdXJjZXMvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEucmVzb3VyY2VzLmdyYXBoaWNhbC9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3Jlc291cmNlcy9ncmFwaGljYWwvRVNGU2FmZXR5UmVxUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yLmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3Jlc291cmNlcy9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZXNvdXJjZXMuZ3JhcGhpY2FsL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvcmVzb3VyY2VzL2dyYXBoaWNhbC9FU0ZTYWZldHlSZXFSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IuamF2YQpAQCAtMjIsMTAxICsyMiwxMDEgQEAKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMTY4ICQKICAqLwogcHVibGljIGNsYXNzIEVTRlNhZmV0eVJlcVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwlleHRlbmRzIEVNRlBsdWdpbiB7CiAKLSAgICAvKiogVGhlIHBsdWctaW4gSUQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnJlc291cmNlcy5ncmFwaGljYWwiOyAvLyROT04tTkxTLTEkCisJLyoqIFRoZSBwbHVnLWluIElELiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS5yZXNvdXJjZXMuZ3JhcGhpY2FsIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhpcyBzaW5nbGV0b24gYWN0aXZhdG9yLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVTRlNhZmV0eVJlcVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvciBJTlNUQU5DRSA9Ci0gICAgICAgIG5ldyBFU0ZTYWZldHlSZXFSZXNvdXJjZXNHcmFwaGljYWxBY3RpdmF0b3IoKTsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGlzIHNpbmdsZXRvbiBhY3RpdmF0b3IuICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVNGU2FmZXR5UmVxUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yIElOU1RBTkNFID0KKwkJbmV3IEVTRlNhZmV0eVJlcVJlc291cmNlc0dyYXBoaWNhbEFjdGl2YXRvcigpOwogCi0gICAgLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CisJLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gc1BsdWdpbiA9IG51bGw7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGU2FmZXR5UmVxUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yKCkgewotICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICAgIH0KKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgRVNGU2FmZXR5UmVxUmVzb3VyY2VzR3JhcGhpY2FsQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXJyb3Igc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEVycm9yIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLldBUk5JTkcsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYSBXYXJuaW5nIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIFdhcm5pbmcgc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KKwkJZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4gewogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKKwkJLyoqCisJCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOwogCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlCi0gICAgICAgICAgICBzUGx1Z2luID0gdGhpczsKLSAgICAgICAgfQotICAgIH0KKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UKKwkJCXNQbHVnaW4gPSB0aGlzOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEudGFibGUvYWJvdXQuaHRtbCBiL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9hYm91dC5odG1sCmluZGV4IGQzNWQ1YWUuLjc3OGUxYmEgMTAwNjQ0Ci0tLSBhL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9hYm91dC5odG1sCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9hYm91dC5odG1sCkBAIC04LDEzICs4LDEyIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgNSwgMjAwNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8iPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS90YWJsZS9FU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvRVNGU2FmZXR5UmVxVGFibGVBY3RpdmF0b3IuamF2YQppbmRleCAzNWUxZDg0Li5iODk0NWRlIDEwMDY0NAotLS0gYS9hbmFseXNpcy9zYWZldHlyZXEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS90YWJsZS9FU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvci5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3RhYmxlL0VTRlNhZmV0eVJlcVRhYmxlQWN0aXZhdG9yLmphdmEKQEAgLTI0LDEzNSArMjQsMTM1IEBACiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDE2OCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBFU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvcgotICAgIGV4dGVuZHMgRU1GUGx1Z2luCi0gICAgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCWV4dGVuZHMgRU1GUGx1Z2luCisJaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogCi0gICAgLyoqIFRoZSBwbHVnLWluIElELiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkvKiogVGhlIHBsdWctaW4gSUQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlIjsgLy8kTk9OLU5MUy0xJAogCi0gICAgLyoqIFRoZSBUYWJsZSBUeXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1RZUEUgPSAiRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGUiOyAvLyROT04tTkxTLTEkCisJLyoqIFRoZSBUYWJsZSBUeXBlLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1RZUEUgPSAiRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKiogS2VlcCB0cmFjayBvZiB0aGUgZW5jYXBzdWxhdGluZyBzaW5nbGV0b24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvciBJTlNUQU5DRSA9IG5ldyBFU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvcigpOworCS8qKiBLZWVwIHRyYWNrIG9mIHRoZSBlbmNhcHN1bGF0aW5nIHNpbmdsZXRvbi4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVTRlNhZmV0eVJlcVRhYmxlQWN0aXZhdG9yIElOU1RBTkNFID0gbmV3IEVTRlNhZmV0eVJlcVRhYmxlQWN0aXZhdG9yKCk7CiAKLSAgICAvKiogRXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBidW5kbGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJLyoqIEV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgYnVuZGxlLiAqLworCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgc0J1bmRsZUNvbnRleHQgPSBudWxsOwogCi0gICAgLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGltcGxlbWVudGF0aW9uIHNpbmdsZXRvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBzUGx1Z2luID0gbnVsbDsKKwkvKiogS2VlcCB0cmFjayBvZiB0aGUgaW1wbGVtZW50YXRpb24gc2luZ2xldG9uLiAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHNQbHVnaW4gPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRVNGU2FmZXR5UmVxVGFibGVBY3RpdmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0gICAgfQorCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICovCisJcHVibGljIEVTRlNhZmV0eVJlcVRhYmxlQWN0aXZhdG9yKCkgeworCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOworCX0KIAotICAgIC8qKgotICAgICAqIEdldCBCdW5kbGV4Q29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzQnVuZGxlQ29udGV4dDsKLSAgICB9CisJLyoqCisJICogR2V0IEJ1bmRsZXhDb250ZXh0LgorCSAqCisJICogQHJldHVybiBCdW5kbGVDb250ZXh0CisJICovCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIHNCdW5kbGVDb250ZXh0OworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBCdW5kbGVDb250ZXh0IHBDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc0J1bmRsZUNvbnRleHQgPSBwQ29udGV4dDsKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoZmluYWwgQnVuZGxlQ29udGV4dCBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNCdW5kbGVDb250ZXh0ID0gcENvbnRleHQ7CiAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBwbHVnaW4gaW1wbGVtZW50YXRpb24gbWFudWFsbHkKLSAgICAgICAgc1BsdWdpbiA9IG5ldyBJbXBsZW1lbnRhdGlvbigpOwotICAgIH0KKwkJLy8gQ3JlYXRlIHRoZSBwbHVnaW4gaW1wbGVtZW50YXRpb24gbWFudWFsbHkKKwkJc1BsdWdpbiA9IG5ldyBJbXBsZW1lbnRhdGlvbigpOworCX0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzQnVuZGxlQ29udGV4dCA9IG51bGw7Ci0gICAgfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKGZpbmFsIEJ1bmRsZUNvbnRleHQgcENvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlQ29udGV4dCA9IG51bGw7CisJfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNQbHVnaW47Ci0gICAgfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBzUGx1Z2luOworCX0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0gICAgICAgIHJldHVybiBzUGx1Z2luOwotICAgIH0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqCisJICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gc1BsdWdpbjsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXJyb3Igc3RhdHVzIHdpdGggdGhlIGRhdGEgZ2l2ZW4gaW4gcGFyYW1ldGVyIGFuZCBsb2cgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHBFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEVycm9yIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBFcnJvciBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKKwkgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgcE1lc3NhZ2UsIGZpbmFsIEV4Y2VwdGlvbiBwRXhjZXB0aW9uKSB7CisJCS8vIENyZWF0ZSB0aGUgRXJyb3Igc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBwTWVzc2FnZSwgcEV4Y2VwdGlvbik7CiAKLSAgICAgICAgLy8gTG9nIGl0Ci0gICAgICAgIElOU1RBTkNFLmxvZyh2U3RhdHVzKTsKLSAgICB9CisJCS8vIExvZyBpdAorCQlJTlNUQU5DRS5sb2codlN0YXR1cyk7CisJfQogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2FybmluZyBzdGF0dXMgd2l0aCB0aGUgZGF0YSBnaXZlbiBpbiBwYXJhbWV0ZXIgYW5kIGxvZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwTWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gcEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKGZpbmFsIFN0cmluZyBwTWVzc2FnZSwgZmluYWwgRXhjZXB0aW9uIHBFeGNlcHRpb24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBXYXJuaW5nIHN0YXR1cwotICAgICAgICBJU3RhdHVzIHZTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLldBUk5JTkcsIHBNZXNzYWdlLCBwRXhjZXB0aW9uKTsKKwkvKioKKwkgKiBDcmVhdGUgYSBXYXJuaW5nIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIFdhcm5pbmcgc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCi0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOworCS8qKgorCSAqIENyZWF0ZSBhbiBJbmZvIHN0YXR1cyB3aXRoIHRoZSBkYXRhIGdpdmVuIGluIHBhcmFtZXRlciBhbmQgbG9nIGl0LgorCSAqCisJICogQHBhcmFtIHBNZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZworCSAqIEBwYXJhbSBwRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oZmluYWwgU3RyaW5nIHBNZXNzYWdlLCBmaW5hbCBFeGNlcHRpb24gcEV4Y2VwdGlvbikgeworCQkvLyBDcmVhdGUgdGhlIEluZm8gc3RhdHVzCisJCUlTdGF0dXMgdlN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgcE1lc3NhZ2UsIHBFeGNlcHRpb24pOwogCi0gICAgICAgIC8vIExvZyBpdAotICAgICAgICBJTlNUQU5DRS5sb2codlN0YXR1cyk7Ci0gICAgfQorCQkvLyBMb2cgaXQKKwkJSU5TVEFOQ0UubG9nKHZTdGF0dXMpOworCX0KIAotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+VUlQbHVnaW48L2I+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24KLSAgICAgICAgZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlVJUGx1Z2luPC9iPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uCisJCWV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CiAKLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIG9mIHRoZSBzdGF0aWMgaW5zdGFuY2UKLSAgICAgICAgICAgIHNQbHVnaW4gPSB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJLy8gUmVtZW1iZXIgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZQorCQkJc1BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3RhYmxlL21hbmFnZXIvYXhpcy9FU0ZTYWZldHlSZXF1aXJlbWVudHNBeGlzTWFuYWdlci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvbWFuYWdlci9heGlzL0VTRlNhZmV0eVJlcXVpcmVtZW50c0F4aXNNYW5hZ2VyLmphdmEKaW5kZXggODQ1OGU3Mi4uMzU4OWExYSAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvbWFuYWdlci9heGlzL0VTRlNhZmV0eVJlcXVpcmVtZW50c0F4aXNNYW5hZ2VyLmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvbWFuYWdlci9heGlzL0VTRlNhZmV0eVJlcXVpcmVtZW50c0F4aXNNYW5hZ2VyLmphdmEKQEAgLTI4LDcwICsyOCw3MCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgY2xhc3MgRVNGU2FmZXR5UmVxdWlyZW1lbnRzQXhpc01hbmFnZXIKLSAgICBleHRlbmRzIEFic3RyYWN0U3RlcmVvdHlwZWRFbGVtZW50VU1MU3luY2hyb25pemVkT25GZWF0dXJlQXhpc01hbmFnZXI8SVNTYWZldHlSZXF1aXJlbWVudD4geworCWV4dGVuZHMgQWJzdHJhY3RTdGVyZW90eXBlZEVsZW1lbnRVTUxTeW5jaHJvbml6ZWRPbkZlYXR1cmVBeGlzTWFuYWdlcjxJU1NhZmV0eVJlcXVpcmVtZW50PiB7CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEVTRlNhZmV0eVJlcXVpcmVtZW50c0F4aXNNYW5hZ2VyKCkgewotICAgIH0KKwkvKioKKwkgKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIEVTRlNhZmV0eVJlcXVpcmVtZW50c0F4aXNNYW5hZ2VyKCkgeworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZUF4aXNFbGVtZW50KGZpbmFsIFN0cmluZyBwRWxlbWVudElkKSB7Ci0gICAgICAgIElTcGVjaWFsaXphdGlvblR5cGUgdlR5cGUgPSAoSVNwZWNpYWxpemF0aW9uVHlwZSkgRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAuZ2V0VHlwZShFU0ZTYWZldHlSZXF1aXJlbWVudHNUeXBlc1NldC5TU0FGRVRZUkVRVUlSRU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgIHJldHVybiB2VHlwZS5nZXRJZCgpLmVxdWFscyhwRWxlbWVudElkKTsKLSAgICB9CisJLyoqCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlQXhpc0VsZW1lbnQoZmluYWwgU3RyaW5nIHBFbGVtZW50SWQpIHsKKwkJSVNwZWNpYWxpemF0aW9uVHlwZSB2VHlwZSA9IChJU3BlY2lhbGl6YXRpb25UeXBlKSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKKwkJCS5nZXRUeXBlKEVTRlNhZmV0eVJlcXVpcmVtZW50c1R5cGVzU2V0LlNTQUZFVFlSRVFVSVJFTUVOVF9UWVBFX0lEKTsKKwkJcmV0dXJuIHZUeXBlLmdldElkKCkuZXF1YWxzKHBFbGVtZW50SWQpOworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldFN0ZXJlb3R5cGVCYXNlRWxlbWVudChmaW5hbCBJU1NhZmV0eVJlcXVpcmVtZW50IHBTdGVyZW90eXBlQXBwbGljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIHBTdGVyZW90eXBlQXBwbGljYXRpb24uZ2V0QmFzZV9DbGFzcygpOwotICAgIH0KKwkvKioKKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWxlbWVudCBnZXRTdGVyZW90eXBlQmFzZUVsZW1lbnQoZmluYWwgSVNTYWZldHlSZXF1aXJlbWVudCBwU3RlcmVvdHlwZUFwcGxpY2F0aW9uKSB7CisJCXJldHVybiBwU3RlcmVvdHlwZUFwcGxpY2F0aW9uLmdldEJhc2VfQ2xhc3MoKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luc3RhbmNlT2ZSZXF1aXJlZFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihmaW5hbCBPYmplY3QgcE9iamVjdCkgewotICAgICAgICByZXR1cm4gcE9iamVjdCBpbnN0YW5jZW9mIElTU2FmZXR5UmVxdWlyZW1lbnQ7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzSW5zdGFuY2VPZlJlcXVpcmVkU3RlcmVvdHlwZUFwcGxpY2F0aW9uKGZpbmFsIE9iamVjdCBwT2JqZWN0KSB7CisJCXJldHVybiBwT2JqZWN0IGluc3RhbmNlb2YgSVNTYWZldHlSZXF1aXJlbWVudDsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FsbG93ZWRBc0Jhc2VFbGVtZW50KGZpbmFsIEVsZW1lbnQgcEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHBFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3M7Ci0gICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzQWxsb3dlZEFzQmFzZUVsZW1lbnQoZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlyZXR1cm4gcEVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzczsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSVNTYWZldHlSZXF1aXJlbWVudCBnZXRTdGVyZW90eXBlQXBwbGljYXRpb24oZmluYWwgRWxlbWVudCBwRWxlbWVudCkgewotICAgICAgICByZXR1cm4gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIElTU2FmZXR5UmVxdWlyZW1lbnQuY2xhc3MpOwotICAgIH0KKwkvKioKKwkgKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSVNTYWZldHlSZXF1aXJlbWVudCBnZXRTdGVyZW90eXBlQXBwbGljYXRpb24oZmluYWwgRWxlbWVudCBwRWxlbWVudCkgeworCQlyZXR1cm4gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocEVsZW1lbnQsIElTU2FmZXR5UmVxdWlyZW1lbnQuY2xhc3MpOworCX0KIAotICAgIC8qKgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uQmFzZVByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEVTRlNhZmV0eVJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFLmdldFNTYWZldHlSZXF1aXJlbWVudCgpLmdldE5hbWUoKTsKLSAgICB9CisJLyoqCisJICoKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdGVyZW90eXBlQXBwbGljYXRpb25CYXNlUHJvcGVydHlOYW1lKCkgeworCQlyZXR1cm4gRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1NhZmV0eVJlcXVpcmVtZW50KCkuZ2V0TmFtZSgpOworCX0KIAogfQogCmRpZmYgLS1naXQgYS9hbmFseXNpcy9zYWZldHlyZXEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS90YWJsZS9zZXQvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVzU2V0LmphdmEgYi9hbmFseXNpcy9zYWZldHlyZXEvdGFibGUvb3JnLnBvbGFyc3lzLmVzZi5zYWZldHlyZXEudGFibGUvc3JjL21haW4vamF2YS9vcmcvcG9sYXJzeXMvZXNmL3NhZmV0eXJlcS90YWJsZS9zZXQvRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVzU2V0LmphdmEKaW5kZXggMGM1YjY3MC4uNjQ4MTZmMiAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvc2V0L0VTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlc1NldC5qYXZhCisrKyBiL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3RhYmxlL3NldC9FU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZXNTZXQuamF2YQpAQCAtMTgsMjggKzE4LDI4IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZXNTZXQgewogCi0gICAgLyoqCi0gICAgICogRVNGU2FmZXR5UmVxdWlyZW1lbnRzIFRhYmxlIFRhYmxlIElELgotICAgICAqIE5PVEU6IFRoZSBJRCBtdXN0IGJlIHRoZSBzYW1lIGluOgotICAgICAqICAtIEVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlLmNvbmZpZ3VyYXRpb24KLSAgICAgKiAgLSBFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZS5uYXR0YWJsZWNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQUZFVFlSRVFfVEFCTEVfSUQgPQotICAgICAgICAiRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogRVNGU2FmZXR5UmVxdWlyZW1lbnRzIFRhYmxlIFRhYmxlIElELgorCSAqIE5PVEU6IFRoZSBJRCBtdXN0IGJlIHRoZSBzYW1lIGluOgorCSAqICAtIEVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlLmNvbmZpZ3VyYXRpb24KKwkgKiAgLSBFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZS5uYXR0YWJsZWNvbmZpZ3VyYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQUZFVFlSRVFfVEFCTEVfSUQgPQorCQkiRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGUiOyAvLyROT04tTkxTLTEkCiAKLSAgICAvKioKLSAgICAgKiBFU0ZTYWZldHlSZXF1aXJlbWVudHMgVGFibGUgbmFtZS4KLSAgICAgKiBOT1RFOiBUaGUgbmFtZSBtdXN0IGJlIHRoZSBzYW1lIGluOgotICAgICAqICAtIEVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlLm5hdHRhYmxlY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBRkVUWVJFUV9UQUJMRV9OQU1FID0KLSAgICAgICAgIkVTRlNhZmV0eVJlcVRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBUYWJsZSBuYW1lLgorCSAqIE5PVEU6IFRoZSBuYW1lIG11c3QgYmUgdGhlIHNhbWUgaW46CisJICogIC0gRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGUubmF0dGFibGVjb25maWd1cmF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FGRVRZUkVRX1RBQkxFX05BTUUgPQorCQkiRVNGU2FmZXR5UmVxVGFibGUiOyAvLyROT04tTkxTLTEkCiAKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIHByaXZhdGUgYXMgaXQncyBhIHV0aWxpdHkgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZXNTZXQoKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICB9CisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgcHJpdmF0ZSBhcyBpdCdzIGEgdXRpbGl0eSBjbGFzcy4KKwkgKi8KKwlwcml2YXRlIEVTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlc1NldCgpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KIH0KZGlmZiAtLWdpdCBhL2FuYWx5c2lzL3NhZmV0eXJlcS90YWJsZS9vcmcucG9sYXJzeXMuZXNmLnNhZmV0eXJlcS50YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9wb2xhcnN5cy9lc2Yvc2FmZXR5cmVxL3RhYmxlL3Rlc3Rlci9FU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZVRlc3Rlci5qYXZhIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvdGVzdGVyL0VTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlVGVzdGVyLmphdmEKaW5kZXggMzVjNTY4OC4uMDdhNGExOCAxMDA2NDQKLS0tIGEvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvdGVzdGVyL0VTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlVGVzdGVyLmphdmEKKysrIGIvYW5hbHlzaXMvc2FmZXR5cmVxL3RhYmxlL29yZy5wb2xhcnN5cy5lc2Yuc2FmZXR5cmVxLnRhYmxlL3NyYy9tYWluL2phdmEvb3JnL3BvbGFyc3lzL2VzZi9zYWZldHlyZXEvdGFibGUvdGVzdGVyL0VTRlNhZmV0eVJlcXVpcmVtZW50c1RhYmxlVGVzdGVyLmphdmEKQEAgLTMxLDU4ICszMSw1OCBAQAogICogQHZlcnNpb24gJFJldmlzaW9uOiAxNjggJAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRVNGU2FmZXR5UmVxdWlyZW1lbnRzVGFibGVUZXN0ZXIKLSAgICBpbXBsZW1lbnRzIElUYWJsZVRlc3RlciB7CisJaW1wbGVtZW50cyBJVGFibGVUZXN0ZXIgewogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZVRlc3RlcigpIHsKLSAgICB9CisJLyoqCisJICoKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBFU0ZTYWZldHlSZXF1aXJlbWVudHNUYWJsZVRlc3RlcigpIHsKKwl9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBpc0FsbG93ZWQoZmluYWwgT2JqZWN0IHBDb250ZXh0KSB7Ci0gICAgICAgIElTdGF0dXMgdlN0YXR1cyA9IG51bGw7Ci0gICAgICAgIGlmIChwQ29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdkVsID0gKEVsZW1lbnQpIHBDb250ZXh0OwotICAgICAgICAgICAgSVNwZWNpYWxpemF0aW9uVHlwZSB2VHlwZSA9IChJU3BlY2lhbGl6YXRpb25UeXBlKSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZShFU0ZTYWZldHlSZXF1aXJlbWVudHNUeXBlc1NldC5TU0FGRVRZUkVRVUlSRU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICBpZiAodlR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElFbGVtZW50TWF0Y2hlciB2TWF0Y2hlciA9IHZUeXBlLmdldE1hdGNoZXIoKTsKLSAgICAgICAgICAgICAgICBQcm9maWxlIHZQcm9maWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRleHQgaW5zdGFuY2VvZiBQYWNrYWdlIHx8IHZNYXRjaGVyLm1hdGNoZXModkVsKSkgewotICAgICAgICAgICAgICAgICAgICB2UHJvZmlsZSA9IFVNTFV0aWwuZ2V0UHJvZmlsZShJRVNGU2FmZXR5UmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UsIHZFbCk7Ci0gICAgICAgICAgICAgICAgfQorCS8qKgorCSAqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIGlzQWxsb3dlZChmaW5hbCBPYmplY3QgcENvbnRleHQpIHsKKwkJSVN0YXR1cyB2U3RhdHVzID0gbnVsbDsKKwkJaWYgKHBDb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgeworCQkJRWxlbWVudCB2RWwgPSAoRWxlbWVudCkgcENvbnRleHQ7CisJCQlJU3BlY2lhbGl6YXRpb25UeXBlIHZUeXBlID0gKElTcGVjaWFsaXphdGlvblR5cGUpIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQorCQkJCS5nZXRUeXBlKEVTRlNhZmV0eVJlcXVpcmVtZW50c1R5cGVzU2V0LlNTQUZFVFlSRVFVSVJFTUVOVF9UWVBFX0lEKTsKKwkJCWlmICh2VHlwZSAhPSBudWxsKSB7CisJCQkJSUVsZW1lbnRNYXRjaGVyIHZNYXRjaGVyID0gdlR5cGUuZ2V0TWF0Y2hlcigpOworCQkJCVByb2ZpbGUgdlByb2ZpbGUgPSBudWxsOworCQkJCWlmIChwQ29udGV4dCBpbnN0YW5jZW9mIFBhY2thZ2UgfHwgdk1hdGNoZXIubWF0Y2hlcyh2RWwpKSB7CisJCQkJCXZQcm9maWxlID0gVU1MVXRpbC5nZXRQcm9maWxlKElFU0ZTYWZldHlSZXF1aXJlbWVudHNQYWNrYWdlLmVJTlNUQU5DRSwgdkVsKTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICBpZiAodlByb2ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdlBhY2thZ2VRTiA9IHZQcm9maWxlLmdldFF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZFbC5nZXROZWFyZXN0UGFja2FnZSgpLmdldEFwcGxpZWRQcm9maWxlKHZQYWNrYWdlUU4sIHRydWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZTdGF0dXMgPSBuZXcgU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXMuT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNGU2FmZXR5UmVxVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY29udGV4dCBhbGxvd2VkIHRvIGNyZWF0ZSBhIEVTRlNhZmV0eVJlcXVpcmVtZW50cyBUYWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2U3RhdHVzID0gbmV3IFN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRlNhZmV0eVJlcVRhYmxlQWN0aXZhdG9yLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHByb2ZpbGUgIiArIHZQYWNrYWdlUU4gLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGFwcGxpZWQgb24gdGhlIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQkJCWlmICh2UHJvZmlsZSAhPSBudWxsKSB7CisJCQkJCWZpbmFsIFN0cmluZyB2UGFja2FnZVFOID0gdlByb2ZpbGUuZ2V0UXVhbGlmaWVkTmFtZSgpOworCQkJCQlpZiAodkVsLmdldE5lYXJlc3RQYWNrYWdlKCkuZ2V0QXBwbGllZFByb2ZpbGUodlBhY2thZ2VRTiwgdHJ1ZSkgIT0gbnVsbCkgeworCQkJCQkJdlN0YXR1cyA9IG5ldyBTdGF0dXMoCisJCQkJCQkJSVN0YXR1cy5PSywKKwkJCQkJCQlFU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCisJCQkJCQkJIlRoZSBjb250ZXh0IGFsbG93ZWQgdG8gY3JlYXRlIGEgRVNGU2FmZXR5UmVxdWlyZW1lbnRzIFRhYmxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZTdGF0dXMgPSBuZXcgU3RhdHVzKAorCQkJCQkJCUlTdGF0dXMuRVJST1IsCisJCQkJCQkJRVNGU2FmZXR5UmVxVGFibGVBY3RpdmF0b3IuUExVR0lOX0lELAorCQkJCQkJCSJUaGUgcHJvZmlsZSAiICsgdlBhY2thZ2VRTiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgIiBpcyBub3QgYXBwbGllZCBvbiB0aGUgbW9kZWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgaWYgKHZTdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdlN0YXR1cyA9IG5ldyBTdGF0dXMoCi0gICAgICAgICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICBFU0ZTYWZldHlSZXFUYWJsZUFjdGl2YXRvci5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgIlRoZSBjb250ZXh0IGlzIG5vdCBhbiBVTUwgRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZTdGF0dXM7Ci0gICAgfQorCQlpZiAodlN0YXR1cyA9PSBudWxsKSB7CisJCQl2U3RhdHVzID0gbmV3IFN0YXR1cygKKwkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCUVTRlNhZmV0eVJlcVRhYmxlQWN0aXZhdG9yLlBMVUdJTl9JRCwKKwkJCQkiVGhlIGNvbnRleHQgaXMgbm90IGFuIFVNTCBFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gdlN0YXR1czsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL3JlbGVuZy9saWNlbmNlL2VwbC5oZWFkZXIudHh0IGIvcmVsZW5nL2xpY2VuY2UvZXBsLmhlYWRlci50eHQKaW5kZXggNzExZDk0YS4uNzcxYjgyMSAxMDA2NDQKLS0tIGEvcmVsZW5nL2xpY2VuY2UvZXBsLmhlYWRlci50eHQKKysrIGIvcmVsZW5nL2xpY2VuY2UvZXBsLmhlYWRlci50eHQKQEAgLTEsNSArMSw3IEBACiBDb3B5cmlnaHQgKGMpICR7eWVhcn0gQUxMNFRFQyAmIENFQSBMSVNULgogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKworU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==