From olivia.doppelt@pasteur.fr Sun Jan 5 04:35:12 2014 From: Olivia Doppelt To: galaxy-dev@lists.galaxyproject.org Subject: Re: [galaxy-dev] BioBlend AND Galaxy: Problem using upload_file_from_server function with an associated role Date: Sun, 05 Jan 2014 10:35:03 +0100 Message-ID: <52C92747.6010903@pasteur.fr> In-Reply-To: <52C878DE.8020501@pasteur.fr> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6857669158848256682==" --===============6857669158848256682== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hello again, I just reminded a capital thing concerning the api script=20 library_upload_from_import_dir.py. Actually it only works for admin=20 users. simple users don't have the authorization to upload anything in=20 their galaxy library using this script. It is the main reason why we=20 choose to user bioblend. -- Olivia Le 04/01/14 22:10, Olivia Doppelt a =C3=A9crit : > > Le 03/01/14 15:44, John Chilton a =C3=A9crit : >> I am not sure I understand the problem. Can you clarify a few points: >> >> Is bioblend letting users associate roles with data libraries that >> they shouldn't be able to and the operation is succeeding -or- are you >> trying to add roles and the operation is failing? > Dear John, > > In our Galaxy instance, each user connecting to Galaxy has a library=20 > associated to its user role which is created automatically as well as=20 > two directories; one in the links directory corresponding to our=20 > "user_library_import_dir" and one in an "output" directory to enable=20 > the users to export their results from the instance. > > The user directories are readable by Galaxy and by themselves (unix=20 > rights are set using a root cron script) > > For a project, we need to do basic galaxy stuff using either the API=20 > scripts or bioblend api. We have tried both and bioblend is a little=20 > simpler to use. > > Using the api script library_upload_from_import_dir.py, using a user=20 > api key, only files from the user directory are "uploadable". > > However, using bioblend function from libraries class=20 > "upload_file_from_server", a user with its key can upload within its=20 > galaxy library, the data of anyone. > > #giOlivia.libraries.upload_file_from_server("OLIVIA_API_key","/xxxxxxx/link= s/otherUser(a)pasteur.fr/","F0045a9ffd77d1226") > > > To disable this, i'm trying to add an associate role when I launch the=20 > upload_file_from_server command but I get an error. > > giOlivia.libraries.upload_file_from_server("OLIVIA_API_key","/xxxxxxxx/link= s/olivia(a)pasteur.fr/",=20 > "F0045a9ffd77d1226", roles=3D'olivia(a)pasteur.fr') > > and I get the following error: >> Traceback (most recent call last): >> >> File "", line 1, in >> >> File=20 >> "/usr/local/lib/python2.7/dist-packages/bioblend-0.4.2_dev-py2.7.egg/biobl= end/galaxy/libraries/__init__.py",=20 >> line 242, in upload_file_from_server >> >> return self._do_upload(**vars) >> >> File=20 >> "/usr/local/lib/python2.7/dist-packages/bioblend-0.4.2_dev-py2.7.egg/biobl= end/galaxy/libraries/__init__.py",=20 >> line 190, in _do_upload >> >> files_attached=3Dfiles_attached) >> >> File=20 >> "/usr/local/lib/python2.7/dist-packages/bioblend-0.4.2_dev-py2.7.egg/biobl= end/galaxy/client.py",=20 >> line 71, in _post >> >> r =3D self.gi.make_post_request(url, payload=3Dpayload,=20 >> files_attached=3Dfiles_attached) >> >> File=20 >> "/usr/local/lib/python2.7/dist-packages/bioblend-0.4.2_dev-py2.7.egg/biobl= end/galaxyclient.py",=20 >> line 94, in make_post_request >> >> r.status_code, body=3Dr.text) # @see self.body for HTTP=20 >> response body >> >> ConnectionError: Unexpected response from galaxy: 500: >> >> Internal Server Error >> >> >> >>

Internal Server Error

>> >>

The server has either erred or is incapable of performing >> >> the requested operation. >> >> >>
>> >>

