From lifuqiong at cncloudsec.com Sat Jul 23 05:44:08 2016 Content-Type: multipart/mixed; boundary="===============2338382093201089525==" MIME-Version: 1.0 From: lifuqiong To: devel at ovirt.org Subject: [ovirt-devel] Debug vdsm 4.0.0 report error: libvirt: XML-RPC error : Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied Date: Sat, 23 Jul 2016 17:39:00 +0800 Message-ID: <001d01d1e4c6$0b528530$21f78f90$@cncloudsec.com> --===============2338382093201089525== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multipart message in MIME format. ------=3D_NextPart_000_001E_01D1E509.19780F20 Content-Type: text/plain; charset=3D"us-ascii" Content-Transfer-Encoding: 7bit I debugged vdsm with PyCharm, And I logged on my Centos 7.2 with root, and get an error as follows: = Problem: = Traceback (most recent call last): File "/usr/share/vdsm/vdsm", line 149, in run serve_clients(log) File "/usr/share/vdsm/vdsm", line 104, in serve_clients cif =3D clientIF.getInstance(irs, log, scheduler) File "/usr/share/vdsm/clientIF.py", line 204, in getInstance cls._instance =3D clientIF(irs, log, scheduler) File "/usr/share/vdsm/clientIF.py", line 106, in __init__ secret.clear() File "/usr/lib/python2.7/site-packages/vdsm/virt/secret.py", line 92, in clear con =3D libvirtconnection.get() File "/usr/lib/python2.7/site-packages/vdsm/libvirtconnection.py", line 163, in get password) File "/usr/lib/python2.7/site-packages/vdsm/libvirtconnection.py", line 99, in open_connection return utils.retry(libvirtOpen, timeout=3D10, sleep=3D0.2) File "/usr/lib/python2.7/site-packages/vdsm/utils.py", line 546, in retry return func() File "/usr/lib64/python2.7/site-packages/libvirt.py", line 105, in openAuth if ret is None:raise libvirtError('virConnectOpenAuth() failed') libvirtError: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied = Investitate: According to the traceback above, the code in libvirt.py as below, and os.geteuid() get '0' which shows the current user is root; = def openAuth(uri, auth, flags=3D0): #print os.geteuid() ret =3D libvirtmod.virConnectOpenAuth(uri, auth, flags) if ret is None:raise libvirtError('virConnectOpenAuth() failed') return virConnect(_obj=3Dret) = [root(a)server117 libvirt]# ll /var/run/libvirt/libvirt-sock srwxrwx---. 1 root qemu 0 Jul 19 23:43 /var/run/libvirt/libvirt-sock = According that, root should not get an Permission denied error ? But why? = And I setenforce=3D0 , and still show Perssion denied error. = What's the reason? And how to solve it? = Thank you. ------=3D_NextPart_000_001E_01D1E509.19780F20 Content-Type: text/html; charset=3D"us-ascii" Content-Transfer-Encoding: quoted-printable

I debugg= ed =3D vdsm with PyCharm, And I logged on my Centos 7.2 with root,  and =3D get an error as follows:

 

Problem:

 

Traceback (most recent call last):

  File =3D "/usr/share/vdsm/vdsm", line 149, in =3D run

    =3D serve_clients(log)

  File "/usr/share/vdsm/vdsm", line 104, in = =3D serve_clients

    cif =3D3D clientIF.getInstance(irs, log, = =3D scheduler)

  File "/usr/share/vdsm/clientIF.py", line = =3D 204, in getInstance

    cls._instance =3D3D clientIF(irs, log, = =3D scheduler)

  File "/usr/share/vdsm/clientIF.py", line = =3D 106, in __init__

    secret.clear()

  File =3D "/usr/lib/python2.7/site-packages/vdsm/virt/secret.py", line =3D 92, in clear

    con =3D3D =3D libvirtconnection.get()

  File =3D "/usr/lib/python2.7/site-packages/vdsm/libvirtconnection.py", =3D line 163, in get

    password)

  File =3D "/usr/lib/python2.7/site-packages/vdsm/libvirtconnection.py", =3D line 99, in open_connection

    return =3D utils.retry(libvirtOpen, timeout=3D3D10, =3D sleep=3D3D0.2)

  File =3D "/usr/lib/python2.7/site-packages/vdsm/utils.py", line 546, in = =3D retry

    return func()

  File =3D "/usr/lib64/python2.7/site-packages/libvirt.py", line 105, in =3D openAuth

    if ret is None:raise =3D libvirtError('virConnectOpenAuth() failed')

