------=_Part_7830015_289327145.1344531366470
Content-Type: multipart/alternative;
boundary="----=_Part_7830016_818349207.1344531366470"
------=_Part_7830016_818349207.1344531366470
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hi guys,
I've improved the original plugin infrastructure, please find the 2nd revision of UI
Plugins proof-of-concept (PoC) patch attached.
Here's a quick summary of changes:
* PluginSourcePageServlet looks up the actual plugin code in local filesystem
(<pluginName>.js), so you can experiment with different plugins. If you want to add
new plugins, just modify WebadminDynamicHostingServlet.writeAdditionalJsData() method.
* PluginManager now calls UiInit function on plugins (plugin objects) within the scope
of WebAdmin main section (user has logged in, main section UI is initialized and ready),
and disables plugin execution outside main section (e.g. when the user logs out) .
(Please find a sample plugin code attached as well. PluginSourcePageServlet tries to load
it from a hard-coded location in local filesystem, you probably want to modify this to
suit your environment.)
UiInit function is a special event handler function that gets called once, after plugin
reports as ready, and before other event handler functions are called. UiInit function
would be a good place to extend default WebAdmin UI (adding main tab, etc.).
This is illustrated on the following use case:
1. user requests WebAdmin page, during initialization a plugin iframe gets created and
attached to DOM, plugin HTML page gets requested asynchronously, application init code
still runs so iframe plugin code evaluation is blocked (this is because of JavaScript
runtime being single-threaded in its nature)
2. application init code finishes, plugin code gets evaluated, plugin registers itself
into pluginApi.plugins and reports back as ready (calls the ready function)
3. since the user is still in login section (not logged into WebAdmin), plugin
invocation is disabled, until the user logs in
4. user logs into the application, UI redirects to main section, and after UI gets
initialized, plugin invocation is enabled
5. UiInit function is called on the plugin
6. <NOT IMPLEMENTED YET> user performs some actions and WebAdmin calls different
functions on the plugin
7. assume the user logs out, plugin invocation is disabled, until the user logs in
again
8. user logs in again, but UiInit isn't called now because it has been called
already before
9. goto step 6
The reason why UiInit is called just once (after visiting main section for the first
time), is because WebAdmin UI (Views) are mostly singletons, so even when you switch to
different section (login section) and go to main section again, singleton Views will still
be there, with any adjustments/extensions made previously by plugins.
Now, as for the next steps, we can proceed with actual tasks Itamar outlined in his email:
* use UiInit event to extend UI (add main tab, etc.)
* define other events (table context menu event, etc.)
* allow plugins to do REST API calls through pluginApi object
I've tried to implement "add main tab" functionality. Unfortunately, this
isn't quite easy to do with GWT-Platform (GWTP) framework we use. Each tab in WebAdmin
has some place (GWT history token = URL hash fragment) associated. The way GWTP handles
tabs is that individual tabs (Presenter) reveal themselves into tab container
(TabContainerPresenter), with presenter reveal flow being processed bottom-up. I strongly
suggest to go through [
http://code.google.com/p/gwt-platform/wiki/GettingStarted] to get
some basic understanding of GWTP framework and how tabs work in general.
Long story short, to add tabs dynamically in a proper way, we need to write custom
presenter proxy, here are some links on this matter:
Discussion [
https://groups.google.com/forum/#!topic/gwt-platform/aJrGOf9Gu04/discussion ]
Dynamic tab example [
http://code.google.com/r/goudreauchristian-update/source/browse/ ]
Working demo [
http://olivier.monaco.free.fr/lab/gwtp-editor/]
So adding main/sub tabs is a task that will require some additional work, especially since
we wish to combine both static tabs and dynamic tabs in one tab container. I'll try to
work on this one.
On the other hand, it would be great if others could take the latest PoC patch (attached),
and experiment with other stuff like context menu events, REST API calls, etc. You can
always reach me on #ovirt (vszocs) if you have a question or need help with anything.
Cheers,
Vojtech
------=_Part_7830016_818349207.1344531366470
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D'text/css'>p { margin: 0;
}</style></head><body><=
div style=3D'font-family: times new roman,new york,times,serif; font-size: =
12pt; color: #000000'>Hi guys,<br><br>I've improved the original
plugin inf=
rastructure, please find the 2nd revision of UI Plugins proof-of-concept (P=
oC) patch attached.<br><br>Here's a quick summary of
changes:<br><ul><li>Pl=
uginSourcePageServlet looks up the actual plugin code in local filesystem (=
<pluginName>.js), so you can experiment with different plugins. If yo=
u want to add new plugins, just modify WebadminDynamicHostingServlet.writeA=
dditionalJsData() method.</li><li>PluginManager now calls
<em>UiInit</em> f=
unction on plugins (plugin objects) within the scope of WebAdmin main secti=
on (user has logged in, main section UI is initialized and ready), and disa=
bles plugin execution outside main section (e.g. when the user logs out).<b=
r></li></ul>(Please find a sample plugin code attached as well.
PluginSourc=
ePageServlet tries to load it from a hard-coded location in local filesyste=
m, you probably want to modify this to suit your
environment.)<br><br><span=
style=3D"font-style: italic;">UiInit</span> function is a special
event ha=
ndler function that gets called once, after plugin reports as ready, and be=
fore other event handler functions are called. <span style=3D"font-style: i=
talic;">UiInit</span> function would be a good place to extend default
WebA=
dmin UI (adding main tab, etc.).<br><br>This is illustrated on the followin=
g use case:<br><ol><li>user requests WebAdmin page, during
initialization a=
plugin iframe gets created and attached to DOM, plugin HTML page gets requ=
ested asynchronously, application init code still runs so iframe plugin cod=
e evaluation is blocked (this is because of JavaScript runtime being single=
-threaded in its nature)</li><li>application init code finishes, plugin cod=
e gets evaluated, plugin registers itself into <span style=3D"font-style: i=
talic;">pluginApi.plugins</span> and reports back as ready (calls the
<span=
style=3D"font-style: italic;">ready</span>
function)</li><li>since the use=
r is still in login section (not logged into WebAdmin), plugin invocation i=
s disabled, until the user logs in</li><li>user logs into the application, =
UI redirects to main section, and after UI gets initialized, plugin invocat=
ion is enabled</li><li><span style=3D"font-style:
italic;">UiInit</span> fu=
nction is called on the plugin</li><li><NOT IMPLEMENTED YET>
user per=
forms some actions and WebAdmin calls different functions on the plugin</li=
<li>assume the user logs out, plugin invocation is disabled,
until the use=
r logs in again</li><li>user logs in again, but <span
style=3D"font-style: =
italic;">UiInit</span> isn't called now because it has been called
already =
before</li><li>goto step 6<br></li></ol>The reason why
<span style=3D"font-=
style: italic;">UiInit</span> is called just once (after visiting main
sect=
ion for the first time), is because WebAdmin UI (Views) are mostly singleto=
ns, so even when you switch to different section (login section) and go to =
main section again, singleton Views will still be there, with any adjustmen=
ts/extensions made previously by plugins.<br><br>Now, as for the next steps=
, we can proceed with actual tasks Itamar outlined in his
email:<br><ul><li=
use <span style=3D"font-style:
italic;">UiInit</span> event to extend UI (=
add main tab,
etc.)</li><li>define other events (table context menu event, =
etc.)<br></li><li>allow plugins to do REST API calls through <span
style=3D=
"font-style: italic;">pluginApi</span>
object<br></li></ul>I've tried to im=
plement "add main tab" functionality. Unfortunately, this isn't quite easy
=
to do with GWT-Platform (GWTP) framework we use. Each tab in WebAdmin has s=
ome place (GWT history token =3D URL hash fragment) associated. The way GWT=
P handles tabs is that individual tabs (Presenter) reveal themselves into t=
ab container (TabContainerPresenter), with presenter reveal flow being proc=
essed bottom-up. I strongly suggest to go through [
http://code.google.com/p=
/gwt-platform/wiki/GettingStarted] to get some basic understanding of GWTP =
framework and how tabs work in general.<br><br>Long story short, to add tab=
s dynamically in a proper way, we need to write custom presenter proxy, her=
e are some links on this matter:<br>Discussion [
https://groups.google.com/f=
orum/#!topic/gwt-platform/aJrGOf9Gu04/discussion]<br>Dynamic tab example [h=
ttp://code.google.com/r/goudreauchristian-update/source/browse/]<br>...
demo [
http://olivier.monaco.free.fr/lab/gwtp-editor/]<br><br>So adding mai=
n/sub tabs is a task that will require some additional work, especially sin=
ce we wish to combine both static tabs and dynamic tabs in one tab containe=
r. I'll try to work on this one.<br><br>On the other hand, it would be
grea=
t if others could take the latest PoC patch (attached), and experiment with=
other stuff like context menu events, REST API calls, etc. You can always =
reach me on #ovirt (vszocs) if you have a question or need help with anythi=
ng.<br><br>Cheers,<br>Vojtech<br><br></div></body></html>
------=_Part_7830016_818349207.1344531366470--
------=_Part_7830015_289327145.1344531366470
Content-Type: application/octet-stream; name=myPlugin.js.example
Content-Disposition: attachment; filename=myPlugin.js.example
Content-Transfer-Encoding: base64
d2luZG93LmFsZXJ0KCdJbnZva2luZyBhY3R1YWwgcGx1Z2luIGNvZGUhJyk7CndpbmRvdy5hbGVy
dCgnUmVhZGluZyBwbHVnaW4gY29uZmlndXJhdGlvbjogJyArIHBsdWdpbkNvbmZpZy5mb28pOwoK
cGx1Z2luQXBpLnBsdWdpbnNbJ215UGx1Z2luJ10gPSB7CiAgICAgICAgVWlJbml0OiBmdW5jdGlv
bigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydCgnV29vaG9vLCBVaUluaXQgcmVhY2hl
ZCEnKTsKICAgICAgICB9Cn07CgpwbHVnaW5BcGkucmVhZHkoJ215UGx1Z2luJyk7Cg==
------=_Part_7830015_289327145.1344531366470
Content-Type: text/x-patch; name=0001-WIP-UI-Plugins-PoC-revision-2.patch
Content-Disposition: attachment;
filename=0001-WIP-UI-Plugins-PoC-revision-2.patch
Content-Transfer-Encoding: base64
RnJvbSA2OGEzNjc1NWMxZjg1ODgyMjRkZTBjZTM2OTEwYzU3NGIzM2E2NGU2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0
ZTogVGh1LCAxOSBKdWwgMjAxMiAxNDo0ODo0MCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFdJUDog
VUkgUGx1Z2lucyBQb0MsIHJldmlzaW9uIDIKCkNoYW5nZS1JZDogSWQyODgxMmRkYmU5MDU3NGRl
MDE3OGYwYzA3ZGE3MTNmZTlmZDhjZGEKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBTem9jcyA8dnN6
b2NzQHJlZGhhdC5jb20+Ci0tLQogLi4uL3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2Vy
dmxldC5qYXZhICAgICAgfCAgICAxICsKIC4uLi9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VT
ZXJ2bGV0LmphdmEgICAgICAgIHwgIDExMSArKysrKysrKysrKwogLi4uL3NlcnZlci9nd3QvV2Vi
YWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQuamF2YSAgfCAgICA0ICsKIC4uLi9vdmlydC9lbmdp
bmUvdWkvd2ViYWRtaW4vZ2luL1N5c3RlbU1vZHVsZS5qYXZhIHwgICAgNCArCiAuLi4vdWkvd2Vi
YWRtaW4vcGx1Z2luL1BsdWdpbkRlZmluaXRpb25zLmphdmEgICAgICB8ICAgMzAgKysrCiAuLi4v
dWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxlci5qYXZhICAgICB8ICAgMjMgKysr
CiAuLi4vZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NYW5hZ2VyLmphdmEgICB8ICAx
OTkgKysrKysrKysrKysrKysrKysrKysKIC4uLi9tYWluL3ByZXNlbnRlci9NYWluU2VjdGlvblBy
ZXNlbnRlci5qYXZhICAgICAgIHwgICAxNyArKy0KIC4uLi93ZWJhZG1pbi9zcmMvbWFpbi93ZWJh
cHAvV0VCLUlORi93ZWIueG1sICAgICAgIHwgICAxMCArCiA5IGZpbGVzIGNoYW5nZWQsIDM5OCBp
bnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5l
L3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YQogY3Jl
YXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h
aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZpbml0
aW9ucy5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93
ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2lu
L1BsdWdpbkV2ZW50SGFuZGxlci5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2Vi
YWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv
d2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1hbmFnZXIuamF2YQoKZGlmZiAtLWdpdCBhL2Zyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5l
L3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2VydmxldC5qYXZhIGIv
ZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmly
dC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0
LmphdmEKaW5kZXggZjE5NzM5YS4uNjg1ZTY4NSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv
bnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKKysrIGIvZnJv
bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0Lmph
dmEKQEAgLTQ2LDYgKzQ2LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEd3dER5bmFtaWNIb3N0
UGFnZVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgZG9H
ZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9u
c2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJl
c3BvbnNlLmdldFdyaXRlcigpOwogICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4
dC9odG1sOyBjaGFyc2V0PVVURi04Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcmVzcG9uc2Uu
c2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7IC8vJE5PTi1OTFMtMSQgLy8k
Tk9OLU5MUy0yJAogCiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwhRE9DVFlQRSBodG1sPjxodG1s
PjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjxtZXRhIGh0
dHAtZXF1aXY9XCJjb250ZW50LXR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVU
Ri04XCI+Iik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v
ZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5k
L3NlcnZlci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFk
bWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zy
b250ZW5kL3NlcnZlci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDM0MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJv
bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5qYXZh
CkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQu
c2VydmVyLmd3dDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2
YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5p
by5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBq
YXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3Jp
dGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1w
b3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBq
YXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRw
Lkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZs
ZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2lt
cG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFJl
bmRlcnMgdGhlIEhUTUwgc291cmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiBVSSBwbHVnaW4uCisgKi8K
K3B1YmxpYyBjbGFzcyBQbHVnaW5Tb3VyY2VQYWdlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0
IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFM
OworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBs
dWdpblNvdXJjZVBhZ2VTZXJ2bGV0LmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3Rl
Y3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJl
c3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWFkIHBs
dWdpbiBuYW1lIGFzIEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgICAgU3RyaW5nIHBsdWdp
bk5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKKyAg
ICAgICAgaWYgKHBsdWdpbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9y
KCJNaXNzaW5nIHBsdWdpbiBuYW1lIHJlcXVlc3QgcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQK
KyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JB
RF9SRVFVRVNUKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IExvY2F0ZSBwbHVnaW4gY29kZSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICAgICAgICAvLyBUT0RP
IGhhcmQtY29kZWQgcGx1Z2luIGxvY2F0aW9uCisgICAgICAgIEZpbGUgcGx1Z2luQ29kZUxvY2F0
aW9uID0gbmV3IEZpbGUoIi9ob21lL3Zzem9jcy9Eb3dubG9hZHMiKTsgLy8kTk9OLU5MUy0xJAor
ICAgICAgICBGaWxlIHBsdWdpbkNvZGVGaWxlID0gbmV3IEZpbGUocGx1Z2luQ29kZUxvY2F0aW9u
LCBwbHVnaW5OYW1lICsgIi5qcyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGlmICghcGx1Z2lu
Q29kZUZpbGUuaXNGaWxlKCkgfHwgIXBsdWdpbkNvZGVGaWxlLmNhblJlYWQoKSkgeworICAgICAg
ICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgcmVhZCBwbHVnaW4gY29kZTogIiArIHBsdWdpbkNv
ZGVGaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgcmVz
cG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8gc2ltdWxhdGUgcGx1
Z2luIGRlcGVuZGVuY2llcworICAgICAgICBMaXN0PFN0cmluZz4gcGx1Z2luRGVwZW5kZW5jeUxp
c3QgPQorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoImh0dHBzOi8vYWpheC5nb29nbGVh
cGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNy4yL2pxdWVyeS5taW4uanMiKTsgLy8kTk9OLU5M
Uy0xJAorCisgICAgICAgIC8vIFRPRE8gc2ltdWxhdGUgcGx1Z2luIGNvbmZpZ3VyYXRpb24KKyAg
ICAgICAgU3RyaW5nIHBsdWdpbkNvbmZpZ3VyYXRpb25PYmplY3QgPSAieyBcImZvb1wiOiAxMjMg
fSI7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICAvLyBSZW5kZXIgSFRNTCBzb3VyY2UgcGFnZSB0
byB0aGUgb3V0cHV0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7
IGNoYXJzZXQ9VVRGLTgiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICByZXNwb25zZS5zZXRIZWFk
ZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxT
LTIkCisKKyAgICAgICAgUmVhZGVyIGluID0gbnVsbDsKKyAgICAgICAgV3JpdGVyIG91dCA9IG51
bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVy
KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHBsdWdpbkNvZGVGaWxl
KSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVy
ZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0o
KSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgICAgIHJlbmRlclBsdWdpblNv
dXJjZVBhZ2UoaW4sIHBsdWdpbkRlcGVuZGVuY3lMaXN0LCBwbHVnaW5Db25maWd1cmF0aW9uT2Jq
ZWN0LCBvdXQpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0gZmluYWxseSB7
CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluLmNsb3Nl
KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlbmRlclBs
dWdpblNvdXJjZVBhZ2UoUmVhZGVyIHBsdWdpbkNvZGVJbnB1dCwgTGlzdDxTdHJpbmc+IHBsdWdp
bkRlcGVuZGVuY3lMaXN0LAorICAgICAgICAgICAgU3RyaW5nIHBsdWdpbkNvbmZpZ3VyYXRpb25P
YmplY3QsIFdyaXRlciBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dHB1
dC53cml0ZSgiPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKKyAg
ICAgICAgb3V0cHV0LndyaXRlKCI8bWV0YSBodHRwLWVxdWl2PVwiY29udGVudC10eXBlXCIgY29u
dGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiPiIpOyAvLyROT04tTkxTLTEkCisKKyAg
ICAgICAgZm9yIChTdHJpbmcgZGVwZW5kZW5jeSA6IHBsdWdpbkRlcGVuZGVuY3lMaXN0KSB7Cisg
ICAgICAgICAgICBvdXRwdXQud3JpdGUoIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwi
IHNyYz1cIiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBvdXRwdXQud3JpdGUoZGVwZW5k
ZW5jeSk7CisgICAgICAgICAgICBvdXRwdXQud3JpdGUoIlwiPjwvc2NyaXB0PiIpOyAvLyROT04t
TkxTLTEkCisgICAgICAgIH0KKworICAgICAgICBvdXRwdXQud3JpdGUoIjwvaGVhZD48Ym9keT4i
KTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBvdXRwdXQud3JpdGUoIjxzY3JpcHQgdHlwZT1cInRl
eHQvamF2YXNjcmlwdFwiPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgi
KGZ1bmN0aW9uKCBwbHVnaW5BcGksIHBsdWdpbkNvbmZpZyApIHsiKTsgLy8kTk9OLU5MUy0xJAor
CisgICAgICAgIGNvcHlDaGFycyhwbHVnaW5Db2RlSW5wdXQsIG91dHB1dCk7CisKKyAgICAgICAg
b3V0cHV0LndyaXRlKCJ9KSAoIHBhcmVudC5wbHVnaW5BcGksICIpOyAvLyROT04tTkxTLTEkCisg
ICAgICAgIG91dHB1dC53cml0ZShwbHVnaW5Db25maWd1cmF0aW9uT2JqZWN0KTsKKyAgICAgICAg
b3V0cHV0LndyaXRlKCIgKTsiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBvdXRwdXQud3JpdGUo
Ijwvc2NyaXB0PiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPC9ib2R5
PjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAorICAgIH0KKworICAgIHZvaWQgY29weUNoYXJzKFJl
YWRlciBpbiwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltd
IGJ1ZmZlciA9IG5ldyBjaGFyWzQgKiAxMDI0XTsgLy8gVXNlIDQga0IgYnVmZmVyCisgICAgICAg
IGludCBudW1SZWFkID0gMDsKKworICAgICAgICB3aGlsZSAoKG51bVJlYWQgPSBpbi5yZWFkKGJ1
ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpID4gMCkgeworICAgICAgICAgICAgb3V0LndyaXRlKGJ1
ZmZlciwgMCwgbnVtUmVhZCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Zy
b250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv
ZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZs
ZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvV2ViYWRtaW5EeW5hbWlj
SG9zdGluZ1NlcnZsZXQuamF2YQppbmRleCA0MjhkY2M1Li5kY2FmNDlhIDEwMDY0NAotLS0gYS9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3JnL292aXJ0
L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1dlYmFkbWluRHluYW1pY0hvc3RpbmdTZXJ2
bGV0LmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFp
bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9XZWJhZG1pbkR5
bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhCkBAIC0zNiw2ICszNiwxMCBAQCBwdWJsaWMgY2xhc3Mg
V2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQgZXh0ZW5kcyBHd3REeW5hbWljSG9zdFBhZ2VT
ZXJ2bGV0IHsKICAgICAgICAgICAgIGFwcE1vZGVEYXRhLnB1dCgidmFsdWUiLCBTdHJpbmcudmFs
dWVPZihhcHBsaWNhdGlvbk1vZGUpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgd3JpdGVK
c09iamVjdCh3cml0ZXIsICJhcHBsaWNhdGlvbk1vZGUiLCBhcHBNb2RlRGF0YSk7IC8vJE5PTi1O
TFMtMSQKICAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGx1Z2luRGVm
aW5pdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcGx1Z2lu
RGVmaW5pdGlvbnMucHV0KCJteVBsdWdpbiIsICIvd2ViYWRtaW4vd2ViYWRtaW4vUGx1Z2luU291
cmNlUGFnZT9wbHVnaW49bXlQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisg
ICAgICAgIHdyaXRlSnNPYmplY3Qod3JpdGVyLCAicGx1Z2luRGVmaW5pdGlvbnMiLCBwbHVnaW5E
ZWZpbml0aW9ucyk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICBwcml2YXRlIEludGVnZXIg
Z2V0QXBwbGljYXRpb25Nb2RlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CmRpZmYgLS1n
aXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3Jn
L292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vU3lzdGVtTW9kdWxlLmphdmEgYi9mcm9udGVu
ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu
ZS91aS93ZWJhZG1pbi9naW4vU3lzdGVtTW9kdWxlLmphdmEKaW5kZXggMzA2OWI5OS4uYjA0OTY4
MyAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp
bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1N5c3RlbU1vZHVsZS5qYXZh
CisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9v
cmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9TeXN0ZW1Nb2R1bGUuamF2YQpAQCAtOSw2
ICs5LDggQEAgaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uQXBwbGljYXRpb25S
ZXNvdXJjZXM7CiBpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5BcHBsaWNhdGlv
blRlbXBsYXRlczsKIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsYWNlLkFw
cGxpY2F0aW9uUGxhY2VzOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGxh
Y2UuV2ViQWRtaW5QbGFjZU1hbmFnZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJh
ZG1pbi5wbHVnaW4uUGx1Z2luRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu
dWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CiBpbXBvcnQgb3JnLm92aXJ0LmVuZ2lu
ZS51aS53ZWJhZG1pbi5zeXN0ZW0uQXBwbGljYXRpb25Jbml0OwogaW1wb3J0IG9yZy5vdmlydC5l
bmdpbmUudWkud2ViYWRtaW4uc3lzdGVtLkludGVybmFsQ29uZmlndXJhdGlvbjsKIApAQCAtMzEs
NiArMzMsOCBAQCBwdWJsaWMgY2xhc3MgU3lzdGVtTW9kdWxlIGV4dGVuZHMgQmFzZVN5c3RlbU1v
ZHVsZSB7CiAgICAgICAgIGJpbmQoUGxhY2VNYW5hZ2VyLmNsYXNzKS50byhXZWJBZG1pblBsYWNl
TWFuYWdlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKICAgICAgICAgYmluZChBcHBsaWNh
dGlvbkluaXQuY2xhc3MpLmFzRWFnZXJTaW5nbGV0b24oKTsKICAgICAgICAgYmluZChJbnRlcm5h
bENvbmZpZ3VyYXRpb24uY2xhc3MpLmFzRWFnZXJTaW5nbGV0b24oKTsKKyAgICAgICAgYmluZChQ
bHVnaW5NYW5hZ2VyLmNsYXNzKS5hc0VhZ2VyU2luZ2xldG9uKCk7CisgICAgICAgIGJpbmQoUGx1
Z2luRXZlbnRIYW5kbGVyLmNsYXNzKS5hc0VhZ2VyU2luZ2xldG9uKCk7CiAgICAgfQogCiAgICAg
dm9pZCBiaW5kQ29uZmlndXJhdGlvbigpIHsKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWlu
L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk
bWluL3BsdWdpbi9QbHVnaW5EZWZpbml0aW9ucy5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9k
dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v
cGx1Z2luL1BsdWdpbkRlZmluaXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uZDExMThjYgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21v
ZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWlu
L3BsdWdpbi9QbHVnaW5EZWZpbml0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2Ug
b3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xl
Lmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0
LmNvcmUuY2xpZW50LkpzQXJyYXlTdHJpbmc7CisKKy8qKgorICogT3ZlcmxheSB0eXBlIGZvciB7
QGNvZGUgcGx1Z2luRGVmaW5pdGlvbnN9IGdsb2JhbCBKUyBvYmplY3QuCisgKi8KK3B1YmxpYyBm
aW5hbCBjbGFzcyBQbHVnaW5EZWZpbml0aW9ucyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Qgewor
CisgICAgcHJvdGVjdGVkIFBsdWdpbkRlZmluaXRpb25zKCkgeworICAgIH0KKworICAgIHB1Ymxp
YyBzdGF0aWMgbmF0aXZlIFBsdWdpbkRlZmluaXRpb25zIGluc3RhbmNlKCkgLyoteworICAgICAg
ICByZXR1cm4gJHduZC5wbHVnaW5EZWZpbml0aW9uczsKKyAgICB9LSovOworCisgICAgcHVibGlj
IG5hdGl2ZSBKc0FycmF5U3RyaW5nIGdldFBsdWdpbk5hbWVzKCkgLyoteworICAgICAgICB2YXIg
cGx1Z2luTmFtZXMgPSBbXTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMpIHsKKyAgICAg
ICAgICAgIHBsdWdpbk5hbWVzLnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
cGx1Z2luTmFtZXM7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBuYXRpdmUgU3RyaW5nIGdldFBs
dWdpblNvdXJjZVBhZ2VVcmwoU3RyaW5nIHBsdWdpbk5hbWUpIC8qLXsKKyAgICAgICAgcmV0dXJu
IHRoaXNbcGx1Z2luTmFtZV07CisgICAgfS0qLzsKKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQv
d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv
dWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxlci5qYXZhIGIvZnJvbnRlbmQvd2Vi
YWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv
d2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmNiYWZiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRXZlbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMyBA
QAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbjsKKworaW1wb3J0
IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5FdmVudEJ1czsKK2ltcG9ydCBjb20uZ29vZ2xl
LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogSGFuZGxlcyBXZWJBZG1pbiBhcHBsaWNhdGlvbiBl
dmVudHMgKGV4dGVuc2lvbiBwb2ludHMpIHRvIGJlIGNvbnN1bWVkIGJ5IFVJIHBsdWdpbnMuCisg
KiA8cD4KKyAqIFNob3VsZCBiZSBib3VuZCBhcyBHSU4gZWFnZXIgc2luZ2xldG9uLCBjcmVhdGVk
IGVhcmx5IG9uIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwLgorICovCitwdWJsaWMgY2xhc3Mg
UGx1Z2luRXZlbnRIYW5kbGVyIHsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgUGx1Z2luRXZl
bnRIYW5kbGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBQbHVnaW5NYW5hZ2VyIG1hbmFnZXIpIHsKKy8v
ICAgICAgICBldmVudEJ1cy5hZGRIYW5kbGVyKEV4dFVzZXJMb2dpbkV2ZW50LmdldFR5cGUoKSwg
bmV3IEV4dFVzZXJMb2dpbkhhbmRsZXIoKSB7CisvLyAgICAgICAgICAgIEBPdmVycmlkZQorLy8g
ICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV4dFVzZXJMb2dpbihFeHRVc2VyTG9naW5FdmVudCBl
dmVudCkgeworLy8gICAgICAgICAgICAgICAgaW52b2tlUGx1Z2lucygiVXNlckxvZ2luIik7Cisv
LyAgICAgICAgICAgIH0KKy8vICAgICAgICB9KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Zy
b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv
ZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NYW5hZ2VyLmphdmEgYi9mcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjU2NjNhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJh
ZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93
ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACitwYWNr
YWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQgamF2YS51
dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGls
Lk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxv
Z2dlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmpl
Y3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheVN0cmluZzsKK2lt
cG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkRvY3VtZW50OworaW1wb3J0IGNvbS5nb29n
bGUuZ3d0LmRvbS5jbGllbnQuSUZyYW1lRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5k
b20uY2xpZW50LlN0eWxlLkJvcmRlclN0eWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5j
bGllbnQuU3R5bGUuUG9zaXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5T
dHlsZS5Vbml0OworCisvKioKKyAqIFRoZSBtYWluIGNvbXBvbmVudCBvZiBXZWJBZG1pbiBVSSBw
bHVnaW4gaW5mcmFzdHJ1Y3R1cmUuCisgKiA8cD4KKyAqIFNob3VsZCBiZSBib3VuZCBhcyBHSU4g
ZWFnZXIgc2luZ2xldG9uLCBjcmVhdGVkIGVhcmx5IG9uIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFy
dHVwLgorICovCitwdWJsaWMgY2xhc3MgUGx1Z2luTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0
YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQbHVnaW5NYW5hZ2Vy
LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvLyBNYXBzIHBsdWdpbiBuYW1lcyB0byBjb3JyZXNw
b25kaW5nIGlmcmFtZSBlbGVtZW50cworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSUZy
YW1lRWxlbWVudD4gcGx1Z2luSUZyYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUZyYW1lRWxl
bWVudD4oKTsKKworICAgIC8vIE1hcHMgcGx1Z2luIG5hbWVzIHRvIGNvcnJlc3BvbmRpbmcgcGx1
Z2luIG9iamVjdHMgKG9ubHkgZm9yIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJlbnRseSByZWFkeSkK
KyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEphdmFTY3JpcHRPYmplY3Q+IHBsdWdpbk9i
amVjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEphdmFTY3JpcHRPYmplY3Q+KCk7CisKKyAgICAv
LyBDb250YWlucyBwbHVnaW4gbmFtZXMgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIGJlZW4gaW5pdGlh
bGl6ZWQKKyAgICAvLyAoVWlJbml0IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gd2FzIGFscmVhZHkg
Y2FsbGVkIG9uIGNvcnJlc3BvbmRpbmcgcGx1Z2luIG9iamVjdHMpCisgICAgcHJpdmF0ZSBmaW5h
bCBTZXQ8U3RyaW5nPiBpbml0aWFsaXplZFBsdWdpbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7
CisKKyAgICAvLyBDb250cm9scyBwbHVnaW4gaW52b2NhdGlvbiwgYWxsb3dpbmcgV2ViQWRtaW4g
dG8gY2FsbCBwbHVnaW5zIG9ubHkgd2l0aGluIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gY29udGV4
dAorICAgIHByaXZhdGUgYm9vbGVhbiBjYW5JbnZva2VQbHVnaW5zID0gZmFsc2U7CisKKyAgICBw
dWJsaWMgUGx1Z2luTWFuYWdlcigpIHsKKyAgICAgICAgZXhwb3NlUGx1Z2luQXBpKCk7CisgICAg
ICAgIGxvYWRQbHVnaW5zKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4g
V2ViQWRtaW4gZW50ZXJzIHRoZSBzdGF0ZSB0aGF0IGFsbG93cyBwbHVnaW5zIHRvIGJlIGludm9r
ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5hYmxlUGx1Z2luSW52b2NhdGlvbigpIHsK
KyAgICAgICAgY2FuSW52b2tlUGx1Z2lucyA9IHRydWU7CisKKyAgICAgICAgLy8gVHJ5IHRvIGlu
aXRpYWxpemUgYWxsIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJlbnRseSByZWFkeQorICAgICAgICBm
b3IgKFN0cmluZyBwbHVnaW5OYW1lIDogcGx1Z2luT2JqZWN0cy5rZXlTZXQoKSkgeworICAgICAg
ICAgICAgaW5pdFBsdWdpbihwbHVnaW5OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8q
KgorICAgICAqIENhbGxlZCB3aGVuIFdlYkFkbWluIGxlYXZlcyB0aGUgc3RhdGUgdGhhdCBhbGxv
d3MgcGx1Z2lucyB0byBiZSBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Fi
bGVQbHVnaW5JbnZvY2F0aW9uKCkgeworICAgICAgICBjYW5JbnZva2VQbHVnaW5zID0gZmFsc2U7
CisgICAgfQorCisgICAgYm9vbGVhbiBpc1BsdWdpblJlYWR5KFN0cmluZyBwbHVnaW5OYW1lKSB7
CisgICAgICAgIHJldHVybiBwbHVnaW5PYmplY3RzLmNvbnRhaW5zS2V5KHBsdWdpbk5hbWUpOwor
ICAgIH0KKworICAgIGJvb2xlYW4gaXNQbHVnaW5Jbml0aWFsaXplZChTdHJpbmcgcGx1Z2luTmFt
ZSkgeworICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbk5h
bWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGdpdmVuIHBsdWdp
biBieSBjYWxsaW5nIFVpSW5pdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIG9uIHRoZSBjb3JyZXNw
b25kaW5nIHBsdWdpbiBvYmplY3QuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IFVpSW5p
dCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGp1c3Qgb25jZSBkdXJpbmcg
dGhlIGxpZmV0aW1lIG9mIGEgcGx1Z2luLgorICAgICAqLworICAgIHZvaWQgaW5pdFBsdWdpbihT
dHJpbmcgcGx1Z2luTmFtZSkgeworICAgICAgICBpZiAoY2FuSW52b2tlUGx1Z2lucyAmJiBpc1Bs
dWdpblJlYWR5KHBsdWdpbk5hbWUpICYmICFpc1BsdWdpbkluaXRpYWxpemVkKHBsdWdpbk5hbWUp
KSB7CisgICAgICAgICAgICBKYXZhU2NyaXB0T2JqZWN0IHBsdWdpbk9iamVjdCA9IHBsdWdpbk9i
amVjdHMuZ2V0KHBsdWdpbk5hbWUpOworICAgICAgICAgICAgaW52b2tlUGx1Z2luKHBsdWdpbk9i
amVjdCwgIlVpSW5pdCIsIG51bGwpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgICAgIGluaXRp
YWxpemVkUGx1Z2lucy5hZGQocGx1Z2luTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
KioKKyAgICAgKiBJbnZva2VzIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gb24gYWxsIHBsdWdp
bnMgd2hpY2ggYXJlIGN1cnJlbnRseSByZWFkeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBp
bnZva2VQbHVnaW5zKFN0cmluZyBmdW5jdGlvbk5hbWUsIEphdmFTY3JpcHRPYmplY3QgY29udGV4
dE9iamVjdCkgeworICAgICAgICBpZiAoY2FuSW52b2tlUGx1Z2lucykgeworICAgICAgICAgICAg
Zm9yIChTdHJpbmcgcGx1Z2luTmFtZSA6IHBsdWdpbk9iamVjdHMua2V5U2V0KCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoaXNQbHVnaW5Jbml0aWFsaXplZChwbHVnaW5OYW1lKSkgeworICAgICAg
ICAgICAgICAgICAgICBpbnZva2VQbHVnaW4ocGx1Z2luT2JqZWN0cy5nZXQocGx1Z2luTmFtZSks
IGZ1bmN0aW9uTmFtZSwgY29udGV4dE9iamVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyBhbiBl
dmVudCBoYW5kbGVyIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBwbHVnaW4gb2JqZWN0LgorICAgICAq
LworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgaW52b2tlUGx1Z2luKEphdmFTY3JpcHRPYmplY3Qg
cGx1Z2luT2JqZWN0LCBTdHJpbmcgZnVuY3Rpb25OYW1lLCBKYXZhU2NyaXB0T2JqZWN0IGNvbnRl
eHRPYmplY3QpIC8qLXsKKyAgICAgICAgdmFyIGhhbmRsZXJGdW5jdGlvbiA9IHBsdWdpbk9iamVj
dFtmdW5jdGlvbk5hbWVdOworCisgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlckZ1bmN0aW9uID09
PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dE9iamVjdCAhPSBudWxsKSB7
CisgICAgICAgICAgICAgICAgaGFuZGxlckZ1bmN0aW9uKGNvbnRleHRPYmplY3QpOworICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyRnVuY3Rpb24oKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBh
bGwgcGx1Z2lucyB0aGF0IHdlcmUgZGV0ZWN0ZWQgd2hlbiBzZXJ2aW5nIFdlYkFkbWluIGhvc3Qg
cGFnZS4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRQbHVnaW5zKCkgeworICAgICAgICBQbHVnaW5E
ZWZpbml0aW9ucyBkZWZzID0gUGx1Z2luRGVmaW5pdGlvbnMuaW5zdGFuY2UoKTsKKworICAgICAg
ICBpZiAoZGVmcyAhPSBudWxsKSB7CisgICAgICAgICAgICBKc0FycmF5U3RyaW5nIHBsdWdpbk5h
bWVzID0gZGVmcy5nZXRQbHVnaW5OYW1lcygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IHBsdWdpbk5hbWVzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJp
bmcgbmFtZSA9IHBsdWdpbk5hbWVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc291
cmNlUGFnZVVybCA9IGRlZnMuZ2V0UGx1Z2luU291cmNlUGFnZVVybChuYW1lKTsKKworICAgICAg
ICAgICAgICAgIGxvZ2dlci5pbmZvKCJMb2FkaW5nIHBsdWdpbiBbIiArIG5hbWUgKyAiXSBmcm9t
IFVSTCAiICsgc291cmNlUGFnZVVybCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAg
ICAgICAgICAgICAgIGxvYWRQbHVnaW4obmFtZSwgc291cmNlUGFnZVVybCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIHBsdWdpbiB1
c2luZyBpdHMgc291cmNlIHBhZ2UgKEhUTUwgcGFnZSB0aGF0IGV4ZWN1dGVzIHRoZSBhY3R1YWwg
cGx1Z2luIGNvZGUpLgorICAgICAqIDxwPgorICAgICAqIFdlYkFkbWluIHJlcXVpcmVzIGFsbCBw
bHVnaW5zIHRvIGhhdmUgYSBzb3VyY2UgcGFnZSBiZWNhdXNlIGVhY2ggcGx1Z2luIHJ1bnMgd2l0
aGluIHRoZSBjb250ZXh0IG9mIGFuIGlmcmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRQbHVn
aW4oU3RyaW5nIHBsdWdpbk5hbWUsIFN0cmluZyBwbHVnaW5Tb3VyY2VQYWdlVXJsKSB7CisgICAg
ICAgIGlmIChwbHVnaW5JRnJhbWVzLmNvbnRhaW5zS2V5KHBsdWdpbk5hbWUpKSB7CisgICAgICAg
ICAgICBsb2dnZXIud2FybmluZygiUGx1Z2luIFsiICsgcGx1Z2luTmFtZSArICJdIGlzIGFscmVh
ZHkgbG9hZGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGlmcmFtZSB1c2VkIHRvIGxv
YWQgdGhlIHBsdWdpbiBzb3VyY2UgcGFnZQorICAgICAgICBJRnJhbWVFbGVtZW50IGlmcmFtZSA9
IERvY3VtZW50LmdldCgpLmNyZWF0ZUlGcmFtZUVsZW1lbnQoKTsKKyAgICAgICAgaWZyYW1lLnNl
dFNyYyhwbHVnaW5Tb3VyY2VQYWdlVXJsKTsKKyAgICAgICAgaWZyYW1lLnNldEZyYW1lQm9yZGVy
KDApOworICAgICAgICBpZnJhbWUuZ2V0U3R5bGUoKS5zZXRQb3NpdGlvbihQb3NpdGlvbi5BQlNP
TFVURSk7CisgICAgICAgIGlmcmFtZS5nZXRTdHlsZSgpLnNldFdpZHRoKDAsIFVuaXQuUFQpOwor
ICAgICAgICBpZnJhbWUuZ2V0U3R5bGUoKS5zZXRIZWlnaHQoMCwgVW5pdC5QVCk7CisgICAgICAg
IGlmcmFtZS5nZXRTdHlsZSgpLnNldEJvcmRlclN0eWxlKEJvcmRlclN0eWxlLk5PTkUpOworICAg
ICAgICBwbHVnaW5JRnJhbWVzLnB1dChwbHVnaW5OYW1lLCBpZnJhbWUpOworCisgICAgICAgIC8v
IEF0dGFjaCB0aGUgaWZyYW1lIHRvIERPTSBkb2N1bWVudCBib2R5CisgICAgICAgIERvY3VtZW50
LmdldCgpLmdldEJvZHkoKS5hcHBlbmRDaGlsZChpZnJhbWUpOworICAgIH0KKworICAgIC8qKgor
ICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBnaXZlbiBwbHVnaW4gaXMgcmVhZHkgZm9yIHVzZS4K
KyAgICAgKi8KKyAgICB2b2lkIHBsdWdpblJlYWR5KFN0cmluZyBwbHVnaW5OYW1lLCBKYXZhU2Ny
aXB0T2JqZWN0IHBsdWdpbk9iamVjdCkgeworICAgICAgICBpZiAocGx1Z2luTmFtZSA9PSBudWxs
KSB7CisgICAgICAgICAgICBsb2dnZXIud2FybmluZygiUGx1Z2luIG5hbWUgaXMgbnVsbCBvciB1
bmRlZmluZWQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKCFwbHVnaW5JRnJhbWVzLmNvbnRhaW5zS2V5KHBsdWdpbk5hbWUpKSB7
CisgICAgICAgICAgICBsb2dnZXIud2FybmluZygiUGx1Z2luIFsiICsgcGx1Z2luTmFtZSArICJd
IHJlcG9ydHMgaW4gYXMgcmVhZHksIGJ1dCBoYXMgbm8gaWZyYW1lIGFzc29jaWF0ZWQiKTsgLy8k
Tk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KworICAgICAgICAvLyBSZWdpc3RlciB0aGUgcGx1Z2luIG9iamVjdAorICAgICAgICBwbHVnaW5P
YmplY3RzLnB1dChwbHVnaW5OYW1lLCBwbHVnaW5PYmplY3QpOworICAgICAgICBsb2dnZXIuaW5m
bygiUGx1Z2luIFsiICsgcGx1Z2luTmFtZSArICJdIGlzIHJlYWR5IGZvciB1c2UiKTsgLy8kTk9O
LU5MUy0xJCAvLyROT04tTkxTLTIkCisKKyAgICAgICAgLy8gVHJ5IHRvIGluaXRpYWxpemUgdGhl
IHBsdWdpbgorICAgICAgICBpbml0UGx1Z2luKHBsdWdpbk5hbWUpOworICAgIH0KKworICAgIHBy
aXZhdGUgbmF0aXZlIHZvaWQgZXhwb3NlUGx1Z2luQXBpKCkgLyoteworICAgICAgICB2YXIgaW5z
dGFuY2UgPSB0aGlzOworCisgICAgICAgIC8vIEV4cG9zZSB0aGUgZ2xvYmFsIHBsdWdpbkFwaSBv
YmplY3QKKyAgICAgICAgJHduZC5wbHVnaW5BcGkgPSB7CisKKyAgICAgICAgICAgIC8vIFBsdWdp
bnMgd2lsbCByZWdpc3RlciB0aGVtc2VsdmVzIGludG8gdGhpcyBvYmplY3QgYnkgYWRkaW5nIG5l
dyBwcm9wZXJ0eToKKyAgICAgICAgICAgIC8vIC0gcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBv
ZiB0aGUgcGx1Z2luCisgICAgICAgICAgICAvLyAtIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBwbHVn
aW4gb2JqZWN0IGNvbnRhaW5pbmcgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMKKyAgICAgICAgICAg
IHBsdWdpbnM6IHt9LAorCisgICAgICAgICAgICAvLyBQbHVnaW5zIHdpbGwgY2FsbCB0aGlzIGZ1
bmN0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhleSBhcmUgcmVhZHkgZm9yIHVzZQorICAgICAgICAg
ICAgcmVhZHk6IGZ1bmN0aW9uKHBsdWdpbk5hbWUpIHsKKyAgICAgICAgICAgICAgICB2YXIgcGx1
Z2luT2JqZWN0ID0gdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdOworICAgICAgICAgICAgICAgIGlu
c3RhbmNlLkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5hZ2Vy
OjpwbHVnaW5SZWFkeShMamF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9nd3QvY29yZS9jbGll
bnQvSmF2YVNjcmlwdE9iamVjdDspKHBsdWdpbk5hbWUscGx1Z2luT2JqZWN0KTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICB9OworICAgIH0tKi87CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5l
L3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFpblNlY3Rpb25QcmVzZW50ZXIu
amF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9v
cmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFpblNl
Y3Rpb25QcmVzZW50ZXIuamF2YQppbmRleCA3MThkOGZjLi4xNWI4ODdjIDEwMDY0NAotLS0gYS9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0
L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5TZWN0aW9uUHJl
c2VudGVyLmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv
bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNl
bnRlci9NYWluU2VjdGlvblByZXNlbnRlci5qYXZhCkBAIC0xLDUgKzEsNyBAQAogcGFja2FnZSBv
cmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXI7CiAKK2lt
cG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5hZ2VyOwor
CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkV2ZW50QnVzOwogaW1wb3J0IGNv
bS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5Hd3RFdmVudC5UeXBlOwogaW1wb3J0IGNvbS5nb29n
bGUuaW5qZWN0LkluamVjdDsKQEAgLTI4LDExICszMCwxMyBAQCBwdWJsaWMgY2xhc3MgTWFpblNl
Y3Rpb25QcmVzZW50ZXIgZXh0ZW5kcyBQcmVzZW50ZXI8TWFpblNlY3Rpb25QcmVzZW50ZXIuVmll
d0RlZgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZTxSZXZlYWxDb250ZW50SGFuZGxlcjw/
Pj4gVFlQRV9TZXRNYWluQ29udGVudCA9IG5ldyBUeXBlPFJldmVhbENvbnRlbnRIYW5kbGVyPD8+
PigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVyOwor
ICAgIHByaXZhdGUgZmluYWwgUGx1Z2luTWFuYWdlciBwbHVnaW5NYW5hZ2VyOwogCiAgICAgQElu
amVjdAotICAgIHB1YmxpYyBNYWluU2VjdGlvblByZXNlbnRlcihFdmVudEJ1cyBldmVudEJ1cywg
Vmlld0RlZiB2aWV3LCBQcm94eURlZiBwcm94eSwgSGVhZGVyUHJlc2VudGVyV2lkZ2V0IGhlYWRl
cikgeworICAgIHB1YmxpYyBNYWluU2VjdGlvblByZXNlbnRlcihFdmVudEJ1cyBldmVudEJ1cywg
Vmlld0RlZiB2aWV3LCBQcm94eURlZiBwcm94eSwgSGVhZGVyUHJlc2VudGVyV2lkZ2V0IGhlYWRl
ciwgUGx1Z2luTWFuYWdlciBwbHVnaW5NYW5hZ2VyKSB7CiAgICAgICAgIHN1cGVyKGV2ZW50QnVz
LCB2aWV3LCBwcm94eSk7CiAgICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOworICAgICAgICB0
aGlzLnBsdWdpbk1hbmFnZXIgPSBwbHVnaW5NYW5hZ2VyOwogICAgICAgICBnZXRWaWV3KCkuc2V0
VWlIYW5kbGVycyhoZWFkZXIpOwogICAgIH0KIApAQCAtNDYsNiArNTAsMTcgQEAgcHVibGljIGNs
YXNzIE1haW5TZWN0aW9uUHJlc2VudGVyIGV4dGVuZHMgUHJlc2VudGVyPE1haW5TZWN0aW9uUHJl
c2VudGVyLlZpZXdEZWYKICAgICAgICAgc3VwZXIub25SZXZlYWwoKTsKIAogICAgICAgICBzZXRJ
blNsb3QoVFlQRV9TZXRIZWFkZXIsIGhlYWRlcik7CisKKyAgICAgICAgLy8gRW5hYmxlIHBsdWdp
biBpbnZvY2F0aW9uIHdpdGhpbiB0aGUgc2NvcGUgb2YgbWFpbiBzZWN0aW9uCisgICAgICAgIHBs
dWdpbk1hbmFnZXIuZW5hYmxlUGx1Z2luSW52b2NhdGlvbigpOworICAgIH0KKworICAgIEBPdmVy
cmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uSGlkZSgpIHsKKyAgICAgICAgc3VwZXIub25IaWRl
KCk7CisKKyAgICAgICAgLy8gRGlzYWJsZSBwbHVnaW4gaW52b2NhdGlvbiBvdXRzaWRlIHRoZSBz
Y29wZSBvZiBtYWluIHNlY3Rpb24KKyAgICAgICAgcGx1Z2luTWFuYWdlci5kaXNhYmxlUGx1Z2lu
SW52b2NhdGlvbigpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4v
bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZnJvbnRl
bmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIu
eG1sCmluZGV4IGE1MGY4YWEuLjYyZjAzMTIgMTAwNjQ0Ci0tLSBhL2Zyb250ZW5kL3dlYmFkbWlu
L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgYi9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL3dlYmFwcC9XRUItSU5G
L3dlYi54bWwKQEAgLTIzLDYgKzIzLDE2IEBACiAJCTx1cmwtcGF0dGVybj4vd2ViYWRtaW4vV2Vi
QWRtaW4uaHRtbDwvdXJsLXBhdHRlcm4+CiAJPC9zZXJ2bGV0LW1hcHBpbmc+CiAKKwk8c2Vydmxl
dD4KKwkJPHNlcnZsZXQtbmFtZT5QbHVnaW5Tb3VyY2VQYWdlPC9zZXJ2bGV0LW5hbWU+CisJCTxz
ZXJ2bGV0LWNsYXNzPm9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQuc2VydmVyLmd3dC5QbHVn
aW5Tb3VyY2VQYWdlU2VydmxldDwvc2VydmxldC1jbGFzcz4KKwk8L3NlcnZsZXQ+CisKKwk8c2Vy
dmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlBsdWdpblNvdXJjZVBhZ2U8L3NlcnZsZXQt
bmFtZT4KKwkJPHVybC1wYXR0ZXJuPi93ZWJhZG1pbi9QbHVnaW5Tb3VyY2VQYWdlPC91cmwtcGF0
dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKwogCTwhLS0gRGVmYXVsdCBwYWdlIHRvIHNlcnZl
IC0tPgogCTx3ZWxjb21lLWZpbGUtbGlzdD4KIAkJPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93
ZWxjb21lLWZpbGU+Ci0tIAoxLjcuNC40Cgo=
------=_Part_7830015_289327145.1344531366470--