LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIEJ1bmRlc2luc3RpdHV0IGb8ciBSaXNpa29iZXdlcnR1bmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ3JhcGhtYXA7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JQ29udGV4dE1lbnVVcGRhdGVzTGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKCi8qKgogKiBUaGlzIGNsYXNzIHByZXNlbnRzICJ2aWV3cyIgb2YgdGhlIHJ1bm5pbmcgc2ltdWxhdGlvbnMuCiAqLwpwdWJsaWMgY2xhc3MgR3JhcGhNYXBWaWV3ZXIgZXh0ZW5kcyBWaWV3ZXIgaW1wbGVtZW50cwoJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyIHsKCgkvKioKCSAqIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gb2YKCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMgdGhhdCBzaG91bGQgYmUKCSAqIGRpc3BsYXllZC4KCSAqLwoJcHJpdmF0ZSBTZXQ8SVNpbXVsYXRpb24+IHNpbXVsYXRpb25zVG9EaXNwbGF5ID0gbmV3IExpbmtlZEhhc2hTZXQ8SVNpbXVsYXRpb24+KCk7CgoJLyoqCgkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgU2ltdWxhdGlvbk1hbmFnZXJ9IHRoYXQgaXMgdGhlIGlucHV0IHRvIHRoZSB2aWV3ZXIuIEl0CgkgKiBtYWludGFpbnMgYSBjb2xsZWN0aW9uIG9mIGFjdGl2ZQoJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cyBpbiB0aGUgc3lzdGVtLiBUaGlzCgkgKiB2aWV3ZXIgbGlzdGVucyB0byBpdCB0byBkaXNjb3ZlciB3aGVuIG5ldwoJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cyBhcmUgY3JlYXRlZCBhbmQgb2xkCgkgKiBvbmVzIGRpc2FwcGVhci4KCSAqIAoJICogQHNlZSAjc2ltdWxhdGlvbnNDaGFuZ2VkKFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQpCgkgKi8KCXByaXZhdGUgU2ltdWxhdGlvbk1hbmFnZXIgc2ltdWxhdGlvbk1hbmFnZXI7CgoJLyoqCgkgKiBUaGUgPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPiB0aGF0IHdhcyBtb3N0IHJlY2VudGx5IHNlbGVjdGVkIGJ5IGEgdXNlcgoJICogY2xpY2tpbmcgb24gb25lIG9mIHRoZQoJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwQ29udHJvbH1zLCBvcgoJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBoYXMgYmVlbiBzZWxlY3RlZC4KCSAqLwoJcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7CgoJLyoqCgkgKiBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBvZiB0aGUgdmlld2VyLiBJdCBjb250YWlucyB0aGUKCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLk1hcENvbnRyb2x9cyB0aGF0IGRpc3BsYXkKCSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQoJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cy4KCSAqLwoJcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwoKCS8qKgoJICogVGhpcyBpcyBhIGxpc3Qgb2YgbGlzdGVuZXJzIHRvIGdldCBub3RpZmljYXRpb25zIGFib3V0IG5ld2x5IGdlbmVyYXRlZAoJICogY29udGV4dCBtZW51cy4KCSAqLwoJcHJpdmF0ZSBMaXN0PElDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lcj4gY29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lcj4oKTsKCgkvKioKCSAqIEBwYXJhbSBwYXJlbnQKCSAqICAgICAgICAgICAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIGNvbnRyb2wgdGhhdCBtYWtlcyB1cCB0aGUgdmlld2VyCgkgKiBAcGFyYW0gZ2NmCgkgKiAgICAgICAgICAgIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBpbnN0YW5jZSBvZiB7QGxpbmsgR2VvZ3JhcGhpY0NvbnRyb2x9CgkgKi8KCXB1YmxpYyBHcmFwaE1hcFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CgkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7CgkJcmVmcmVzaCgpOwoJCWNvbXBvc2l0ZS5wYWNrKCk7Cgl9CgkKCUBPdmVycmlkZQoJcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKCQlyZXR1cm4gY29tcG9zaXRlOwoJfQoJCglAT3ZlcnJpZGUKCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKCQlyZXR1cm4gc2VsZWN0aW9uOwoJfQoJCglAT3ZlcnJpZGUKCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CgkJaWYgKHNpbXVsYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKCQkJc2ltdWxhdGlvbnNUb0Rpc3BsYXkuY2xlYXIoKTsKCQkJc2ltdWxhdGlvbnNUb0Rpc3BsYXkuYWRkQWxsKHNpbXVsYXRpb25NYW5hZ2VyCgkJCQkJLmdldEFjdGl2ZVNpbXVsYXRpb25zKCkpOwoJCX0KCQlwb3B1bGF0ZVZpZXcoKTsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewoJCXJldHVybiBzaW11bGF0aW9uTWFuYWdlcjsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKCQlPYmplY3Qgb2xkSW5wdXQgPSBzaW11bGF0aW9uTWFuYWdlcjsKCQlzaW11bGF0aW9uTWFuYWdlciA9IChTaW11bGF0aW9uTWFuYWdlcikgaW5wdXQ7CgkJaW5wdXRDaGFuZ2VkKGlucHV0LCBvbGRJbnB1dCk7Cgl9CgkKCUBPdmVycmlkZQoJcHJvdGVjdGVkIHZvaWQgaW5wdXRDaGFuZ2VkKE9iamVjdCBpbnB1dCwgT2JqZWN0IG9sZElucHV0KSB7CgkJLy8gSXMgdGhlcmUgYWxyZWFkeSBhIHNpbXVsYXRpb24gbWFuYWdlcj8KCQlpZiAob2xkSW5wdXQgIT0gbnVsbCkgewoJCQkoKFNpbXVsYXRpb25NYW5hZ2VyKSBvbGRJbnB1dCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7CgkJfQoKCQkvLyBSZWdpc3RlciB3aXRoIHRoZSBTaW11bGF0aW9uTWFuYWdlciB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgaW4gdGhlIHNldAoJCS8vIG9mIGFjdGl2ZSBTaW11bGF0aW9ucy4KCQkvLyBHb3QgaW5wdXQ/CgkJaWYgKGlucHV0ICE9IG51bGwpIHsKCQkJKChTaW11bGF0aW9uTWFuYWdlcikgaW5wdXQpLmFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIodGhpcyk7CgkJfQoKCQkvLyBVcGRhdGUgdGhlIHZpZXdlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IGlucHV0IHNvdXJjZQoJCXJlZnJlc2goKTsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKSB7CgkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Cgl9CgoJQE92ZXJyaWRlCglwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewoJCS8vIERpZCB0aGUgZXZlbnQgY29tZSBmcm9tIGEgR2VvZ3JhcGhpY0NvbnRyb2w/CgkJaWYgKGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkgaW5zdGFuY2VvZiBHcmFwaE1hcENvbnRyb2wpIHsKCQkJLy8gSnVzdCBwYXNzIGl0IGFsb25nCgkJCXNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwoJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7CgkJfQoJfQoKCUBPdmVycmlkZQoJcHVibGljIHZvaWQgc2ltdWxhdGlvbnNDaGFuZ2VkKFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgZXZlbnQpIHsKCQlzaW11bGF0aW9uc1RvRGlzcGxheS5hZGRBbGwoQXJyYXlzLmFzTGlzdChldmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkpKTsKCgkJc2ltdWxhdGlvbnNUb0Rpc3BsYXkucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoZXZlbnQKCQkJCS5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKSkpOwoKCQlwb3B1bGF0ZVZpZXcoKTsKCX0JCgoJLyoqCgkgKiBUaGUgbWV0aG9kIGFkZHMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMKCSAqIAoJICogQHBhcmFtIG5ld0xpc3RlbmVyCgkgKiAgICAgICAgICAgIEEgbGlzdGVuZXIgdG8gYmUgYWRkZWQKCSAqLwoJcHVibGljIHZvaWQgYWRkQ29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcigKCQkJSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyIG5ld0xpc3RlbmVyKSB7CgkJaWYgKCFjb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycy5jb250YWlucyhuZXdMaXN0ZW5lcikpIHsKCQkJY29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMuYWRkKG5ld0xpc3RlbmVyKTsKCQl9Cgl9CgoJLyoqCgkgKiBUaGUgbWV0aG9kIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMKCSAqIAoJICogQHBhcmFtIG5ld0xpc3RlbmVyCgkgKiAgICAgICAgICAgIEEgbGlzdGVuZXIgdG8gYmUgYWRkZWQKCSAqLwoJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcigKCQkJSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyIG5ld0xpc3RlbmVyKSB7CgkJY29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMucmVtb3ZlKG5ld0xpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBDcmVhdGUgYW5kIGRpc3Bvc2Ugb2YgTWFwQ29udHJvbHMgYXMgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhlIHNlbGVjdGVkCgkgKiBTaW11bGF0aW9ucy4KCSAqLwoJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmlldygpIHsKCQkvLyBBcmUgd2UgZG9uZT8KCQlpZiAoY29tcG9zaXRlLmlzRGlzcG9zZWQoKSkgewoJCQlyZXR1cm47CgkJfQoKCQlzZWxlY3Rpb24gPSBudWxsOwoKCQkvLyBGaW5kIHRoZSBTaW11bGF0aW9ucyB0aGF0IGFyZSBub3QgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCBhbmQgcHV0CgkJLy8gdGhlbSBpbnRvIHRoZSBTZXQgdW5kaXNwbGF5ZWRTaW11bGF0aW9ucy4KCQlTZXQ8SVNpbXVsYXRpb24+IHVuZGlzcGxheWVkU2ltdWxhdGlvbnMgPSBuZXcgSGFzaFNldDxJU2ltdWxhdGlvbj4oKTsKCQlmb3IgKElTaW11bGF0aW9uIHNpbXVsYXRpb24gOiBzaW11bGF0aW9uc1RvRGlzcGxheSkgewoJCQkvLyBJcyB0aGlzIG9uZSBhc3NvY2lhdGVkIHdpdGggYSBHZW9ncmFwaGljQ29udHJvbCBhbHJlYWR5PwoJCQlpZiAoIWlzRGlzcGxheWVkKHNpbXVsYXRpb24pKSB7CgkJCQl1bmRpc3BsYXllZFNpbXVsYXRpb25zLmFkZChzaW11bGF0aW9uKTsKCQkJfQoJCX0KCgkJLy8gR28gdGhyb3VnaCB0aGUgY3VycmVudCBzZXQgb2YgQ29udHJvbHMgbG9va2luZyBmb3Igb25lcyB0aGF0CgkJLy8gd2UgY2FuIHJlYXNzaWduCgkJQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CgkJZm9yIChDb250cm9sIGVsZW1lbnQgOiBjb250cm9scykgewoJCQkvLyBEb2VzIHRoaXMgR2VvZ3JhcGhpY0NvbnRyb2wgaGF2ZSBhIHNpbXVsYXRpb24gdGhhdCBpcyBzdGlsbCB2YWxpZAoJCQkvLyB0byBkaXNwbGF5PwoJCQlHcmFwaE1hcENvbnRyb2wgZ2VvQ29udHJvbCA9IChHcmFwaE1hcENvbnRyb2wpIGVsZW1lbnQ7CgkJCWlmICghc2ltdWxhdGlvbnNUb0Rpc3BsYXkuY29udGFpbnMoZ2VvQ29udHJvbC5nZXRTaW11bGF0aW9uKCkpCgkJCQkJJiYgIXVuZGlzcGxheWVkU2ltdWxhdGlvbnMuaXNFbXB0eSgpKSB7CgkJCQkvLyBSZWFzc2lnbiBpdCB0byBvbmUgdGhhdCBpcyB2YWxpZAoJCQkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IChJU2ltdWxhdGlvbikgdW5kaXNwbGF5ZWRTaW11bGF0aW9ucwoJCQkJCQkudG9BcnJheSgpWzBdOwoJCQkJZ2VvQ29udHJvbC5zZXRTaW11bGF0aW9uKHNpbXVsYXRpb24pOwoJCQkJLy8gTm90aWZ5IFZpZXdQYXJ0IHRoYXQgYSBuZXcgY29udGV4dCBtZW51IGhhcyBiZWVuIGdlbmVyYXRlZAoJCQkJbm90aWZ5Q29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMoZ2VvQ29udHJvbCk7CgkJCQl1bmRpc3BsYXllZFNpbXVsYXRpb25zLnJlbW92ZShzaW11bGF0aW9uKTsKCQkJfQoJCX0KCgkJLy8gQXQgdGhpcyBwb2ludCB3ZSBzdGlsbCBjb3VsZCBoYXZlIG1hcCBjb250cm9scyB3aXRoIGludmFsaWQKCQkvLyBTaW11bGF0aW9ucywgbGV0J3MgZ2V0IHJpZCBvZiB0aGVtCgkJZm9yIChDb250cm9sIGVsZW1lbnQgOiBjb250cm9scykgewoJCQlHcmFwaE1hcENvbnRyb2wgZ2VvQ29udHJvbCA9IChHcmFwaE1hcENvbnRyb2wpIGVsZW1lbnQ7CgkJCS8vIERvZXMgdGhpcyBNYXBDb250cm9sIGhhdmUgYSBzaW11bGF0aW9uIHRoYXQgaXMgc3RpbGwgdmFsaWQgdG8KCQkJLy8gZGlzcGxheT8KCQkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdlb0NvbnRyb2wuZ2V0U2ltdWxhdGlvbigpOwoJCQlpZiAoc2ltdWxhdGlvbiAhPSBudWxsCgkJCQkJJiYgIXNpbXVsYXRpb25zVG9EaXNwbGF5LmNvbnRhaW5zKHNpbXVsYXRpb24pKSB7CgkJCQlnZW9Db250cm9sLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKCQkJCWdlb0NvbnRyb2wuZGlzcG9zZSgpOwoJCQl9CgkJfQoKCQkvLyBJZiB0aGVyZSdyZSBhbnkgU2ltdWxhdGlvbnMgbm90IGFzc2lnbmVkIHRvIGEgR2VvZ3JhcGhpY0NvbnRyb2wsCgkJLy8gbGV0J3MgdGFrZSBjYXJlIG9mIHRoYXQgbm93LgoJCWZvciAoSVNpbXVsYXRpb24gc2ltdWxhdGlvbjIgOiB1bmRpc3BsYXllZFNpbXVsYXRpb25zKSB7CgkJCUdyYXBoTWFwQ29udHJvbCBnZW9Db250cm9sID0gbmV3IEdyYXBoTWFwQ29udHJvbChjb21wb3NpdGUsCgkJCQkJU1dULk5PTkUpOwoJCQkvLyBOb3RpZnkgVmlld1BhcnQgdGhhdCBhIG5ldyBjb250ZXh0IG1lbnUgaGFzIGJlZW4gZ2VuZXJhdGVkCgkJCW5vdGlmeUNvbnRleHRNZW51VXBkYXRlTGlzdGVuZXJzKGdlb0NvbnRyb2wpOwoJCQlnZW9Db250cm9sLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKCQkJZ2VvQ29udHJvbC5zZXRTaW11bGF0aW9uKHNpbXVsYXRpb24yKTsKCQl9CgoJCS8vIElmIHRoZXJlIGFyZSBubyBzaW11bGF0aW9ucyB0byBkaXNwbGF5LCB3ZSBqdXN0IHB1dCB1cCBhICJibGFuayIKCQkvLyBHZW9ncmFwaGljQ29udHJvbAoJCWlmIChjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgewoJCQlHcmFwaE1hcENvbnRyb2wgZ2VvQ29udHJvbCA9IG5ldyBHcmFwaE1hcENvbnRyb2woY29tcG9zaXRlLAoJCQkJCVNXVC5OT05FKTsKCQkJZ2VvQ29udHJvbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CgkJfQoKCQljb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOwoJCWNvbXBvc2l0ZS5yZWRyYXcoKTsKCX0KCQoJLyoqCgkgKiBAcGFyYW0gc2ltdWxhdGlvbgoJICogQHJldHVybgoJICovCglwcml2YXRlIGJvb2xlYW4gaXNEaXNwbGF5ZWQoSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgewoJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKCQlDb250cm9sW10gZm9vID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CgkJZm9yIChDb250cm9sIGVsZW1lbnQgOiBmb28pIHsKCQkJR3JhcGhNYXBDb250cm9sIGdlb0NvbnRyb2wgPSAoR3JhcGhNYXBDb250cm9sKSBlbGVtZW50OwoJCQlJU2ltdWxhdGlvbiB0ZXN0U2ltdWxhdGlvbiA9IGdlb0NvbnRyb2wuZ2V0U2ltdWxhdGlvbigpOwoJCQlpZiAodGVzdFNpbXVsYXRpb24gIT0gbnVsbCAmJiB0ZXN0U2ltdWxhdGlvbi5lcXVhbHMoc2ltdWxhdGlvbikpIHsKCQkJCXJldFZhbHVlID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiByZXRWYWx1ZTsKCX0KCgkvKioKCSAqIFRoZSBtZXRob2Qgd2lsbCBzZW5kIG5vdGlmaWNhdGlvbiB0byBhbGwgbGlzdGVuZXJzIGFib3V0IG5ldyBtZW51IHRoYXQKCSAqIGhhcyBiZWVuIGNyZWF0ZWQuCgkgKiAKCSAqIEBwYXJhbSBnZW9Db250cm9sCgkgKiAgICAgICAgICAgIFRoZSA8Y29kZT5HZW9ncmFwaGljQ29udHJvbDwvY29kZT4gdGhhdCBoYXMgdGhlIG5ldwoJICogICAgICAgICAgICA8Y29kZT5NZW51TWFuYWdlcjwvY29kZT4gYXMgYSBmaWVsZC4KCSAqLwoJcHJpdmF0ZSB2b2lkIG5vdGlmeUNvbnRleHRNZW51VXBkYXRlTGlzdGVuZXJzKEdyYXBoTWFwQ29udHJvbCBnZW9Db250cm9sKSB7CgkJR3JhcGhNYXBSZW5kZXJlciBnZW9SZW5kZXJlciA9IGdlb0NvbnRyb2wuZ2V0R2VvZ3JhcGhpY1JlbmRlcmVyKCk7CgkJCgkJZm9yIChJQ29udGV4dE1lbnVVcGRhdGVzTGlzdGVuZXIgbGlzdGVuZXIgOiBjb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycykgewoJCQlsaXN0ZW5lci5vbkNvbnRleHRNZW51VXBkYXRlKGdlb1JlbmRlcmVyLmdldE1lbnVNYW5hZ2VyKCksIGdlb1JlbmRlcmVyKTsKCQl9Cgl9Cgp9Cg==