libvirtError: Failed to connect = =3D socket to '/var/run/libvirt/libvirt-sock': Permission =3D denied

 

Investitate:

According to the traceback above, = =3D the code in libvirt.py as below, and  os.geteuid() get =3D ‘0’ which shows the current user is =3D root;

 

def openAuth(uri, auth, flags=3D3D0):

<= p =3D class=3D3DMsoNormal>         #print =3D os.geteuid()

    ret =3D3D =3D libvirtmod.virConnectOpenAuth(uri, auth, flags)

    if ret is =3D None:raise libvirtError('virConnectOpenAuth() =3D failed')

return =3D virConnect(_obj=3D3Dret)

 

[root(a)server117 libvirt]# ll =3D /var/run/libvirt/libvirt-sock

srwxrwx---. 1 root qemu 0 Jul 19 = =3D 23:43 /var/run/libvirt/libvirt-sock

 

According that, root should not ge= t =3D an Permission denied error ? But why?

 

And I setenforce=3D3D0 , and still= =3D show Perssion denied error.

 

What’s the reason? And how t= o =3D solve it?

 

Thank you.

------=3D_NextPart_000_001E_01D1E509.19780F20-- --===============2338382093201089525== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgoKLS0tLS0tPV9OZXh0 UGFydF8wMDBfMDAxRV8wMUQxRTUwOS4xOTc4MEYyMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47 CgljaGFyc2V0PSJ1cy1hc2NpaSIKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAoKSSBk ZWJ1Z2dlZCB2ZHNtIHdpdGggUHlDaGFybSwgQW5kIEkgbG9nZ2VkIG9uIG15IENlbnRvcyA3LjIg d2l0aCByb290LCAgYW5kCmdldCBhbiBlcnJvciBhcyBmb2xsb3dzOgoKIAoKUHJvYmxlbToKCiAK ClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKCiAgRmlsZSAiL3Vzci9zaGFyZS92 ZHNtL3Zkc20iLCBsaW5lIDE0OSwgaW4gcnVuCgogICAgc2VydmVfY2xpZW50cyhsb2cpCgogIEZp bGUgIi91c3Ivc2hhcmUvdmRzbS92ZHNtIiwgbGluZSAxMDQsIGluIHNlcnZlX2NsaWVudHMKCiAg ICBjaWYgPSBjbGllbnRJRi5nZXRJbnN0YW5jZShpcnMsIGxvZywgc2NoZWR1bGVyKQoKICBGaWxl ICIvdXNyL3NoYXJlL3Zkc20vY2xpZW50SUYucHkiLCBsaW5lIDIwNCwgaW4gZ2V0SW5zdGFuY2UK CiAgICBjbHMuX2luc3RhbmNlID0gY2xpZW50SUYoaXJzLCBsb2csIHNjaGVkdWxlcikKCiAgRmls ZSAiL3Vzci9zaGFyZS92ZHNtL2NsaWVudElGLnB5IiwgbGluZSAxMDYsIGluIF9faW5pdF9fCgog ICAgc2VjcmV0LmNsZWFyKCkKCiAgRmlsZSAiL3Vzci9saWIvcHl0aG9uMi43L3NpdGUtcGFja2Fn ZXMvdmRzbS92aXJ0L3NlY3JldC5weSIsIGxpbmUgOTIsIGluCmNsZWFyCgogICAgY29uID0gbGli dmlydGNvbm5lY3Rpb24uZ2V0KCkKCiAgRmlsZSAiL3Vzci9saWIvcHl0aG9uMi43L3NpdGUtcGFj a2FnZXMvdmRzbS9saWJ2aXJ0Y29ubmVjdGlvbi5weSIsIGxpbmUKMTYzLCBpbiBnZXQKCiAgICBw YXNzd29yZCkKCiAgRmlsZSAiL3Vzci9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMvdmRzbS9s aWJ2aXJ0Y29ubmVjdGlvbi5weSIsIGxpbmUKOTksIGluIG9wZW5fY29ubmVjdGlvbgoKICAgIHJl dHVybiB1dGlscy5yZXRyeShsaWJ2aXJ0T3BlbiwgdGltZW91dD0xMCwgc2xlZXA9MC4yKQoKICBG aWxlICIvdXNyL2xpYi9weXRob24yLjcvc2l0ZS1wYWNrYWdlcy92ZHNtL3V0aWxzLnB5IiwgbGlu ZSA1NDYsIGluIHJldHJ5CgogICAgcmV0dXJuIGZ1bmMoKQoKICBGaWxlICIvdXNyL2xpYjY0L3B5 dGhvbjIuNy9zaXRlLXBhY2thZ2VzL2xpYnZpcnQucHkiLCBsaW5lIDEwNSwgaW4Kb3BlbkF1dGgK CiAgICBpZiByZXQgaXMgTm9uZTpyYWlzZSBsaWJ2aXJ0RXJyb3IoJ3ZpckNvbm5lY3RPcGVuQXV0 aCgpIGZhaWxlZCcpCgpsaWJ2aXJ0RXJyb3I6IEZhaWxlZCB0byBjb25uZWN0IHNvY2tldCB0byAn L3Zhci9ydW4vbGlidmlydC9saWJ2aXJ0LXNvY2snOgpQZXJtaXNzaW9uIGRlbmllZAoKIAoKSW52 ZXN0aXRhdGU6CgpBY2NvcmRpbmcgdG8gdGhlIHRyYWNlYmFjayBhYm92ZSwgdGhlIGNvZGUgaW4g bGlidmlydC5weSBhcyBiZWxvdywgYW5kCm9zLmdldGV1aWQoKSBnZXQgJzAnIHdoaWNoIHNob3dz IHRoZSBjdXJyZW50IHVzZXIgaXMgcm9vdDsKCiAKCmRlZiBvcGVuQXV0aCh1cmksIGF1dGgsIGZs YWdzPTApOgoKICAgICAgICAgI3ByaW50IG9zLmdldGV1aWQoKQoKICAgIHJldCA9IGxpYnZpcnRt b2QudmlyQ29ubmVjdE9wZW5BdXRoKHVyaSwgYXV0aCwgZmxhZ3MpCgogICAgaWYgcmV0IGlzIE5v bmU6cmFpc2UgbGlidmlydEVycm9yKCd2aXJDb25uZWN0T3BlbkF1dGgoKSBmYWlsZWQnKQoKcmV0 dXJuIHZpckNvbm5lY3QoX29iaj1yZXQpCgogCgpbcm9vdEBzZXJ2ZXIxMTcgbGlidmlydF0jIGxs IC92YXIvcnVuL2xpYnZpcnQvbGlidmlydC1zb2NrCgpzcnd4cnd4LS0tLiAxIHJvb3QgcWVtdSAw IEp1bCAxOSAyMzo0MyAvdmFyL3J1bi9saWJ2aXJ0L2xpYnZpcnQtc29jawoKIAoKQWNjb3JkaW5n IHRoYXQsIHJvb3Qgc2hvdWxkIG5vdCBnZXQgYW4gUGVybWlzc2lvbiBkZW5pZWQgZXJyb3IgPyBC dXQgd2h5PwoKIAoKQW5kIEkgc2V0ZW5mb3JjZT0wICwgYW5kIHN0aWxsIHNob3cgUGVyc3Npb24g ZGVuaWVkIGVycm9yLgoKIAoKV2hhdCdzIHRoZSByZWFzb24/IEFuZCBob3cgdG8gc29sdmUgaXQ/ CgogCgpUaGFuayB5b3UuCgoKLS0tLS0tPV9OZXh0UGFydF8wMDBfMDAxRV8wMUQxRTUwOS4xOTc4 MEYyMApDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKCWNoYXJzZXQ9InVzLWFzY2lpIgpDb250ZW50 LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCgo8aHRtbCB4bWxuczp2PTNEInVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiA9CnhtbG5zOm89M0QidXJuOnNjaGVtYXMtbWlj cm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiA9CnhtbG5zOnc9M0QidXJuOnNjaGVtYXMtbWljcm9z b2Z0LWNvbTpvZmZpY2U6d29yZCIgPQp4bWxuczptPTNEImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29m dC5jb20vb2ZmaWNlLzIwMDQvMTIvb21tbCIgPQp4bWxucz0zRCJodHRwOi8vd3d3LnczLm9yZy9U Ui9SRUMtaHRtbDQwIj48aGVhZD48bWV0YSA9Cmh0dHAtZXF1aXY9M0RDb250ZW50LVR5cGUgY29u dGVudD0zRCJ0ZXh0L2h0bWw7ID0KY2hhcnNldD0zRHVzLWFzY2lpIj48bWV0YSBuYW1lPTNER2Vu ZXJhdG9yIGNvbnRlbnQ9M0QiTWljcm9zb2Z0IFdvcmQgMTQgPQooZmlsdGVyZWQgbWVkaXVtKSI+ PHN0eWxlPjwhLS0KLyogRm9udCBEZWZpbml0aW9ucyAqLwpAZm9udC1mYWNlCgl7Zm9udC1mYW1p bHk6U2ltU3VuOwoJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CkBmb250LWZhY2UKCXtm b250LWZhbWlseTpTaW1TdW47CglwYW5vc2UtMToyIDEgNiAwIDMgMSAxIDEgMSAxO30KQGZvbnQt ZmFjZQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7CglwYW5vc2UtMToyIDE1IDUgMiAyIDIgNCAzIDIg NDt9CkBmb250LWZhY2UKCXtmb250LWZhbWlseTpTaW1TdW47CglwYW5vc2UtMToyIDEgNiAwIDMg MSAxIDEgMSAxO30KLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KcC5Nc29Ob3JtYWwsIGxpLk1zb05v cm1hbCwgZGl2Lk1zb05vcm1hbAoJe21hcmdpbjowY207CgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7 Cgl0ZXh0LWFsaWduOmp1c3RpZnk7Cgl0ZXh0LWp1c3RpZnk6aW50ZXItaWRlb2dyYXBoOwoJZm9u dC1zaXplOjEwLjVwdDsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7fQphOmxp bmssIHNwYW4uTXNvSHlwZXJsaW5rCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5OwoJY29sb3I6Ymx1 ZTsKCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQphOnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJs aW5rRm9sbG93ZWQKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjpwdXJwbGU7Cgl0ZXh0 LWRlY29yYXRpb246dW5kZXJsaW5lO30Kc3Bhbi5FbWFpbFN0eWxlMTcKCXttc28tc3R5bGUtdHlw ZTpwZXJzb25hbC1jb21wb3NlOwoJZm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsK CWNvbG9yOndpbmRvd3RleHQ7fQouTXNvQ2hwRGVmYXVsdAoJe21zby1zdHlsZS10eXBlOmV4cG9y dC1vbmx5OwoJZm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjt9Ci8qIFBhZ2UgRGVm aW5pdGlvbnMgKi8KQHBhZ2UgV29yZFNlY3Rpb24xCgl7c2l6ZTo2MTIuMHB0IDc5Mi4wcHQ7Cglt YXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KZGl2LldvcmRTZWN0aW9uMQoJe3Bh Z2U6V29yZFNlY3Rpb24xO30KLS0+PC9zdHlsZT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KPG86 c2hhcGVkZWZhdWx0cyB2OmV4dD0zRCJlZGl0IiBzcGlkbWF4PTNEIjEwMjYiIC8+CjwveG1sPjwh W2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8bzpzaGFwZWxheW91dCB2OmV4dD0z RCJlZGl0Ij4KPG86aWRtYXAgdjpleHQ9M0QiZWRpdCIgZGF0YT0zRCIxIiAvPgo8L286c2hhcGVs YXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+PC9oZWFkPjxib2R5IGxhbmc9M0RaSC1DTiBsaW5rPTNE Ymx1ZSA9CnZsaW5rPTNEcHVycGxlIHN0eWxlPTNEJ3RleHQtanVzdGlmeS10cmltOnB1bmN0dWF0 aW9uJz48ZGl2ID0KY2xhc3M9M0RXb3JkU2VjdGlvbjE+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNw YW4gbGFuZz0zREVOLVVTPkkgZGVidWdnZWQgPQp2ZHNtIHdpdGggUHlDaGFybSwgQW5kIEkgbG9n Z2VkIG9uIG15IENlbnRvcyA3LjIgd2l0aCByb290LCAmbmJzcDthbmQgPQpnZXQgYW4gZXJyb3Ig YXMgZm9sbG93czo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNw YW4gPQpsYW5nPTNERU4tVVM+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNE TXNvTm9ybWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPlByb2JsZW06PG86cD48L286cD48L3NwYW4+ PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPjxvOnA+Jm5ic3A7 PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbD48c3BhbiA9Cmxhbmc9M0RFTi1V Uz5UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6PG86cD48L286cD48L3NwYW4+PC9w PjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gbGFuZz0zREVOLVVTPiZuYnNwOyBGaWxlID0K JnF1b3Q7L3Vzci9zaGFyZS92ZHNtL3Zkc20mcXVvdDssIGxpbmUgMTQ5LCBpbiA9CnJ1bjxvOnA+ PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbD48c3BhbiA9Cmxhbmc9M0RFTi1V Uz4mbmJzcDsmbmJzcDsmbmJzcDsgPQpzZXJ2ZV9jbGllbnRzKGxvZyk8bzpwPjwvbzpwPjwvc3Bh bj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+Jm5ic3A7IEZp bGUgJnF1b3Q7L3Vzci9zaGFyZS92ZHNtL3Zkc20mcXVvdDssIGxpbmUgMTA0LCBpbiA9CnNlcnZl X2NsaWVudHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4g PQpsYW5nPTNERU4tVVM+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNpZiA9M0QgY2xpZW50SUYuZ2V0SW5z dGFuY2UoaXJzLCBsb2csID0Kc2NoZWR1bGVyKTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFz cz0zRE1zb05vcm1hbD48c3BhbiA9Cmxhbmc9M0RFTi1VUz4mbmJzcDsgRmlsZSAmcXVvdDsvdXNy L3NoYXJlL3Zkc20vY2xpZW50SUYucHkmcXVvdDssIGxpbmUgPQoyMDQsIGluIGdldEluc3RhbmNl PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsPjxzcGFuID0KbGFuZz0z REVOLVVTPiZuYnNwOyZuYnNwOyZuYnNwOyBjbHMuX2luc3RhbmNlID0zRCBjbGllbnRJRihpcnMs IGxvZywgPQpzY2hlZHVsZXIpPG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9y bWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPiZuYnNwOyBGaWxlICZxdW90Oy91c3Ivc2hhcmUvdmRz bS9jbGllbnRJRi5weSZxdW90OywgbGluZSA9CjEwNiwgaW4gX19pbml0X188bzpwPjwvbzpwPjwv c3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+Jm5ic3A7 Jm5ic3A7Jm5ic3A7IHNlY3JldC5jbGVhcigpPG86cD48L286cD48L3NwYW4+PC9wPjxwID0KY2xh c3M9M0RNc29Ob3JtYWw+PHNwYW4gbGFuZz0zREVOLVVTPiZuYnNwOyBGaWxlID0KJnF1b3Q7L3Vz ci9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMvdmRzbS92aXJ0L3NlY3JldC5weSZxdW90Oywg bGluZSA9CjkyLCBpbiBjbGVhcjxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05v cm1hbD48c3BhbiA9Cmxhbmc9M0RFTi1VUz4mbmJzcDsmbmJzcDsmbmJzcDsgY29uID0zRCA9Cmxp YnZpcnRjb25uZWN0aW9uLmdldCgpPG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNv Tm9ybWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPiZuYnNwOyBGaWxlID0KJnF1b3Q7L3Vzci9saWIv cHl0aG9uMi43L3NpdGUtcGFja2FnZXMvdmRzbS9saWJ2aXJ0Y29ubmVjdGlvbi5weSZxdW90Oywg PQpsaW5lIDE2MywgaW4gZ2V0PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9y bWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPiZuYnNwOyZuYnNwOyZuYnNwOyBwYXNzd29yZCk8bzpw PjwvbzpwPjwvc3Bhbj48L3A+PHAgPQpjbGFzcz0zRE1zb05vcm1hbD48c3BhbiBsYW5nPTNERU4t VVM+Jm5ic3A7IEZpbGUgPQomcXVvdDsvdXNyL2xpYi9weXRob24yLjcvc2l0ZS1wYWNrYWdlcy92 ZHNtL2xpYnZpcnRjb25uZWN0aW9uLnB5JnF1b3Q7LCA9CmxpbmUgOTksIGluIG9wZW5fY29ubmVj dGlvbjxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsPjxzcGFuIGxh bmc9M0RFTi1VUz4mbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuID0KdXRpbHMucmV0cnkobGlidmly dE9wZW4sIHRpbWVvdXQ9M0QxMCwgPQpzbGVlcD0zRDAuMik8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+Jm5ic3A7IEZpbGUgPQom cXVvdDsvdXNyL2xpYi9weXRob24yLjcvc2l0ZS1wYWNrYWdlcy92ZHNtL3V0aWxzLnB5JnF1b3Q7 LCBsaW5lIDU0NiwgaW4gPQpyZXRyeTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1z b05vcm1hbD48c3BhbiA9Cmxhbmc9M0RFTi1VUz4mbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIGZ1 bmMoKTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsPjxzcGFuIGxh bmc9M0RFTi1VUz4mbmJzcDsgRmlsZSA9CiZxdW90Oy91c3IvbGliNjQvcHl0aG9uMi43L3NpdGUt cGFja2FnZXMvbGlidmlydC5weSZxdW90OywgbGluZSAxMDUsIGluID0Kb3BlbkF1dGg8bzpwPjwv bzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+ Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIHJldCBpcyBOb25lOnJhaXNlID0KbGlidmlydEVycm9yKCd2 aXJDb25uZWN0T3BlbkF1dGgoKSBmYWlsZWQnKTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNs YXNzPTNETXNvTm9ybWFsPjxzcGFuIGxhbmc9M0RFTi1VUz5saWJ2aXJ0RXJyb3I6IEZhaWxlZCB0 byBjb25uZWN0ID0Kc29ja2V0IHRvICcvdmFyL3J1bi9saWJ2aXJ0L2xpYnZpcnQtc29jayc6IFBl cm1pc3Npb24gPQpkZW5pZWQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3Jt YWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNs YXNzPTNETXNvTm9ybWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPkludmVzdGl0YXRlOjxvOnA+PC9v OnA+PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsPjxzcGFuIGxhbmc9M0RFTi1VUz5B Y2NvcmRpbmcgdG8gdGhlIHRyYWNlYmFjayBhYm92ZSwgPQp0aGUgY29kZSBpbiBsaWJ2aXJ0LnB5 IGFzIGJlbG93LCBhbmQgJm5ic3A7b3MuZ2V0ZXVpZCgpIGdldCA9CiYjODIxNjswJiM4MjE3OyB3 aGljaCBzaG93cyB0aGUgY3VycmVudCB1c2VyIGlzID0Kcm9vdDs8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsPjxzcGFuID0KbGFuZz0zREVOLVVT PmRlZiBvcGVuQXV0aCh1cmksIGF1dGgsIGZsYWdzPTNEMCk6PG86cD48L286cD48L3NwYW4+PC9w PjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICNwcmludCA9Cm9zLmdldGV1aWQo KTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbD48c3BhbiA9Cmxhbmc9 M0RFTi1VUz4mbmJzcDsmbmJzcDsmbmJzcDsgcmV0ID0zRCA9CmxpYnZpcnRtb2QudmlyQ29ubmVj dE9wZW5BdXRoKHVyaSwgYXV0aCwgZmxhZ3MpPG86cD48L286cD48L3NwYW4+PC9wPjxwID0KY2xh c3M9M0RNc29Ob3JtYWw+PHNwYW4gbGFuZz0zREVOLVVTPiZuYnNwOyZuYnNwOyZuYnNwOyBpZiBy ZXQgaXMgPQpOb25lOnJhaXNlIGxpYnZpcnRFcnJvcigndmlyQ29ubmVjdE9wZW5BdXRoKCkgPQpm YWlsZWQnKTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbCA9CnN0eWxl PTNEJ3RleHQtaW5kZW50OjIxLjBwdCc+PHNwYW4gbGFuZz0zREVOLVVTPnJldHVybiA9CnZpckNv bm5lY3QoX29iaj0zRHJldCk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3Jt YWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNs YXNzPTNETXNvTm9ybWFsPjxzcGFuID0KbGFuZz0zREVOLVVTPltyb290QHNlcnZlcjExNyBsaWJ2 aXJ0XSMgbGwgPQovdmFyL3J1bi9saWJ2aXJ0L2xpYnZpcnQtc29jazxvOnA+PC9vOnA+PC9zcGFu PjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsPjxzcGFuIGxhbmc9M0RFTi1VUz5zcnd4cnd4LS0t LiAxIHJvb3QgcWVtdSAwIEp1bCAxOSA9CjIzOjQzIC92YXIvcnVuL2xpYnZpcnQvbGlidmlydC1z b2NrPG86cD48L286cD48L3NwYW4+PC9wPjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gbGFu Zz0zREVOLVVTPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNETXNvTm9y bWFsPjxzcGFuIGxhbmc9M0RFTi1VUz5BY2NvcmRpbmcgdGhhdCwgcm9vdCBzaG91bGQgbm90IGdl dCA9CmFuIFBlcm1pc3Npb24gZGVuaWVkIGVycm9yID8gQnV0IHdoeT88bzpwPjwvbzpwPjwvc3Bh bj48L3A+PHAgPQpjbGFzcz0zRE1zb05vcm1hbD48c3BhbiBsYW5nPTNERU4tVVM+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gbGFuZz0zREVO LVVTPkFuZCBJIHNldGVuZm9yY2U9M0QwICwgYW5kIHN0aWxsID0Kc2hvdyBQZXJzc2lvbiBkZW5p ZWQgZXJyb3IuPG86cD48L286cD48L3NwYW4+PC9wPjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PHNw YW4gbGFuZz0zREVOLVVTPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNE TXNvTm9ybWFsPjxzcGFuIGxhbmc9M0RFTi1VUz5XaGF0JiM4MjE3O3MgdGhlIHJlYXNvbj8gQW5k IGhvdyB0byA9CnNvbHZlIGl0PzxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05v cm1hbD48c3BhbiA9Cmxhbmc9M0RFTi1VUz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+PHAg Y2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpsYW5nPTNERU4tVVM+VGhhbmsgeW91LjxvOnA+PC9v OnA+PC9zcGFuPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgotLS0tLS09X05leHRQYXJ0XzAwMF8w MDFFXzAxRDFFNTA5LjE5NzgwRjIwLS0KCg== --===============2338382093201089525==--