>> >>
>> >>
WSGI Server
>> >> >> >> >> > >> If the API is producing an error message can you share that: in >> particular this code is probably resulting in an error or some kind? >> >> elif roles: >> # Check to see if the user selected roles to associate >> with the DATASET_ACCESS permission >> # on the dataset that would cause accessibility issues. >> vars =3D dict( DATASET_ACCESS_in=3Droles ) >> permissions, in_roles, error, message =3D \ >> trans.app.security_agent.derive_roles_from_access( >> trans, library.id, cntrller, library=3DTrue, **vars ) >> if error: >> if cntrller =3D=3D 'api': >> return 400, message > > the api does not produce any error when the api key corresponds to the=20 > user which tries to import its own data. > > >> Has your institute made modifications Galaxy to enforce this >> constraint - ("it can't be possible that any user may upload any other >> user's data in their Galaxy Data library")? Also is the thing you are >> trying to do something that is working through the web ui but not >> through the API, or have you only tried through the API? > > I did a few tests yesterday, and to resume, it works as it should=20 > using the api script but there is a problem using bioblend. > I'm not sure that roles are really needed here, i only thought that it=20 > could guide galaxy (and bioblend) to not upload data that does not=20 > belong to user (corresponding to the API key) > > I looked at the sources, and my major doubt was that bioblend didn't=20 > pass all the arguments but it does, everything is transmitted to=20 > galaxy do it should work. > > Tell me if you need more information. I'll look further on monday but=20 > i'm kind of stuck. > > Thank you for your help, > > Cheers, > > --=20 > Olivia Doppelt-Azeroual, PhD > CIB - Institut Pasteur > > >> On Fri, Jan 3, 2014 at 5:36 AM, Olivia Doppelt >> wrote: >>> Hello to all, >>> >>> I'm trying to use the function "upload_file_from_server" from the galaxy >>> libraries api of Bioblend. >>> >>> It's working correctly when i don't associate any role to the arguments. >>> However, in our architecture (Institut Pasteur, Paris) it can't be possib= le >>> that any user may upload any other user's data in their Galaxy Data libra= ry. >>> >>> Thus, it is how ""upload_file_from_server" is working at the moment. >>> >>> As I understand the problem, it doesn't come from Bioblend itself, as all >>> arguments (as well as roles) are well transmitted on the server side. >>> >>> could somebody help me with that ? >>> >>> Happy new Year !!! and Have a nice day, >>> >>> -- >>> Olivia Doppelt-Azeroual, PhD >>> Tel: 92 15 >>> CIB - Institut Pasteur >>> >>> >>> ___________________________________________________________ >>> Please keep all replies on the list by using "reply all" >>> in your mail client. To manage your subscriptions to this >>> and other Galaxy lists, please use the interface at: >>> http://lists.bx.psu.edu/ >>> >>> To search Galaxy mailing lists use the unified search at: >>> http://galaxyproject.org/search/mailinglists/ > > > > ___________________________________________________________ > Please keep all replies on the list by using "reply all" > in your mail client. To manage your subscriptions to this > and other Galaxy lists, please use the interface at: > http://lists.bx.psu.edu/ > > To search Galaxy mailing lists use the unified search at: > http://galaxyproject.org/search/mailinglists/ --=20 Olivia Doppelt-Azeroual, PhD Tel: 92 15 CIB - Institut Pasteur --===============6857669158848256682== Content-Type: text/html Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.htm" MIME-Version: 1.0 PGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNP LTg4NTktMSIKICAgICAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIj4KICA8L2hlYWQ+CiAgPGJv ZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+CiAgICA8ZGl2IGNsYXNzPSJtb3ot Y2l0ZS1wcmVmaXgiPkhlbGxvIGFnYWluLCA8YnI+CiAgICAgIEkganVzdCByZW1pbmRlZCBhIGNh cGl0YWwgdGhpbmcgY29uY2VybmluZyB0aGUgYXBpIHNjcmlwdAogICAgICBsaWJyYXJ5X3VwbG9h ZF9mcm9tX2ltcG9ydF9kaXIucHkuIEFjdHVhbGx5IGl0IG9ubHkgd29ya3MgZm9yCiAgICAgIGFk bWluIHVzZXJzLiBzaW1wbGUgdXNlcnMgZG9uJ3QgaGF2ZSB0aGUgYXV0aG9yaXphdGlvbiB0byB1 cGxvYWQKICAgICAgYW55dGhpbmcgaW4gdGhlaXIgZ2FsYXh5IGxpYnJhcnkgdXNpbmcgdGhpcyBz Y3JpcHQuIEl0IGlzIHRoZSBtYWluCiAgICAgIHJlYXNvbiB3aHkgd2UgY2hvb3NlIHRvIHVzZXIg YmlvYmxlbmQuIDxicj4KICAgICAgLS08YnI+CiAgICAgIE9saXZpYTxicj4KICAgICAgPGJyPgog ICAgICA8YnI+CiAgICAgIExlIDA0LzAxLzE0IDIyOjEwLCBPbGl2aWEgRG9wcGVsdCBhICZlYWN1 dGU7Y3JpdCZuYnNwOzo8YnI+CiAgICA8L2Rpdj4KICAgIDxibG9ja3F1b3RlIGNpdGU9Im1pZDo1 MkM4NzhERS44MDIwNTAxQHBhc3RldXIuZnIiIHR5cGU9ImNpdGUiPgogICAgICA8bWV0YSBjb250 ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIKICAgICAgICBodHRwLWVxdWl2PSJD b250ZW50LVR5cGUiPgogICAgICA8ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPjxicj4KICAg ICAgICBMZSAwMy8wMS8xNCAxNTo0NCwgSm9obiBDaGlsdG9uIGEgJmVhY3V0ZTtjcml0Jm5ic3A7 Ojxicj4KICAgICAgPC9kaXY+CiAgICAgIDxibG9ja3F1b3RlCmNpdGU9Im1pZDpDQU53Ym9rY0p3 ditQMU50blY3VGhIME1mSHlUclZaWDV0WFM0VXRNWjlBK0hqU0V6NFFAbWFpbC5nbWFpbC5jb20i CiAgICAgICAgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSB3cmFwPSIiPkkgYW0gbm90IHN1cmUg SSB1bmRlcnN0YW5kIHRoZSBwcm9ibGVtLiBDYW4geW91IGNsYXJpZnkgYSBmZXcgcG9pbnRzOgoK SXMgYmlvYmxlbmQgbGV0dGluZyB1c2VycyBhc3NvY2lhdGUgcm9sZXMgd2l0aCBkYXRhIGxpYnJh cmllcyB0aGF0CnRoZXkgc2hvdWxkbid0IGJlIGFibGUgdG8gYW5kIHRoZSBvcGVyYXRpb24gaXMg c3VjY2VlZGluZyAtb3ItIGFyZSB5b3UKdHJ5aW5nIHRvIGFkZCByb2xlcyBhbmQgdGhlIG9wZXJh dGlvbiBpcyBmYWlsaW5nPwo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICBEZWFyIEpv aG4sIDxicj4KICAgICAgPGJyPgogICAgICBJbiBvdXIgR2FsYXh5IGluc3RhbmNlLCBlYWNoIHVz ZXIgY29ubmVjdGluZyB0byBHYWxheHkgaGFzIGEKICAgICAgbGlicmFyeSBhc3NvY2lhdGVkIHRv IGl0cyB1c2VyIHJvbGUgd2hpY2ggaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5CiAgICAgIGFzIHdl bGwgYXMgdHdvIGRpcmVjdG9yaWVzOyBvbmUgaW4gdGhlIGxpbmtzIGRpcmVjdG9yeQogICAgICBj b3JyZXNwb25kaW5nIHRvIG91ciAidXNlcl9saWJyYXJ5X2ltcG9ydF9kaXIiIGFuZCBvbmUgaW4g YW4KICAgICAgIm91dHB1dCIgZGlyZWN0b3J5IHRvIGVuYWJsZSB0aGUgdXNlcnMgdG8gZXhwb3J0 IHRoZWlyIHJlc3VsdHMKICAgICAgZnJvbSB0aGUgaW5zdGFuY2UuIDxicj4KICAgICAgPGJyPgog ICAgICBUaGUgdXNlciBkaXJlY3RvcmllcyBhcmUgcmVhZGFibGUgYnkgR2FsYXh5IGFuZCBieSB0 aGVtc2VsdmVzCiAgICAgICh1bml4IHJpZ2h0cyBhcmUgc2V0IHVzaW5nIGEgcm9vdCBjcm9uIHNj cmlwdCk8YnI+CiAgICAgIDxicj4KICAgICAgRm9yIGEgcHJvamVjdCwgd2UgbmVlZCB0byBkbyBi YXNpYyBnYWxheHkgc3R1ZmYgdXNpbmcgZWl0aGVyIHRoZQogICAgICBBUEkgc2NyaXB0cyBvciBi aW9ibGVuZCBhcGkuIFdlIGhhdmUgdHJpZWQgYm90aCBhbmQgYmlvYmxlbmQgaXMgYQogICAgICBs aXR0bGUgc2ltcGxlciB0byB1c2UuIDxicj4KICAgICAgPGJyPgogICAgICBVc2luZyB0aGUgYXBp IHNjcmlwdCBsaWJyYXJ5X3VwbG9hZF9mcm9tX2ltcG9ydF9kaXIucHksIHVzaW5nIGEKICAgICAg dXNlciBhcGkga2V5LCBvbmx5IGZpbGVzIGZyb20gdGhlIHVzZXIgZGlyZWN0b3J5IGFyZSAidXBs b2FkYWJsZSIuPGJyPgogICAgICA8YnI+CiAgICAgIEhvd2V2ZXIsIHVzaW5nIGJpb2JsZW5kIGZ1 bmN0aW9uIGZyb20gbGlicmFyaWVzIGNsYXNzCiAgICAgICJ1cGxvYWRfZmlsZV9mcm9tX3NlcnZl ciIsIGEgdXNlciB3aXRoIGl0cyBrZXkgY2FuIHVwbG9hZCB3aXRoaW4KICAgICAgaXRzIGdhbGF4 eSBsaWJyYXJ5LCB0aGUgZGF0YSBvZiBhbnlvbmUuIDxicj4KICAgICAgPGJyPgogICAgICAjZ2lP bGl2aWEubGlicmFyaWVzLnVwbG9hZF9maWxlX2Zyb21fc2VydmVyKCJPTElWSUFfQVBJX2tleSIs PGEKICAgICAgICBtb3otZG8tbm90LXNlbmQ9InRydWUiIGNsYXNzPSJtb3otdHh0LWxpbmstcmZj MjM5NkUiCiAgICAgICAgaHJlZj0ibWFpbHRvOi94eHh4eHh4L2xpbmtzL290aGVyVXNlckBwYXN0 ZXVyLmZyLyI+Ii94eHh4eHh4L2xpbmtzL290aGVyVXNlckBwYXN0ZXVyLmZyLyI8L2E+LCJGMDA0 NWE5ZmZkNzdkMTIyNiIpPGJyPgogICAgICA8YnI+CiAgICAgIDxicj4KICAgICAgVG8gZGlzYWJs ZSB0aGlzLCBpJ20gdHJ5aW5nIHRvIGFkZCBhbiBhc3NvY2lhdGUgcm9sZSB3aGVuIEkgbGF1bmNo CiAgICAgIHRoZSB1cGxvYWRfZmlsZV9mcm9tX3NlcnZlciBjb21tYW5kIGJ1dCBJIGdldCBhbiBl cnJvci4gPGJyPgogICAgICA8YnI+CiAgICAgIGdpT2xpdmlhLmxpYnJhcmllcy51cGxvYWRfZmls ZV9mcm9tX3NlcnZlcigiT0xJVklBX0FQSV9rZXkiLDxhCiAgICAgICAgbW96LWRvLW5vdC1zZW5k PSJ0cnVlIiBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIgogICAgICAgIGhyZWY9Im1haWx0 bzoveHh4eHh4eHgvbGlua3Mvb2xpdmlhQHBhc3RldXIuZnIvIj4iL3h4eHh4eHh4L2xpbmtzL29s aXZpYUBwYXN0ZXVyLmZyLyI8L2E+LAogICAgICAiRjAwNDVhOWZmZDc3ZDEyMjYiLCByb2xlcz0n PGEgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIgogICAgICAgIGNsYXNzPSJtb3otdHh0LWxpbmstYWJi cmV2aWF0ZWQiIGhyZWY9Im1haWx0bzpvbGl2aWFAcGFzdGV1ci5mciI+b2xpdmlhQHBhc3RldXIu ZnI8L2E+Jyk8YnI+CiAgICAgIDxicj4KICAgICAgYW5kIEkgZ2V0IHRoZSBmb2xsb3dpbmcgZXJy b3I6IDxicj4KICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPGFkZHJlc3M+ VHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOjwvYWRkcmVzcz4KICAgICAgICA8YWRk cmVzcz4mbmJzcDsgRmlsZSAiJmx0O2lucHV0Jmd0OyIsIGxpbmUgMSwgaW4gJmx0O21vZHVsZSZn dDs8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJlc3M+Jm5ic3A7IEZpbGUKICAgICAgICAgICIvdXNy L2xvY2FsL2xpYi9weXRob24yLjcvZGlzdC1wYWNrYWdlcy9iaW9ibGVuZC0wLjQuMl9kZXYtcHky LjcuZWdnL2Jpb2JsZW5kL2dhbGF4eS9saWJyYXJpZXMvX19pbml0X18ucHkiLAoKICAgICAgICAg IGxpbmUgMjQyLCBpbiB1cGxvYWRfZmlsZV9mcm9tX3NlcnZlcjwvYWRkcmVzcz4KICAgICAgICA8 YWRkcmVzcz4mbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIHNlbGYuX2RvX3VwbG9hZCgqKnZhcnMp PC9hZGRyZXNzPgogICAgICAgIDxhZGRyZXNzPiZuYnNwOyBGaWxlCiAgICAgICAgICAiL3Vzci9s b2NhbC9saWIvcHl0aG9uMi43L2Rpc3QtcGFja2FnZXMvYmlvYmxlbmQtMC40LjJfZGV2LXB5Mi43 LmVnZy9iaW9ibGVuZC9nYWxheHkvbGlicmFyaWVzL19faW5pdF9fLnB5IiwKCiAgICAgICAgICBs aW5lIDE5MCwgaW4gX2RvX3VwbG9hZDwvYWRkcmVzcz4KICAgICAgICA8YWRkcmVzcz4mbmJzcDsm bmJzcDsmbmJzcDsgZmlsZXNfYXR0YWNoZWQ9ZmlsZXNfYXR0YWNoZWQpPC9hZGRyZXNzPgogICAg ICAgIDxhZGRyZXNzPiZuYnNwOyBGaWxlCiAgICAgICAgICAiL3Vzci9sb2NhbC9saWIvcHl0aG9u Mi43L2Rpc3QtcGFja2FnZXMvYmlvYmxlbmQtMC40LjJfZGV2LXB5Mi43LmVnZy9iaW9ibGVuZC9n YWxheHkvY2xpZW50LnB5IiwKCiAgICAgICAgICBsaW5lIDcxLCBpbiBfcG9zdDwvYWRkcmVzcz4K ICAgICAgICA8YWRkcmVzcz4mbmJzcDsmbmJzcDsmbmJzcDsgciA9IHNlbGYuZ2kubWFrZV9wb3N0 X3JlcXVlc3QodXJsLCBwYXlsb2FkPXBheWxvYWQsCiAgICAgICAgICBmaWxlc19hdHRhY2hlZD1m aWxlc19hdHRhY2hlZCk8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJlc3M+Jm5ic3A7IEZpbGUKICAg ICAgICAgICIvdXNyL2xvY2FsL2xpYi9weXRob24yLjcvZGlzdC1wYWNrYWdlcy9iaW9ibGVuZC0w LjQuMl9kZXYtcHkyLjcuZWdnL2Jpb2JsZW5kL2dhbGF4eWNsaWVudC5weSIsCgogICAgICAgICAg bGluZSA5NCwgaW4gbWFrZV9wb3N0X3JlcXVlc3Q8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJlc3M+ Jm5ic3A7Jm5ic3A7Jm5ic3A7IHIuc3RhdHVzX2NvZGUsIGJvZHk9ci50ZXh0KSZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyAjIEBzZWUgc2VsZi5ib2R5CiAgICAgICAgICBmb3IgSFRUUCByZXNwb25z ZSBib2R5PC9hZGRyZXNzPgogICAgICAgIDxhZGRyZXNzPkNvbm5lY3Rpb25FcnJvcjogVW5leHBl Y3RlZCByZXNwb25zZSBmcm9tIGdhbGF4eTogNTAwOgogICAgICAgICAgJmx0O2h0bWwmZ3Q7PC9h ZGRyZXNzPgogICAgICAgIDxhZGRyZXNzPiZuYnNwOyAmbHQ7aGVhZCZndDsmbHQ7dGl0bGUmZ3Q7 SW50ZXJuYWwgU2VydmVyCiAgICAgICAgICBFcnJvciZsdDsvdGl0bGUmZ3Q7Jmx0Oy9oZWFkJmd0 OzwvYWRkcmVzcz4KICAgICAgICA8YWRkcmVzcz4mbmJzcDsgJmx0O2JvZHkmZ3Q7PC9hZGRyZXNz PgogICAgICAgIDxhZGRyZXNzPiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7aDEmZ3Q7SW50ZXJuYWwg U2VydmVyIEVycm9yJmx0Oy9oMSZndDs8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJlc3M+Jm5ic3A7 Jm5ic3A7Jm5ic3A7ICZsdDtwJmd0O1RoZSBzZXJ2ZXIgaGFzIGVpdGhlciBlcnJlZCBvciBpcwog ICAgICAgICAgaW5jYXBhYmxlIG9mIHBlcmZvcm1pbmc8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJl c3M+dGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uPC9hZGRyZXNzPgogICAgICAgIDxhZGRyZXNzPjxi cj4KICAgICAgICAgICZsdDtici8mZ3Q7PC9hZGRyZXNzPgogICAgICAgIDxhZGRyZXNzPiZsdDsh LS0mbmJzcDsgLS0mZ3Q7Jmx0Oy9wJmd0OzwvYWRkcmVzcz4KICAgICAgICA8YWRkcmVzcz4mbmJz cDsmbmJzcDsmbmJzcDsgJmx0O2hyIG5vc2hhZGUmZ3Q7PC9hZGRyZXNzPgogICAgICAgIDxhZGRy ZXNzPiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7ZGl2IGFsaWduPSJyaWdodCImZ3Q7V1NHSSBTZXJ2 ZXImbHQ7L2RpdiZndDs8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJlc3M+Jm5ic3A7ICZsdDsvYm9k eSZndDs8L2FkZHJlc3M+CiAgICAgICAgPGFkZHJlc3M+Jmx0Oy9odG1sJmd0OzwvYWRkcmVzcz4K ICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8YnI+CiAgICAgIDxibG9ja3F1b3RlCmNpdGU9Im1p ZDpDQU53Ym9rY0p3ditQMU50blY3VGhIME1mSHlUclZaWDV0WFM0VXRNWjlBK0hqU0V6NFFAbWFp bC5nbWFpbC5jb20iCiAgICAgICAgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSB3cmFwPSIiPklm IHRoZSBBUEkgaXMgcHJvZHVjaW5nIGFuIGVycm9yIG1lc3NhZ2UgY2FuIHlvdSBzaGFyZSB0aGF0 OiBpbgpwYXJ0aWN1bGFyIHRoaXMgY29kZSBpcyBwcm9iYWJseSByZXN1bHRpbmcgaW4gYW4gZXJy b3Igb3Igc29tZSBraW5kPwoKICAgICAgICAgICAgZWxpZiByb2xlczoKICAgICAgICAgICAgICAg ICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIHNlbGVjdGVkIHJvbGVzIHRvIGFzc29jaWF0ZQp3 aXRoIHRoZSBEQVRBU0VUX0FDQ0VTUyBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICAjIG9uIHRo ZSBkYXRhc2V0IHRoYXQgd291bGQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMuCiAgICAgICAg ICAgICAgICB2YXJzID0gZGljdCggREFUQVNFVF9BQ0NFU1NfaW49cm9sZXMgKQogICAgICAgICAg ICAgICAgcGVybWlzc2lvbnMsIGluX3JvbGVzLCBlcnJvciwgbWVzc2FnZSA9IFwKICAgICAgICAg ICAgICAgICAgICB0cmFucy5hcHAuc2VjdXJpdHlfYWdlbnQuZGVyaXZlX3JvbGVzX2Zyb21fYWNj ZXNzKAp0cmFucywgbGlicmFyeS5pZCwgY250cmxsZXIsIGxpYnJhcnk9VHJ1ZSwgKip2YXJzICkK ICAgICAgICAgICAgaWYgZXJyb3I6CiAgICAgICAgICAgICAgICBpZiBjbnRybGxlciA9PSAnYXBp JzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDAwLCBtZXNzYWdlPC9wcmU+CiAgICAgIDwv YmxvY2txdW90ZT4KICAgICAgPGJyPgogICAgICB0aGUgYXBpIGRvZXMgbm90IHByb2R1Y2UgYW55 IGVycm9yIHdoZW4gdGhlIGFwaSBrZXkgY29ycmVzcG9uZHMgdG8KICAgICAgdGhlIHVzZXIgd2hp Y2ggdHJpZXMgdG8gaW1wb3J0IGl0cyBvd24gZGF0YS48YnI+CiAgICAgIDxicj4KICAgICAgPGJy PgogICAgICA8YmxvY2txdW90ZQpjaXRlPSJtaWQ6Q0FOd2Jva2NKd3YrUDFOdG5WN1RoSDBNZkh5 VHJWWlg1dFhTNFV0TVo5QStIalNFejRRQG1haWwuZ21haWwuY29tIgogICAgICAgIHR5cGU9ImNp dGUiPgogICAgICAgIDxwcmUgd3JhcD0iIj5IYXMgeW91ciBpbnN0aXR1dGUgbWFkZSBtb2RpZmlj YXRpb25zIEdhbGF4eSB0byBlbmZvcmNlIHRoaXMKY29uc3RyYWludCAtICgiaXQgY2FuJ3QgYmUg cG9zc2libGUgdGhhdCBhbnkgdXNlciBtYXkgdXBsb2FkIGFueSBvdGhlcgp1c2VyJ3MgZGF0YSBp biB0aGVpciBHYWxheHkgRGF0YSBsaWJyYXJ5Iik/IEFsc28gaXMgdGhlIHRoaW5nIHlvdSBhcmUK dHJ5aW5nIHRvIGRvIHNvbWV0aGluZyB0aGF0IGlzIHdvcmtpbmcgdGhyb3VnaCB0aGUgd2ViIHVp IGJ1dCBub3QKdGhyb3VnaCB0aGUgQVBJLCBvciBoYXZlIHlvdSBvbmx5IHRyaWVkIHRocm91Z2gg dGhlIEFQST88L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8YnI+CiAgICAgIEkgZGlk IGEgZmV3IHRlc3RzIHllc3RlcmRheSwgYW5kIHRvIHJlc3VtZSwgaXQgd29ya3MgYXMgaXQgc2hv dWxkCiAgICAgIHVzaW5nIHRoZSBhcGkgc2NyaXB0IGJ1dCB0aGVyZSBpcyBhIHByb2JsZW0gdXNp bmcgYmlvYmxlbmQuIDxicj4KICAgICAgSSdtIG5vdCBzdXJlIHRoYXQgcm9sZXMgYXJlIHJlYWxs eSBuZWVkZWQgaGVyZSwgaSBvbmx5IHRob3VnaHQKICAgICAgdGhhdCBpdCBjb3VsZCBndWlkZSBn YWxheHkgKGFuZCBiaW9ibGVuZCkgdG8gbm90IHVwbG9hZCBkYXRhIHRoYXQKICAgICAgZG9lcyBu b3QgYmVsb25nIHRvIHVzZXIgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFQSSBrZXkpPGJyPgogICAg ICA8YnI+CiAgICAgIEkgbG9va2VkIGF0IHRoZSBzb3VyY2VzLCBhbmQgbXkgbWFqb3IgZG91YnQg d2FzIHRoYXQgYmlvYmxlbmQKICAgICAgZGlkbid0IHBhc3MgYWxsIHRoZSBhcmd1bWVudHMgYnV0 IGl0IGRvZXMsIGV2ZXJ5dGhpbmcgaXMKICAgICAgdHJhbnNtaXR0ZWQgdG8gZ2FsYXh5IGRvIGl0 IHNob3VsZCB3b3JrLjxicj4KICAgICAgPGJyPgogICAgICBUZWxsIG1lIGlmIHlvdSBuZWVkIG1v cmUgaW5mb3JtYXRpb24uIEknbGwgbG9vayBmdXJ0aGVyIG9uIG1vbmRheQogICAgICBidXQgaSdt IGtpbmQgb2Ygc3R1Y2suIDxicj4KICAgICAgPGJyPgogICAgICBUaGFuayB5b3UgZm9yIHlvdXIg aGVscCwgPGJyPgogICAgICA8YnI+CiAgICAgIENoZWVycywgPGJyPgogICAgICA8YnI+CiAgICAg IDxwcmUgY2xhc3M9Im1vei1zaWduYXR1cmUiIGNvbHM9IjcyIj4tLSAKT2xpdmlhIERvcHBlbHQt QXplcm91YWwsIFBoRApDSUIgLSBJbnN0aXR1dCBQYXN0ZXVyCjwvcHJlPgogICAgICA8YnI+CiAg ICAgIDxicj4KICAgICAgPGJsb2NrcXVvdGUKY2l0ZT0ibWlkOkNBTndib2tjSnd2K1AxTnRuVjdU aEgwTWZIeVRyVlpYNXRYUzRVdE1aOUErSGpTRXo0UUBtYWlsLmdtYWlsLmNvbSIKICAgICAgICB0 eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIHdyYXA9IiI+Ck9uIEZyaSwgSmFuIDMsIDIwMTQgYXQg NTozNiBBTSwgT2xpdmlhIERvcHBlbHQKPGEgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIiBjbGFzcz0i bW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86b2xpdmlhLmRvcHBlbHRAcGFzdGV1 ci5mciI+Jmx0O29saXZpYS5kb3BwZWx0QHBhc3RldXIuZnImZ3Q7PC9hPiB3cm90ZToKPC9wcmU+ CiAgICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgICA8cHJlIHdyYXA9IiI+ SGVsbG8gdG8gYWxsLAoKSSdtIHRyeWluZyB0byB1c2UgdGhlIGZ1bmN0aW9uICAidXBsb2FkX2Zp bGVfZnJvbV9zZXJ2ZXIiIGZyb20gdGhlIGdhbGF4eQpsaWJyYXJpZXMgYXBpIG9mIEJpb2JsZW5k LgoKSXQncyB3b3JraW5nIGNvcnJlY3RseSB3aGVuIGkgZG9uJ3QgYXNzb2NpYXRlIGFueSByb2xl IHRvIHRoZSBhcmd1bWVudHMuCkhvd2V2ZXIsIGluIG91ciBhcmNoaXRlY3R1cmUgKEluc3RpdHV0 IFBhc3RldXIsIFBhcmlzKSBpdCBjYW4ndCBiZSBwb3NzaWJsZQp0aGF0IGFueSB1c2VyIG1heSB1 cGxvYWQgYW55IG90aGVyIHVzZXIncyBkYXRhIGluIHRoZWlyIEdhbGF4eSBEYXRhIGxpYnJhcnku CgpUaHVzLCBpdCBpcyBob3cgIiJ1cGxvYWRfZmlsZV9mcm9tX3NlcnZlciIgaXMgd29ya2luZyBh dCB0aGUgbW9tZW50LgoKQXMgSSB1bmRlcnN0YW5kIHRoZSBwcm9ibGVtLCBpdCBkb2Vzbid0IGNv bWUgZnJvbSBCaW9ibGVuZCBpdHNlbGYsIGFzIGFsbAphcmd1bWVudHMgKGFzIHdlbGwgYXMgcm9s ZXMpIGFyZSB3ZWxsIHRyYW5zbWl0dGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KCmNvdWxkIHNvbWVi b2R5IGhlbHAgbWUgd2l0aCB0aGF0ID8KCkhhcHB5IG5ldyBZZWFyICEhISBhbmQgSGF2ZSBhIG5p Y2UgZGF5LAoKLS0KT2xpdmlhIERvcHBlbHQtQXplcm91YWwsIFBoRApUZWw6IDkyIDE1CkNJQiAt IEluc3RpdHV0IFBhc3RldXIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpQbGVhc2Uga2VlcCBhbGwgcmVwbGllcyBvbiB0aGUgbGlz dCBieSB1c2luZyAicmVwbHkgYWxsIgppbiB5b3VyIG1haWwgY2xpZW50LiAgVG8gbWFuYWdlIHlv dXIgc3Vic2NyaXB0aW9ucyB0byB0aGlzCmFuZCBvdGhlciBHYWxheHkgbGlzdHMsIHBsZWFzZSB1 c2UgdGhlIGludGVyZmFjZSBhdDoKICA8YSBtb3otZG8tbm90LXNlbmQ9InRydWUiIGNsYXNzPSJt b3otdHh0LWxpbmstZnJlZXRleHQiIGhyZWY9Imh0dHA6Ly9saXN0cy5ieC5wc3UuZWR1LyI+aHR0 cDovL2xpc3RzLmJ4LnBzdS5lZHUvPC9hPgoKVG8gc2VhcmNoIEdhbGF4eSBtYWlsaW5nIGxpc3Rz IHVzZSB0aGUgdW5pZmllZCBzZWFyY2ggYXQ6CiAgPGEgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIiBj bGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0IiBocmVmPSJodHRwOi8vZ2FsYXh5cHJvamVjdC5v cmcvc2VhcmNoL21haWxpbmdsaXN0cy8iPmh0dHA6Ly9nYWxheHlwcm9qZWN0Lm9yZy9zZWFyY2gv bWFpbGluZ2xpc3RzLzwvYT4KPC9wcmU+CiAgICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8L2Js b2NrcXVvdGU+CiAgICAgIDxicj4KICAgICAgPGJyPgogICAgICA8ZmllbGRzZXQgY2xhc3M9Im1p bWVBdHRhY2htZW50SGVhZGVyIj48L2ZpZWxkc2V0PgogICAgICA8YnI+CiAgICAgIDxwcmUgd3Jh cD0iIj5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpQbGVhc2Uga2VlcCBhbGwgcmVwbGllcyBvbiB0aGUgbGlzdCBieSB1c2luZyAicmVw bHkgYWxsIgppbiB5b3VyIG1haWwgY2xpZW50LiAgVG8gbWFuYWdlIHlvdXIgc3Vic2NyaXB0aW9u cyB0byB0aGlzCmFuZCBvdGhlciBHYWxheHkgbGlzdHMsIHBsZWFzZSB1c2UgdGhlIGludGVyZmFj ZSBhdDoKICA8YSBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0IiBocmVmPSJodHRwOi8vbGlz dHMuYngucHN1LmVkdS8iPmh0dHA6Ly9saXN0cy5ieC5wc3UuZWR1LzwvYT4KClRvIHNlYXJjaCBH YWxheHkgbWFpbGluZyBsaXN0cyB1c2UgdGhlIHVuaWZpZWQgc2VhcmNoIGF0OgogIDxhIGNsYXNz PSJtb3otdHh0LWxpbmstZnJlZXRleHQiIGhyZWY9Imh0dHA6Ly9nYWxheHlwcm9qZWN0Lm9yZy9z ZWFyY2gvbWFpbGluZ2xpc3RzLyI+aHR0cDovL2dhbGF4eXByb2plY3Qub3JnL3NlYXJjaC9tYWls aW5nbGlzdHMvPC9hPjwvcHJlPgogICAgPC9ibG9ja3F1b3RlPgogICAgPGJyPgogICAgPGJyPgog ICAgPHByZSBjbGFzcz0ibW96LXNpZ25hdHVyZSIgY29scz0iNzIiPi0tIApPbGl2aWEgRG9wcGVs dC1BemVyb3VhbCwgUGhEClRlbDogOTIgMTUKQ0lCIC0gSW5zdGl0dXQgUGFzdGV1cgo8L3ByZT4K ICA8L2JvZHk+CjwvaHRtbD4K --===============6857669158848256682==--