cGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgpBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKoApDb250cmlidXRvcnM6CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7CmltcG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CmltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSUhlbHBDb250ZXh0SWRzOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7CgpwdWJsaWMgY2xhc3MgUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fRElBTE9HX1dJRFRIID0gMjAwOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9ESUFMT0dfSEVJR0hUID0gMjUwOwoJCglwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwoJcHJpdmF0ZSBBcnJheUxpc3QgcGVyc3BzOwoJcHJpdmF0ZSBJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGNob3NlblBlcnNwOwoJcHJpdmF0ZSBib29sZWFuIHNhbWVXaW5kb3cgPSB0cnVlOwoJCglwcml2YXRlIFRhYmxlVmlld2VyIGxpc3Q7CgkKCXByaXZhdGUgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7CgkJcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CgoJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2IxLCBPYmplY3Qgb2IyKSB7CgkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZDEgPSAoSVBlcnNwZWN0aXZlRGVzY3JpcHRvcikgb2IxOwoJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGQyID0gKElQZXJzcGVjdGl2ZURlc2NyaXB0b3IpIG9iMjsKCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUoZDEuZ2V0TGFiZWwoKSwgZDIuZ2V0TGFiZWwoKSk7CgkJfQoJfTsKCQoJLyoqCgkgKiBDcmVhdGUgYSBQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2cKCSAqIEBwYXJhbSB3aW5kb3cgdGhlIHdvcmtiZW5jaCB3aW5kb3cgbGF1bmNoaW5nIHRoaXMgZGlhbG9nCgkgKiBAcGFyYW0gcGVyc3BJZHMgdGhlIGxpc3Qgb2YgaWRzIHRoZSB1c2VyIGNhbiBjaG9vc2UgZnJvbQoJICovCglwdWJsaWMgUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBTdHJpbmdbXSBwZXJzcElkcykgewoJCXN1cGVyKHdpbmRvdy5nZXRTaGVsbCgpKTsKCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKCgkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7CgkJaWYgKHBhZ2UgIT0gbnVsbCkKCQkJY2hvc2VuUGVyc3AgPSBwYWdlLmdldFBlcnNwZWN0aXZlKCk7CgkJCgkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnID0gd2luZG93LmdldFdvcmtiZW5jaCgpLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKCQlwZXJzcHMgPSBuZXcgQXJyYXlMaXN0KHBlcnNwSWRzLmxlbmd0aCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJzcElkcy5sZW5ndGg7IGkrKykgewoJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2M7CgkJCWRlc2MgPSByZWcuZmluZFBlcnNwZWN0aXZlV2l0aElkKHBlcnNwSWRzW2ldKTsKCQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjICE9IGNob3NlblBlcnNwKQoJCQkJcGVyc3BzLmFkZChkZXNjKTsKCQl9CgkJQ29sbGVjdGlvbnMuc29ydChwZXJzcHMsIGNvbXBhcmF0b3IpOwoJCQoJCWlmIChjaG9zZW5QZXJzcCAhPSBudWxsKQoJCQlwZXJzcHMuYWRkKDAsY2hvc2VuUGVyc3ApOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgoJICovCglwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewoJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKCQlzaGVsbC5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHNoZWxsLCBJSGVscENvbnRleHRJZHMuU0hPV19QUk9KRUNUX1BFUlNQRUNUSVZFX0RJQUxPRyk7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCgkgKi8KCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewoJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgoJICovCglwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKCQkvLyBwYWdlIGdyb3VwCgkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKCQoJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CgkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwoJCWRhdGEud2lkdGhIaW50ID0gTUlOX0RJQUxPR19XSURUSDsKCQlkYXRhLmhlaWdodEhpbnQgPSBNSU5fRElBTE9HX0hFSUdIVDsKCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQoJCWNyZWF0ZVBlcnNwZWN0aXZlR3JvdXAoY29tcG9zaXRlKTsKCQljcmVhdGVPcHRpb25Hcm91cChjb21wb3NpdGUpOwoJCgkJaWYgKGNob3NlblBlcnNwICE9IG51bGwpCgkJCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNob3NlblBlcnNwKSk7CgkJCgkJcmV0dXJuIGNvbXBvc2l0ZTsKCX0KCQoJLyoqCgkgKiBDcmVhdGVzIHRoZSBwZXJzcGVjdGl2ZSBjaG9pY2UgY29udHJvbHMuCgkgKgoJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQoJICovCglwcml2YXRlIHZvaWQgY3JlYXRlUGVyc3BlY3RpdmVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7CgoJCS8vIExhYmVsIGZvciBjaG9vc2luZyBwZXJzcGVjdGl2ZQoJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwoJCWxhYmVsLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2cuY2hvb3NlUGVyc3BlY3RpdmUiKSk7IC8vJE5PTi1OTFMtMSQKCQkKCQkvLyBBZGQgcGVyc3BlY3RpdmUgbGlzdC4KCQlsaXN0ID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7CgkJbGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQZXJzcExhYmVsUHJvdmlkZXIoZmFsc2UpKTsKCQlsaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgUGVyc3BlY3RpdmVDb250ZW50UHJvdmlkZXIoKSk7CgkJbGlzdC5zZXRJbnB1dChwZXJzcHMpOwoJCWxpc3QuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpKTsKCQlsaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Cgl9CgkKCS8qKgoJICogQ3JlYXRlcyB0aGUgb3B0aW9uIGNvbnRyb2xzLgoJICoKCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKCSAqLwoJcHJpdmF0ZSB2b2lkIGNyZWF0ZU9wdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKCgkJLy8gQ3JlYXRlIHRoZSBvcHRpb24gZ3JvdXAKCQlHcm91cCBvcHRpb25Hcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5MRUZUKTsKCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CgkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwoJCW9wdGlvbkdyb3VwLnNldExheW91dERhdGEoZGF0YSk7CgkJb3B0aW9uR3JvdXAuc2V0VGV4dChXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2plY3RQZXJzcGVjdGl2ZUNob2ljZURpYWxvZy5vcHRpb25zIikpOyAvLyROT04tTkxTLTEkCgoJCS8vIFNhbWUgd2luZG93IG9wdGlvbgoJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbkdyb3VwLCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7CgkJYnV0dG9uLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2cuc2FtZVdpbmRvdyIpKTsgLy8kTk9OLU5MUy0xJAoJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKCQlidXR0b24uc2V0U2VsZWN0aW9uKHNhbWVXaW5kb3cpOwoJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewoJCQkJc2FtZVdpbmRvdyA9IHRydWU7CgkJCX0KCQl9KTsJCQoJCQoJCS8vIE5ldyB3aW5kb3cgb3B0aW9uCgkJYnV0dG9uID0gbmV3IEJ1dHRvbihvcHRpb25Hcm91cCwgU1dULlJBRElPIHwgU1dULkxFRlQpOwoJCWJ1dHRvbi5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nLm5ld1dpbmRvdyIpKTsgLy8kTk9OLU5MUy0xJAoJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKCQlidXR0b24uc2V0U2VsZWN0aW9uKCFzYW1lV2luZG93KTsKCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCXNhbWVXaW5kb3cgPSBmYWxzZTsKCQkJfQoJCX0pOwkJCgl9CgkKCS8qKgoJICogU2hvd3MgdGhlIGNob29zZW4gcGVyc3BlY3RpdmUgaW4gdGhlIHNhbWUgb3IKCSAqIG5ldyB3aW5kb3cgZGVwZW5kaW5nIG9uIHRoZSBvcHRpb24gY2hlY2tlZC4KCSAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCB3aW5kb3cgdGhlIHBlcnNwZWN0aXZlCgkgKiB3YXMgc2hvd24gaW4uCgkgKi8KCXB1YmxpYyBJV29ya2JlbmNoV2luZG93IHNob3dDaG9zZW5QZXJzcGVjdGl2ZSgpIHsKCQlpZiAoY2hvc2VuUGVyc3AgPT0gbnVsbCkKCQkJcmV0dXJuIHdpbmRvdzsKCQkKCQlmaW5hbCBJV29ya2JlbmNoV2luZG93W10gcmVzdWx0cyA9IG5ldyBJV29ya2JlbmNoV2luZG93WzFdOwoJCWZpbmFsIFdvcmtiZW5jaEV4Y2VwdGlvbltdIGVycm9ycyA9IG5ldyBXb3JrYmVuY2hFeGNlcHRpb25bMV07CgkJQnVzeUluZGljYXRvci5zaG93V2hpbGUod2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CgkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJCWlmIChzYW1lV2luZG93KSB7CgkJCQkJcmVzdWx0c1swXSA9IHdpbmRvdzsKCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKCQkJCQlpZiAocGFnZSAhPSBudWxsKQoJCQkJCQlwYWdlLnNldFBlcnNwZWN0aXZlKGNob3NlblBlcnNwKTsKCQkJCX0gZWxzZSB7CgkJCQkJdHJ5IHsKCQkJCQkJcmVzdWx0c1swXSA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKS5vcGVuV29ya2JlbmNoV2luZG93KAoJCQkJCQkJY2hvc2VuUGVyc3AuZ2V0SWQoKSwKCQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwoJCQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7CgkJCQkJCWVycm9yc1swXSA9IGU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSk7CgkJCgkJSVdvcmtiZW5jaFdpbmRvdyByZXN1bHQgPSByZXN1bHRzWzBdOwoJCXJlc3VsdHNbMF0gPSBudWxsOwoJCQoJCWlmIChlcnJvcnNbMF0gIT0gbnVsbCkgewoJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCgkJCQl3aW5kb3cuZ2V0U2hlbGwoKSwKCQkJCVdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiUHJvamVjdFBlcnNwZWN0aXZlQ2hvaWNlRGlhbG9nLmVycm9yVGl0bGUiKSwgLy8kTk9OLU5MUy0xJAoJCQkJV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9qZWN0UGVyc3BlY3RpdmVDaG9pY2VEaWFsb2cuZXJyb3JNZXNzYWdlIiksIC8vJE5PTi1OTFMtMSQKCQkJCWVycm9yc1swXS5nZXRTdGF0dXMoKSk7CgkJCWVycm9yc1swXSA9IG51bGw7CgkJCXJldHVybiB3aW5kb3c7CgkJfQoJCQoJCXJldHVybiByZXN1bHQ7Cgl9CgkKCWNsYXNzIFBlcnNwZWN0aXZlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewoJCXB1YmxpYyBQZXJzcGVjdGl2ZUNvbnRlbnRQcm92aWRlcigpIHsKCQkJc3VwZXIoKTsKCQl9CgkJCgkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQl9CgkJCgkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7CgkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7CgkJCQlyZXR1cm4gKChBcnJheUxpc3QpZWxlbWVudCkudG9BcnJheSgpOwoJCQl9CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKCQl9CgkJCgkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgkKCWNsYXNzIFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CgkJcHVibGljIFNlbGVjdGlvbkxpc3RlbmVyKCkgewoJCQlzdXBlcigpOwoJCX0KCQkKCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewoJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwoJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpCgkJCQljaG9zZW5QZXJzcCA9IChJUGVyc3BlY3RpdmVEZXNjcmlwdG9yKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKCQl9Cgl9Cn0K