diff --git a/CHANGES.rst b/CHANGES.rst index 6e7a5b22f..5b9953db0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ for services like ESO's and MAST's TAP, which do not use canonical prefixes while astropy.utils.xml ignores namespaces. [#323] +- Overhaul of the registry.regsearch as discussed in + https://blog.g-vo.org/towards-data-discovery-in-pyvo.html. This + should be backwards-compatible. [#289] + +- Versions of astropy <4.1 are no longer supported. [#289] + 1.3.1 (unreleased) ================== diff --git a/README.rst b/README.rst index cf09e7408..2c2353b4a 100644 --- a/README.rst +++ b/README.rst @@ -50,7 +50,7 @@ PyVO requires Python 3.8 or later. The following packages are required for PyVO: - * `astropy `__ (>=4.0) + * `astropy `__ (>=4.1) * `requests `_ The following packages are optional dependencies and are required for the diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 886f3d391..531018bfb 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -4,58 +4,335 @@ Registry (`pyvo.registry`) ************************** -This subpackage let you find data access services using search parameters. +This is an interface to the Virtual Observatory Registry, a collection +of metadata records of the VO's “resources” (“resource” is jargon for: a +collection of datasets, usually with a service in front of it). For a +wider background, see `2014A&C.....7..101D`_ for the general +architecture and `2015A&C....10...88D`_ for the search interfaces. -Getting started +.. _2014A&C.....7..101D: https://ui.adsabs.harvard.edu/abs/2014A%26C.....7..101D/abstract +.. _2015A&C....10...88D: https://ui.adsabs.harvard.edu/abs/2015A%26C....10...88D/abstract + +There are two fundamental modes of searching in the VO: + +(a) Data discovery: This is when you are looking for some sort of data + collection based on its metadata; a classical example would be + something like “I need redshifts of supernovae”. + +(b) Service discovery: This is what you need when you want to query all + services of a certain kind (e.g., „all spectral services claiming to + have infrared data“), which in turn is the basis of all-VO *dataset* + discovery (“give me all infrared spectra of 3C273”) + +Both modes are supported by this module. + + +Basic interface =============== -Registry searches are performed using the :py:meth:`pyvo.registry.search` -method. - >>> from pyvo.registry import search as regsearch -It is possible to match against a list of ``keywords`` to find resources -related to a particular topic, for instances services containing data about -quasars. +The main interface for the module is :py:meth:`pyvo.registry.search`; +the examples below assume:: + + >>> from pyvo import registry + +This function accepts one or more search constraints, which can be +either specificed using constraint objects as positional arguments or as +keyword arguments. The following constraints are available: + +* :py:class:`pyvo.registry.Freetext` (``keywords``): one or more + freetext words, mached in the title, description or subject of the + resource. +* :py:class:`pyvo.registry.Servicetype` (``servicetype``): constrain to + one of tap, ssa, sia, conesearch (or full ivoids for other service + types). This is the constraint you want + to use for service discovery. +* :py:class:`pyvo.registry.UCD` (``ucd``): constrain by one or more UCD + patterns; resources match when they serve columns having a matching + UCD (e.g., ``phot.mag;em.ir.%`` for “any infrared magnitude”). +* :py:class:`pyvo.registry.Waveband` (``waveband``): one or more terms + from the vocabulary at http://www.ivoa.net/messenger giving the rough + spectral location of the resource. +* :py:class:`pyvo.registry.Author` (``author``): an author (“creator”). + This is a single SQL pattern, and given the sloppy practices in the + VO for how to write author names, you should probably generously use + wildcards. +* :py:class:`pyvo.registry.Datamodel` (``datamodel``): one of obscore, + epntap, or regtap: only return TAP services having tables of this + kind. +* :py:class:`pyvo.registry.Ivoid` (``ivoid``): exactly match a single + IVOA identifier (that is, in effect, the primary key in the VO). +* :py:class:`pyvo.registry.Spatial` (``spatial``): match resources + covering a certain geometry (point, circle, polygon, or MOC). + *RegTAP 1.2 Extension* +* :py:class:`pyvo.registry.Spectral` (``spectral``): match resources + covering a certain part of the spectrum (usually, but not limited to, + the electromagnetic spectrum). *RegTAP 1.2 Extension* +* :py:class:`pyvo.registry.Temporal` (``temporal``): match resources + covering a some point or interval in time. *RegTAP 1.2 Extension* + +Multiple constraints are combined conjunctively (”AND”). + +Constraints marked with *RegTAP 1.2 Extension* are not available on all +IVOA RegTAP services (they are on pyVO's default RegTAP endpoint, +though). Also refer to the class documentation for further caveats on +these. + +Hence, to look for for resources with UV data mentioning white dwarfs +you could either run: .. doctest-remote-data:: - >>> services = regsearch(keywords=['quasar']) + >>> resources = registry.search(keywords="white dwarf", waveband="UV") + +or: + +.. doctest-remote-data:: + + >>> resources = registry.search(registry.Freetext("white dwarf"), + ... registry.Waveband("UV")) + +or a mixture between the two. Constructing using explicit +constraints is generally preferable with more complex queries. Where +the constraints accept multiple arguments, you can pass in sequences to +the keyword arguments; for instance: + +.. doctest-remote-data:: + + >>> resources = registry.search(registry.Waveband("Radio", "Millimeter")) + +is equivalent to: + +.. doctest-remote-data:: + + >>> resources = registry.search(waveband=["Radio", "Millimeter"]) + +There is also :py:meth:`pyvo.registry.get_RegTAP_query`, accepting the +same arguments as :py:meth:`pyvo.registry.search`. This function simply +returns the ADQL query that search would execute. This is may be useful +to construct custom RegTAP queries, which could then be executed on +TAP services implementing the ``regtap`` data model. + + +Data Discovery +============== + +In data discovery, you look for resources matching your constraints and +then figure out in a second step how to query them. For instance, to +look for resources giving redshifts in connection with supernovae, +you would say: + +.. doctest-remote-data:: + + >>> resources = registry.search(registry.UCD("src.redshift"), + ... registry.Freetext("supernova")) + +After that, ``resources`` is an instance of +:py:class:`pyvo.registry.RegistryResults`, which you can iterate over. In +interactive data discovery, however, it is usually preferable to use the +``to_table`` method for an overview of the resources available: + +.. doctest-remote-data:: + + >>> resources.to_table() # doctest: +IGNORE_OUTPUT + + title ... interfaces + str67 ... str24 + --------------------------------------------------------------- ... ------------------------ + Asiago Supernova Catalogue (Barbon et al., 1999-) ... conesearch, tap#aux, web + Asiago Supernova Catalogue (Version 2008-Mar) ... conesearch, tap#aux, web + Sloan Digital Sky Survey-II Supernova Survey (Sako+, 2018) ... conesearch, tap#aux, web + ... + -A single keyword can be specified as a single string instead of a list. +The idea is that in notebook-like interfaces you can pick resources by +title, description, and perhaps the access mode (“interface”) offered. +In the list of interfaces, you will sometimes spot an ``#aux`` after a +standard id; this is a minor VO technicality that you can in practice +ignore. For instance, you can simply construct +:py:class:`pyvo.dal.TAPService`-s from ``tap#aux`` interfaces. + +Once you have found a resource you would like to query, pick it by index +(which will not be stable across multiple executions. +Use a resource's ivoid to identify resources over multiple runs +of a programme; cf. the :py:class:`pyvo.registry.Ivoid` +constraint). Use the ``get_service`` method of +:py:class:`pyvo.registry.RegistryResource` to obtain a DAL service +object for a particular sort of interface. +To query the fourth match using simple cone search, you would +thus say: .. doctest-remote-data:: - >>> services = regsearch(keywords='quasar') + >>> resources[4].get_service("conesearch").search(pos=(120, 73), sr=1) # doctest: +IGNORE_OUTPUT +
+ _r recno SN r_SN z sI e_sI t1 e_t1 I1 e_I1 t2 e_t2 I2 e_I2 chi2 N Simbad _RA _DE + deg d d mag mag d d mag mag deg deg + float64 int32 str6 uint8 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 int16 str6 float64 float64 + -------- ----- ----- ----- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- ----- ------ --------- --------- + 0.588592 19 1995E 3 0.012 1.026 0.040 0.067 0.635 15.393 0.024 26.340 0.950 16.093 0.050 6.78 14 Simbad 117.98646 73.00961 + -Furthermore the search can be limited to a certain ``servicetype``, one of -sia, ssa, scs, sla, tap. +To operate TAP services, you need to know what tables make up a +resource; you could construct a TAP service and access its ``tables`` +attribute, but you can take a shortcut and call a RegistryResource's +``get_tables`` method for a rather similar result: .. doctest-remote-data:: - >>> services = regsearch(keywords=['quasar'], servicetype='tap') + >>> tables = resources[4].get_tables() + >>> list(tables.keys()) + ['J/A+A/437/789/table2'] + >>> tables['J/A+A/437/789/table2'].columns + [, , , , , , , , , , , , , , , , , , ] -Filtering by the desired waveband is also possible. +In this case, this is a table with one of VizieR's somewhat funky names. +To run a TAP query based on this metadata, do something like: .. doctest-remote-data:: - >>> services = regsearch( - ... keywords=['quasar'], servicetype='tap', waveband='x-ray') + >>> resources[4].get_service("tap#aux").run_sync( + ... 'SELECT sn, z FROM "J/A+A/437/789/table2" WHERE z>0.04') +
+ SN z + object float64 + ------ ------- + 1992bh 0.045 + 1992bp 0.079 + 1993ag 0.049 + 1993O 0.051 -And at last, the data model can be specified. +A special sort of access mode is ``web``, which represents some facility related +to the resource that works in a web browser. You can ask for a +“service” for it, too; you will then receive an object that has a +``search`` method, and when you call it, a browser window should open +with the query facility (this uses python's webbrowser module): .. doctest-remote-data:: - >>> obscore_services = regsearch(datamodel='ObsCore') + >>> resources[4].get_service("web").search() + +Note that for interactive data discovery in the VO Registry, you may +also want to have a look at Aladin's discovery tree, TOPCAT's VO menu, +or at services like DataScope_ or WIRR_ in your web browser. + +.. _DataScope: https://heasarc.gsfc.nasa.gov/cgi-bin/vo/datascope/init.pl +.. _WIRR: https://dc.g-vo.org/WIRR + + +Service Discovery +================= + +Service discovery is what you want typcially in connection with a search +for datasets, as in “Give me all infrared spectra of Bellatrix“. To do +that, you want to run the same DAL query against all the services of a +given sort. This means that you will have to include a servicetype +constraint such that all resources in your registry results can be +queried in the same way. + +When that is the case, you can use each +RegistryResource's ``service`` attribute, which contains a DAL service +instance. The opening example could be written like this: + +.. This one is too expensive to run as part of CI/testing +.. doctest-skip:: + + >>> from astropy.coordinates import SkyCoord + >>> my_obj = SkyCoord.from_name("Bellatrix") + >>> for res in registry.search(waveband="infrared", servicetype="spectrum"): + ... print(res.service.search(pos=my_obj, size=0.001)) + ... + +In reality, you will have to add some error handling to this kind of +all-VO queries: in a wide and distributed network, some service is +always down. + +The central point is: With a servicetype constraint, each result has +a well-defined ``service`` attribute that contains some subclass of +dal.Service and that can be queried in a uniform fashion. + +TAP services may provide tables in well-defined data models, like +EPN-TAP or obscore. These can be queried in similar loops, although +in some cases you will have to adapt the queries to the resources found. + +In the obscore case, an all-VO query would look like this: + +.. Again, that's too expensive for CI/testing +.. doctest-skip:: + + >>> for svc_rec in registry.search(datamodel="obscore"): + ... print(svc_rec.service.run_sync( + ... "SELECT DISTINCT dataproduct_type FROM ivoa.obscore")) + + +Again, in production this needs explicit handling of failing services. +For an example of how this might look like, see `GAVO's plate tutorial`_ + +.. _GAVO's plate tutorial: http://docs.g-vo.org/gavo_plates.pdf + Search results ============== -Registry search results are similar to :ref:`pyvo-resultsets`. -See :py:class:`pyvo.registry.regtap.RegistryResource` for a listing of row -attributes. +What is coming back from registry.search is rather similar to +:ref:`pyvo-resultsets`; just remember that for interactive use there is +the ``to_tables`` method discussed above. + +The individual items are instances of +:py:class:`pyvo.registry.regtap.RegistryResource`, which expose many +pieces of metadata (e.g., title, description, creators, etc) in +attributes named like their RegTAP counterparts (see the class +documentation). A few attributes deserve a second look. + +First, ``service`` will, for resources that only have a single +capability, return a DAL service object ready for querying using the +respective protocol. You should only use that attribute when the +original reqistry query constrained the service type, because otherwise +there is no telling what kind of service you will get back. + +When the registry query did not constrain the service type, you can use +the ``access_modes`` method to see what capabilities are available. For +instance: + +.. doctest-remote-data:: + + >>> res = registry.search(ivoid="ivo://org.gavo.dc/flashheros/q/ssa")[0] + >>> res.access_modes() # doctest: +IGNORE_OUTPUT + {'ssa', 'datalink#links-1.0', 'tap#aux', 'web', 'soda#sync-1.0'} + +– this service can be accessed through SSA, TAP, a web interface, and +two special capabilities that pyvo cannot produce services for (mainly +because standalone service objects do not make much sense for them). + +To obtain a service for one of the access modes pyVO does support, use +``get_service(mode)``. For ``web``, this returns an object that opens a +web browser window when its ``query`` method is called. + +RegistryResource-s also have a ``get_contact`` method. Use this if the +service is down or seems to have bugs; you should in general get at +least an e-Mail address: + +.. doctest-remote-data:: + + >>> res.get_contact() + 'GAVO Data Center Team (++49 6221 54 1837) ' + +Finally, the registry has an idea of what kind of tables are published +through a resource, much like the VOSI tables endpoint (as a matter of +fact, the Registry should contain exactly what is there, as VOSI tables +in effect just gives a part of the registry record). Not all publishers +properly provide table metadata to the Registry, though, but most do these days, +and then you can run: + +.. doctest-remote-data:: + + >>> res.get_tables() + {'flashheros.data':
... 29 columns ...
, 'ivoa.obscore': ... 0 columns ...
} + Reference/API ============= .. automodapi:: pyvo.registry .. automodapi:: pyvo.registry.regtap +.. automodapi:: pyvo.registry.rtcons diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index 0e50e28fa..2f1eb92b5 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -4,9 +4,12 @@ The regtap module supports access to the IVOA Registries """ -from . import regtap +from .regtap import search, ivoid2service, get_RegTAP_query + +from .rtcons import (Constraint, + Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, + UCD, Spatial, Spectral, Temporal) -search = regtap.search -ivoid2service = regtap.ivoid2service - -__all__ = ["search"] +__all__ = ["search", "get_RegTAP_query", "Freetext", "Author", + "Servicetype", "Waveband", "Datamodel", "Ivoid", "UCD", + "Spatial", "Spectral", "Temporal"] diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 695234757..4538f5a82 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -15,66 +15,121 @@ This module provides basic, low-level access to the RegTAP Registries using standardized TAP-based services. """ +import functools import os + +from astropy import table + +from . import rtcons from ..dal import scs, sia, ssa, sla, tap, query as dalq +from ..io.vosi import vodataservice from ..utils.formatting import para_format_desc -__all__ = ["search", "RegistryResource", "RegistryResults", "ivoid2service"] +__all__ = ["search", "get_RegTAP_query", + "RegistryResource", "RegistryResults", "ivoid2service"] + +REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY", "http://reg.g-vo.org/tap" + ).rstrip("/") + + +# ADQL only has string_agg, where we need string arrays. We fake arrays +# by joining elements with a token separator that we think shouldn't +# turn up in the things joined. Of course, people could create +# resources that break us; let's assume there's nothing be gained +# from that ever. +TOKEN_SEP = ":::py VO sep:::" + + +def shorten_stdid(s): + """removes leading ivo://ivoa.net/std/ from s if present. + + We're using this to make the display and naming of standard ivoids + less ugly in several places. + + Nones remain Nones. + """ + if s and s.startswith("ivo://ivoa.net/std/"): + return s[19:] + return s + + +def expand_stdid(s): + """returns s if it already looks like a URI, and it prepends + ivo://ivoa.net/std otherwise. + + This is the (approximate) reverse of shorten_stdid. + """ + if s is None or "://" in s: + return s + return "ivo://ivoa.net/std/"+s + + +@functools.lru_cache(1) +def get_RegTAP_service(): + """ + a lazily created TAP service offering the RegTAP services. + + This uses regtap.REGISTRY_BASEURL. Always get the TAP service + there using this function to avoid re-creating the server + and profit from caching of capabilties, tables, etc. + """ + return tap.TAPService(REGISTRY_BASEURL) + -REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY") or "http://dc.g-vo.org/tap" +def get_RegTAP_query(*constraints:rtcons.Constraint, + includeaux=False, **kwargs): + """returns SQL for a RegTAP query for constraints and keywords. + + This function's parameters are as for search; this is basically + a wrapper for rtcons.build_regtap_query maintaining the legacy + keyword-based interface. + """ + constraints = list(constraints)+rtcons.keywords_to_constraints(kwargs) + + # maintain legacy includeaux by locating any Servicetype constraints + # and replacing them with ones that includes auxiliaries. + if includeaux: + for index, constraint in enumerate(constraints): + if isinstance(constraint, rtcons.Servicetype): + constraints[index] = constraint.include_auxiliary_services() -_service_type_map = { - "image": "sia", - "spectrum": "ssa", - "scs": "conesearch", - "line": "slap", - "sla": "slap", - "table": "tap" -} + return rtcons.build_regtap_query(constraints) -def search(keywords=None, servicetype=None, waveband=None, datamodel=None, includeaux=False): +def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): """ execute a simple query to the RegTAP registry. + The function accepts query constraints either as Constraint objects + passed in as positional arguments or as their associated keywords. + For what constraints are available, see + `Basic Interface`_. + + .. _Basic Interface: ../registry/index.html#basic-interface + + The values of keyword arguments may be tuples or lists when the associated + Constraint objects take multiple arguments. + + All constraints, whether passed in directly or via keywords, are + evaluated as a conjunction (i.e., in an AND clause). + Parameters ---------- - keywords : str or list of str - keyword terms to match to registry records. - Use this parameter to find resources related to a - particular topic. - servicetype : str - the service type to restrict results to. - Allowed values include - 'conesearch', - 'sia' , - 'ssa', - 'slap', - 'tap' - waveband : str - the name of a desired waveband; resources returned - will be restricted to those that indicate as having - data in that waveband. Allowed values include - 'radio', - 'millimeter', - 'infrared', - 'optical', - 'uv', - 'euv', - 'x-ray' - 'gamma-ray' - datamodel : str - the name of the datamodel to search for; makes only sence in - conjunction with servicetype tap (or no servicetype). - - See http://wiki.ivoa.net/twiki/bin/view/IVOA/IvoaDataModel for more - informations about data models. - includeaux : boolean + *constraints : `rtcons.Constraint` instances + The constraints (keywords to match, positions to cover, ...) + that the returned records need to satisfy. + + includeaux : bool Flag for whether to include auxiliary capabilities in results. This may result in duplicate capabilities being returned, especially if the servicetype is not specified. + **kwargs : strings, mostly + shorthands for `constraints`; see the documentation of + a specific constraint for what keyword it uses and what literal + it expects. + Returns ------- RegistryResults @@ -84,78 +139,11 @@ def search(keywords=None, servicetype=None, waveband=None, datamodel=None, inclu -------- RegistryResults """ - if not any((keywords, servicetype, waveband, datamodel)): - raise dalq.DALQueryError( - "No search parameters passed to registry search") - - wheres = list() - wheres.append("intf_role = 'std'") - - if isinstance(keywords, str): - keywords = [keywords] - - if keywords: - def _unions(): - for i, keyword in enumerate(keywords): - yield """ - SELECT isub{i}.ivoid FROM rr.res_subject AS isub{i} - WHERE isub{i}.res_subject ILIKE '%{keyword}%' - """.format(i=i, keyword=tap.escape(keyword)) - - yield """ - SELECT ires{i}.ivoid FROM rr.resource AS ires{i} - WHERE 1=ivo_hasword(ires{i}.res_description, '{keyword}') - OR 1=ivo_hasword(ires{i}.res_title, '{keyword}') - """.format(i=i, keyword=tap.escape(keyword)) - - unions = ' UNION '.join(_unions()) - wheres.append('rr.interface.ivoid IN ({})'.format(unions)) - - # capabilities as specified by servicetype and includeaux: - # default to all known service types - # limit to one servicetype if specified by known key or value - match_caps = set(_service_type_map.values()) - if servicetype: - if servicetype in _service_type_map.values(): - match_caps = set([servicetype]) - elif _service_type_map.get(servicetype) is not None: - match_caps= set([_service_type_map.get(servicetype)]) - else: - raise dalq.DALQueryError("Invalid servicetype parameter passed to registry search") - - if includeaux: - match_caps |= {s+"#aux" for s in match_caps} - - wheres.append('standard_id IN ({})'.format( - ",".join( - "'ivo://ivoa.net/std/"+s+"'" - for s in match_caps))) - - if waveband: - wheres.append("1 = ivo_hashlist_has(rr.resource.waveband, '{}')".format( - tap.escape(waveband))) - - if datamodel: - wheres.append(""" - rr.interface.ivoid IN ( - SELECT idet.ivoid FROM rr.res_detail as idet - WHERE idet.detail_xpath = '/capability/dataModel/@ivo-id' - AND 1 = ivo_nocasematch( - idet.detail_value, 'ivo://ivoa.net/std/{}%') - ) - """.format(tap.escape(datamodel))) - - query = """SELECT DISTINCT rr.interface.*, rr.capability.*, rr.resource.* - FROM rr.capability - NATURAL JOIN rr.interface - NATURAL JOIN rr.resource - {} - """.format( - ("WHERE " if wheres else "") + " AND ".join(wheres) - ) - - service = tap.TAPService(REGISTRY_BASEURL) - query = RegistryQuery(service.baseurl, query, maxrec=service.hardlimit) + service = get_RegTAP_service() + query = RegistryQuery( + service.baseurl, + get_RegTAP_query(*constraints, includeaux=includeaux, **kwargs), + maxrec=service.hardlimit) return query.execute() @@ -181,6 +169,14 @@ class RegistryResults(dalq.DALResults): """ an iterable set of results from a registry query. Each record is returned as RegistryResults + + You can iterate over these, or access them by (numeric) index; note, + however, that these indexes will not be stable across different + executions and thus should only be used in interactive sessions. + Alternatively, you can use short names as indexes; there *might* + be clashes for these, as they are not unique VO-wide. Where this + matters, you need to use full ivoids as index. + """ def getrecord(self, index): """ @@ -194,6 +190,141 @@ def getrecord(self, index): """ return RegistryResource(self, index) + def get_summary(self): + """ + returns a brief overview of the matched results as an astropy table. + + This is mainly intended for interactive use, where people would + like to inspect the matches in, perhaps, notebooks. + """ + return table.Table([ + list(range(len(self))), + [r.short_name for r in self], + [r.res_title for r in self], + [r.res_description for r in self], + [", ".join(sorted(r.access_modes())) for r in self]], + names=("index", "short_name", "title", "description", "interfaces"), + descriptions=( + "Index to access the resource within self", + "Short name", + "Resource title", + "Resource description", + "Access modes offered")) + + @functools.lru_cache(maxsize=None) + def _get_ivo_index(self): + return dict((r.ivoid, index) + for index, r in enumerate(self)) + + @functools.lru_cache(maxsize=None) + def _get_short_name_index(self): + return dict((r.short_name, index) + for index, r in enumerate(self)) + + def __getitem__(self, item): + """ + returns a record by numeric index, short names, or ivoid. + + This will raise an IndexError or a KeyError when item does + not match a record returned. + """ + if isinstance(item, int): + return self.getrecord(item) + + elif isinstance(item, str): + if item.startswith("ivo://"): + return self.getrecord(self._get_ivo_index()[item]) + else: + return self.getrecord(self._get_short_name_index()[item]) + + else: + raise IndexError(f"No resource matching {item}") + + +class _BrowserService: + """A pseudo-service class just opening a web browser for browser-based + services. + """ + def __init__(self, access_url): + self.access_url = access_url + + def search(self): + import webbrowser + webbrowser.open(self.access_url, 2) + + +class Interface: + """ + a service interface. + + These consist of an access URL, a standard id for the capability + (typically the ivoid of an IVOA standard, or None for free services), + an interface type (something like vs:paramhttp or vr:webbrowser) + and an indication if the interface is the "standard" interface + of the capability. + + Such interfaces can be turned into services using the ``to_service`` + method if pyvo knows how to talk to the interface. + + Note that the constructor arguments are assumed to be normalised + as in regtap (e.g., lowercased for the standardIDs). + """ + service_for_standardid = { + "ivo://ivoa.net/std/conesearch": scs.SCSService, + "ivo://ivoa.net/std/sia": sia.SIAService, + "ivo://ivoa.net/std/ssa": ssa.SSAService, + "ivo://ivoa.net/std/sla": sla.SLAService, + "ivo://ivoa.net/std/tap": tap.TAPService} + + def __init__(self, access_url, standard_id, intf_type, intf_role): + self.access_url = access_url + self.standard_id = standard_id or None + self.is_vosi = standard_id.startswith("ivo://ivoa.net/std/vosi") + self.type = intf_type or None + self.role = intf_role or None + self.is_standard = self.role=="std" + + def __repr__(self): + return (f"Interface({self.access_url!r}, {self.standard_id!r}," + f" {self.type!r}, {self.role!r})") + + def to_service(self): + if self.type=="vr:webbrowser": + return _BrowserService(self.access_url) + + if self.standard_id is None or not self.is_standard: + raise ValueError("This is not a standard interface. PyVO" + " cannot speak to it.") + + service_class = self.service_for_standardid.get( + self.standard_id.split("#")[0]) + if service_class is None: + raise ValueError("PyVO has no support for interfaces with" + f" standard id {self.standard_id}.") + + return service_class(self.access_url) + + def supports(self, standard_id): + """returns true if we believe the interface should be able to talk + standard_id. + + At this point, we naively check if the interfaces's standard_id + has standard_id as a prefix. At this point, we cut off standard_id + fragments for this purpose. This works for all current DAL + standards but would, for instance, not work for VOSI. Hence, + this may need further logic if we wanted to extend our service + generation to VOSI or, perhaps, VOSpace. + + Parameters + ---------- + + standard_id : str + The ivoid of a standard. + """ + if not self.standard_id: + return False + return self.standard_id.split("#")[0]==standard_id.split("#")[0] + class RegistryResource(dalq.Record): """ @@ -208,6 +339,56 @@ class RegistryResource(dalq.Record): _service = None + # the following attribute is used by datasearch._build_regtap_query + # to figure build the select clause; it is maintained here + # because this class knows what it expects to get. + # + # Each item is either a plain string for a column name, or + # a 2-tuple for an as clause; all plain strings are used + # used in the group by, and so it is assumed they are + # 1:1 to ivoid. + expected_columns = [ + "ivoid", + "res_type", + "short_name", + "res_title", + "content_level", + "res_description", + "reference_url", + "creator_seq", + "content_type", + "source_format", + "source_value", + "region_of_regard", + "waveband", + (f"\n ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", + "access_urls"), + (f"\n ivo_string_agg(COALESCE(standard_id, ''), '{TOKEN_SEP}')", + "standard_ids"), + (f"\n ivo_string_agg(COALESCE(intf_type, ''), '{TOKEN_SEP}')", + "intf_types"), + (f"\n ivo_string_agg(COALESCE(intf_role, ''), '{TOKEN_SEP}')", + "intf_roles"),] + + def __init__(self, results, index, session=None): + dalq.Record.__init__(self, results, index, session) + + self._mapping["access_urls" + ] = self._mapping["access_urls"].split(TOKEN_SEP) + self._mapping["standard_ids" + ] = self._mapping["standard_ids"].split(TOKEN_SEP) + self._mapping["intf_types" + ] = self._mapping["intf_types"].split(TOKEN_SEP) + self._mapping["intf_roles" + ] = self._mapping["intf_roles"].split(TOKEN_SEP) + + self.interfaces = [Interface(*props) + for props in zip( + self["access_urls"], + self["standard_ids"], + self["intf_types"], + self["intf_roles"])] + @property def ivoid(self): """ @@ -284,6 +465,14 @@ def source_format(self): """ return self.get("source_format", decode=True) + @property + def source_value(self): + """ + The bibliographic source for this resource (typically a bibcode + or a DOI). + """ + return self.get("source_value", decode=True) + @property def region_of_regard(self): """ @@ -305,34 +494,144 @@ def access_url(self): """ the URL that can be used to access the service resource. """ - return self.get("access_url", decode=True) + # some services declare some data models using multiple + # identifiers; in this case, we'll get the same access URL + # multiple times in here. Don't be alarmed when that happens: + access_urls = list(set(self["access_urls"])) + if len(access_urls)==1: + return access_urls[0] + else: + raise dalq.DALQueryError( + "No unique access URL. Use get_service.") @property def standard_id(self): """ the IVOA standard identifier """ - return self.get("standard_id", decode=True) + standard_ids = list(set(self["standard_ids"])) + if len(standard_ids)==1: + return standard_ids[0] + else: + raise dalq.DALQueryError( + "This resource supports several standards ({})." + " Use get_service or restrict your query using Servicetype." + .format(", ".join(sorted(self.access_modes())))) + + def access_modes(self): + """ + returns a set of interface identifiers available on + this resource. + + For standard interfaces, get_service will return a service + suitable for querying if you pass in an identifier from this + list as the service_type. + + This will ignore VOSI (infrastructure) services. + """ + return set(shorten_stdid(intf.standard_id) or "web" + for intf in self.interfaces + if (intf.standard_id or intf.type=="vr:webbrowser") + and not intf.is_vosi) + + def get_interface(self, + service_type:str, + lax:bool=True, + std_only:bool=False): + """returns a regtap.Interface class for service_type. + + Parameters + ---------- + + The meaning of the parameters is as for get_service. This + method does not return services, though, so you can use it to + obtain access URLs and such for interfaces that pyVO does + not (directly) support. In addition, + + std_only : bool + Only return interfaces declared as "std". This is what you + want when you want to construct pyVO service objects later. + This parameter is ignored for the "web" service type. + """ + if service_type=="web": + # this works very much differently in the Registry + # than do the proper services + candidates = [intf for intf in self.interfaces + if intf.type=="vr:webbrowser"] + + else: + service_type = expand_stdid( + rtcons.SERVICE_TYPE_MAP.get( + service_type, service_type)) + + candidates = [intf for intf in self.interfaces + if ((not std_only) or intf.is_standard) + and not intf.is_vosi + and ((not service_type) or intf.supports(service_type))] + + if not candidates: + raise ValueError( + "No matching interface.") + if len(candidates)>1 and not lax: + raise ValueError("Multiple matching interfaces found." + " Perhaps pass in service_type or use a Servicetype" + " constrain in the registry.search? Or use lax=True?") + + return candidates[0] + + def get_service(self, + service_type:str=None, + lax:bool=True): + """ + return an appropriate DALService subclass for this resource that + can be used to search the resource using service_type. + + Raise a ValueError if the service_type is not offerend on + the resource (or no standard service is offered). With + lax=False, also raise a ValueError if multiple interfaces + exist for the given service_type. + + VOSI (infrastructure) services are always ignored here. + + A magic service_type "web" can be passed in to get non-standard, + browser-based interfaces. The service in this case is an + object that opens a web browser if its query() method is called. + + Parameters + ---------- + service_type : str + If you leave out ``service_type``, this will return a service + for "the" standard interface of the resource. If a resource + has multiple standard capabilities (e.g., both TAP and SSAP + endpoints), this will raise a DALQueryError. + + Otherwise, a service of the given service type will be returned. + Pass in an ivoid of a standard or one of the shorthands from + rtcons.SERVICE_TYPE_MAP, or "web" for a web page (the "service" + for this will be an object opening a web browser when you call + its query method). + + lax : bool + If there are multiple capabilities for service_type, the + function choose the first matching capability by default + Pass lax=False to instead raise a DALQueryError. + """ + return self.get_interface(service_type, lax, std_only=True + ).to_service() @property def service(self): """ - return an appropriate DALService subclass for this resource that - can be used to search the resource. Return None if the resource is - not a recognized DAL service. Currently, only Conesearch, SIA, SSA, - and SLA services are supported. - """ - if self.access_url: - for key, value in { - "ivo://ivoa.net/std/conesearch": scs.SCSService, - "ivo://ivoa.net/std/sia": sia.SIAService, - "ivo://ivoa.net/std/ssa": ssa.SSAService, - "ivo://ivoa.net/std/sla": sla.SLAService, - "ivo://ivoa.net/std/tap": tap.TAPService, - }.items(): - if key in self.standard_id: - self._service = value(self.access_url) + return a service for this resource. + This will in general only work if the registry query has + constrained the service type; otherwise, many resources will + have multiple capabilities. Use get_service instead in + such cases. + """ + if self._service is not None: + return self._service + self._service = self.get_service(None, True) return self._service def search(self, *args, **keys): @@ -386,26 +685,16 @@ def describe(self, verbose=False, width=78, file=None): If provided, write information to this output stream. Otherwise, it is written to standard out. """ - restype = "Custom Service" - stdid = self.get("standard_id", decode=True).lower() - if stdid: - if stdid.startswith("ivo://ivoa.net/std/conesearch"): - restype = "Catalog Cone-search Service" - elif stdid.startswith("ivo://ivoa.net/std/sia"): - restype = "Image Data Service" - elif stdid.startswith("ivo://ivoa.net/std/ssa"): - restype = "Spectrum Data Service" - elif stdid.startswith("ivo://ivoa.net/std/slap"): - restype = "Spectral Line Database Service" - elif stdid.startswith("ivo://ivoa.net/std/tap"): - restype = "Table Access Protocol Service" - - print(restype, file=file) print(para_format_desc(self.res_title), file=file) print("Short Name: " + self.short_name, file=file) print("IVOA Identifier: " + self.ivoid, file=file) - if self.access_url: + print("Access modes: " + ", ".join(sorted(self.access_modes())), + file=file) + + try: print("Base URL: " + self.access_url, file=file) + except dalq.DALQueryError: + print("Multi-capabilty service -- use get_service()") if self.res_description: print(file=file) @@ -423,47 +712,137 @@ def describe(self, verbose=False, width=78, file=None): file=file) if verbose: - if self.standard_id: - print("StandardID: " + self.standard_id, file=file) if self.reference_url: print("More info: " + self.reference_url, file=file) + def get_contact(self): + """ + return contact information for this resource in a string. + + Use this to report bugs or unexpected downtime. + """ + res = get_RegTAP_service().run_sync(""" + SELECT role_name, email, telephone + FROM rr.res_role + WHERE + base_role='contact' + AND ivoid={}""".format( + rtcons.make_sql_literal(self.ivoid))) + + contacts = [] + for row in res: + contact = row["role_name"] + if row["telephone"]: + contact += f" ({row['telephone']})" + if row["email"]: + contact += f" <{row['email']}>" + contacts.append(contact) + + return "\n".join(contacts) + + def _build_vosi_column(self, column_row): + """ + return a io.vosi.vodataservice.Column element for a + query result from get_tables. + """ + res = vodataservice.TableParam() + for att_name in ["name", "ucd", "unit", "utype"]: + setattr(res, att_name, column_row[att_name]) + res.description = column_row["column_description"] + +# TODO: be more careful with the type; this isn't necessarily a +# VOTable type (regrettably) + res.datatype = vodataservice.VOTableType( + arraysize=column_row["arraysize"], + extendedType=column_row["extended_type"]) + res.datatype.content = column_row["datatype"] + + return res + + def _build_vosi_table(self, table_row, columns): + """ + return a io.vosi.vodataservice.Table element for a + query result from get_tables. + """ + res = vodataservice.Table() + res.name = table_row["table_name"] + res.title = table_row["table_title"] + res.description = table_row["table_description"] + res._columns = [ + self._build_vosi_column(row) + for row in columns] + + res.origin = self + + return res + + def get_tables(self, table_limit=20): + """ + return the structure of the tables underlying the service. + + This returns a dict with table names as keys and vosi.Table + objects as values (pretty much what tables returns for a TAP + service). The table instances will have an ``origin`` attribute + pointing back to the registry record. + + Note that not only TAP services can (and do) define table + structures. The meaning of non-TAP tables is not always + as clear. + + Also note that resources do not need to define tables at all. + You will receive an empty dictionary if they don't. + """ + svc = get_RegTAP_service() + + tables = svc.run_sync( + """SELECT table_name, table_description, table_index, table_title + FROM rr.res_table + WHERE ivoid={}""".format( + rtcons.make_sql_literal(self.ivoid))) + if len(tables)>table_limit: + raise dalq.DALQueryError(f"Resource {self.ivoid} reports" + f" {len(tables)} tables. Pass a higher table_limit" + " to see them all.") + + res = {} + for table_row in tables: + columns = svc.run_sync( + """ + SELECT name, ucd, unit, utype, datatype, arraysize, + extended_type, column_description + FROM rr.table_column + WHERE ivoid={} + AND table_index={}""".format( + rtcons.make_sql_literal(self.ivoid), + rtcons.make_sql_literal(table_row["table_index"]))) + res[table_row["table_name"]] = self._build_vosi_table( + table_row, columns) + + return res + def ivoid2service(ivoid, servicetype=None): - """Retern service(s) for a given IVOID. + """ + return service(s) for a given IVOID. The servicetype option specifies the kind of service requested (conesearch, sia, ssa, slap, or tap). By default, if none is given, a list of all matching services is returned. """ - service = tap.TAPService(REGISTRY_BASEURL) - results = service.run_sync(""" - SELECT DISTINCT access_url, standard_id FROM rr.capability - NATURAL JOIN rr.interface - WHERE ivoid = '{}' - """.format(tap.escape(ivoid))) - services = [] - ivo_cls = { - "ivo://ivoa.net/std/conesearch": scs.SCSService, - "ivo://ivoa.net/std/sia": sia.SIAService, - "ivo://ivoa.net/std/ssa": ssa.SSAService, - "ivo://ivoa.net/std/sla": sla.SLAService, - "ivo://ivoa.net/std/tap": tap.TAPService - } - for result in results: - thistype = result["standard_id"] - if thistype not in ivo_cls.keys(): - # This one is not a VO service - continue - cls = ivo_cls[thistype] - if servicetype is not None and servicetype not in thistype: - # Not the type of service you want - continue - elif servicetype is not None: - # Return only one service, the first of the requested type - return(cls(result["access_url"])) + constraints = [rtcons.Ivoid(ivoid)] + if servicetype is not None: + constraints.append(rtcons.Servicetype(servicetype)) + resources = search(*constraints) + if len(resources)==0: + if servicetype: + raise dalq.DALQueryError(f"No resource {ivoid} with" + f" {servicetype} capability.") else: - # Return a list of services - services.append(cls(result["access_url"])) - return services + raise dalq.DALQueryError(f"No resource {ivoid}") + + # We're grouping by ivoid in search, so if there's a result + # there is only one. + resource = resources[0] + + return resource.get_service(servicetype, lax=True) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py new file mode 100644 index 000000000..987f836cb --- /dev/null +++ b/pyvo/registry/rtcons.py @@ -0,0 +1,836 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Constraints for doing registry searches. + +The Constraint class encapsulates a query fragment in a RegTAP query, e.g., a +keyword, a sky location, an author name, a class of services. They are used +either directly as arguments to registry.search, or by passing keyword +arguments into registry.search. The mapping from keyword arguments to +constraint classes happens through the _keyword attribute in Constraint-derived +classes. +""" + +import datetime + +from astropy import units +from astropy import constants +from astropy.coordinates import SkyCoord +import numpy + +from ..dal import tap +from ..dal import query as dalq +from ..utils import vocabularies +from .import regtap + + +__all__ = ["Freetext", "Author", "Servicetype", "Waveband", + "Datamodel", "Ivoid", "UCD", "Spatial", "Spectral", "Temporal", + "build_regtap_query"] + + +# a mapping of service type shorthands to the ivoids of the +# corresponding standards. This is mostly to keep legacy APIs. +# In the future, preferably rely on shorten_stdid and expand_stdid +# from regtap. +SERVICE_TYPE_MAP = dict((k, "ivo://ivoa.net/std/"+v) + for k, v in [ + ("image", "sia"), + ("sia", "sia"), + ("spectrum", "ssa"), + ("ssap", "ssa"), + ("ssa", "ssa"), + ("scs", "conesearch"), + ("conesearch", "conesearch"), + ("line", "slap"), + ("slap", "slap"), + ("table", "tap"), + ("tap", "tap"), +]) + + +class _AsIs(str): + """a sentinel class make `make_sql_literal` not escape a string. + """ + + +def make_sql_literal(value): + """makes a SQL literal from a python value. + + This is not suitable as a device to ward against SQL injections; + in what we produce, callers could produce arbitrary SQL anyway. + The point of this function is to minimize surprises when building + constraints. + + Parameters + ---------- + + value : object + Conceptually, the function should produces SQL literals + for anything that might reasonably add up in a registry + query. In reality, a ValueError will be raised for anything + we do not know about. + + Returns + ------- + + str + A SQL literal. + """ + if isinstance(value, _AsIs): + return value + + if isinstance(value, str): + return "'{}'".format(value.replace("'", "''")) + + elif isinstance(value, bytes): + return "'{}'".format(value.decode("ascii").replace("'", "''")) + + elif isinstance(value, (int, numpy.integer)): + return "{:d}".format(value) + + elif isinstance(value, (float, numpy.floating)): + return repr(value) + + elif isinstance(value, datetime.datetime): + return "'{}'".format(value.isoformat()) + + else: + raise ValueError("Cannot format {} as a SQL literal" + .format(repr(value))) + + +def format_function_call(func_name, args): + """make an ADQL literal for a function call with arguments. + + Parameters + ---------- + func_name : str + the name of the function to call. + + args : sequence of anything + python values for the arguments for the function. + + Returns + ------- + str + ADQL ready for inclusion into a query. + """ + return "{}({})".format( + func_name, + ", ".join(make_sql_literal(a) for a in args)) + + +class Constraint: + """an abstract base class for data discovery contraints. + + These, essentially, are configurable RegTAP query fragments, + consisting of a where clause, parameters for filling that, + and possibly additional tables. + + Users construct concrete constraints with whatever they would like + to constrain things with. + + To implement a new constraint, in the constructor set ``_condition`` to a + string with {}-type replacement fields (assume all parameters are strings), + and define ``fillers`` to be a dictionary with values for the _condition + template. Don't worry about SQL-serialising the values, Constraint takes + care of that. If you need your Constraint to be "lazy" + (cf. Servicetype), it's ok to overrride get_search_condition without + an upcall to Constraint. + + If your constraints need extra tables, give them in a list + in _extra_tables. + + For the legacy x_search with keywords, define a _keyword + attribute containing the name of the parameter that should + generate such a constraint. When pickung up such keywords, + sequence values will in general be unpacked and turned into + sequences of constraints. Constraints that want to the all + arguments in the constructor can set takes_sequence to True. + """ + _extra_tables = [] + _condition = None + _fillers = None + _keyword = None + + takes_sequence = False + + def get_search_condition(self): + """ + Formats this constraint to an ADQL fragment. + + Returns + ------- + str + A string ready for inclusion into a WHERE clause. + """ + if self._condition is None: + raise NotImplementedError("{} is an abstract Constraint" + .format(self.__class__.__name__)) + + return self._condition.format(**self._get_sql_literals()) + + def _get_sql_literals(self): + """ + returns self._fillers as a dictionary of properly SQL-escaped + literals. + """ + if self._fillers: + return {k: make_sql_literal(v) for k, v in self._fillers.items()} + return {} + + +class Freetext(Constraint): + """ + A contraint using plain text to match against title, description, + subjects, and person names. + """ + _keyword = "keywords" + + def __init__(self, *words:str): + """ + + Parameters + ---------- + *words: tuple of str + It is recommended to pass multiple words in multiple strings + arguments. You can pass in phrases (i.e., multiple words + separated by space), but behaviour might then vary quite + significantly between different registries. + """ + # cross-table ORs kill the query planner. We therefore + # write the constraint as an IN condition on a UNION + # of subqueries; it may look as if this has to be + # really slow, but in fact it's almost always a lot + # faster than direct ORs. + base_queries = [ + "SELECT ivoid FROM rr.resource WHERE" + " 1=ivo_hasword(res_description, {{{parname}}})", + "SELECT ivoid FROM rr.resource WHERE" + " 1=ivo_hasword(res_title, {{{parname}}})", + "SELECT ivoid FROM rr.res_subject WHERE" + " res_subject ILIKE {{{parpatname}}}"] + self._fillers, subqueries = {}, [] + + for index, word in enumerate(words): + parname = "fulltext{}".format(index) + parpatname = "fulltextpar{}".format(index) + self._fillers[parname] = word + self._fillers[parpatname] = '%'+word+'%' + for q in base_queries: + subqueries.append(q.format(**locals())) + + self._condition = "ivoid IN ({})".format( + " UNION ".join(subqueries)) + + +class Author(Constraint): + """ + A constraint for creators (“authors”) of a resource; you can use SQL + patterns here. + + The match is case-sensitive. + """ + _keyword = "author" + + def __init__(self, name:str): + """ + + Parameters + ---------- + name: str + Note that regrettably there are no guarantees as to how authors + are written in the VO. This means that you will generally have + to write things like ``%Hubble%`` (% being “zero or more + characters” in SQL) here. + """ + self._condition = "role_name LIKE {auth} AND base_role='creator'" + self._fillers = {"auth": name} + + +class Servicetype(Constraint): + """ + A constraint for for the availability of a certain kind of service + on the result. + + The constraint normally is a custom keyword, one of: + + * ``image`` + * ``spectrum`` + * ``scs`` (for cone search services) + * ``line`` (for SLAP services) + * ``table`` (for TAP services) + + You can also pass in the standards' ivoid (which + generally looks like + ``ivo://ivoa.net/std/`` and have to be URIs with + a scheme part in any case); note, however, that for standards + pyVO does not know about it will not build service instances for + you. + + Multiple service types can be passed in; a match in that case + is for records having any of the service types passed in. + + The match is literal (i.e., no patterns are allowed); this means + that you will not receive records that only have auxiliary + services, which is what you want when enumerating all services + of a certain type in the VO. In data discovery (where, however, + you generally should not have Servicetype constraints), you + can use ``Servicetype(...).include_auxiliary_services()`` or + use registry.search's ``includeaux`` parameter; but, really, there + is little point using this constraint in data discovery in the first + place. + """ + _keyword = "servicetype" + + def __init__(self, *stds): + """ + + Parameters + ---------- + *stds: tuple of str + one or more standards identifiers. The constraint will + match records that have any of them. + """ + self.stdids = set() + + for std in stds: + if std in SERVICE_TYPE_MAP: + self.stdids.add(SERVICE_TYPE_MAP[std]) + elif "://" in std: + self.stdids.add(std) + else: + raise dalq.DALQueryError("Service type {} is neither a full" + " standard URI nor one of the bespoke identifiers" + " {}".format(std, ", ".join(SERVICE_TYPE_MAP))) + + def get_search_condition(self): + # we sort the stdids to make it easy for tests (and it's + # virtually free for the small sets we have here). + return "standard_id IN ({})".format( + ", ".join(make_sql_literal(s) for s in sorted(self.stdids))) + + def include_auxiliary_services(self): + """returns a Servicetype constraint that has self's + service types but includes the associated auxiliary services. + + This is a convenience to maintain registry.search's signature. + """ + return Servicetype(*(self.stdids | set( + std+'#aux' for std in self.stdids))) + + +class Waveband(Constraint): + """ + A constraint on messenger particles. + + This builds a constraint against rr.resource.waveband, i.e., + a verbal indication of the messenger particle, coming + from the IVOA vocabulary http://www.ivoa.net/messenger. + + The :py:class:`pyvo.registry.Spectral` constraint enables selections by particle energy, + but few resources actually give the necessary metadata (in 2021). + + Multiple wavebands can be given (and are effectively combined with OR). + """ + _keyword = "waveband" + _legal_terms = None + + def __init__(self, *bands): + """ + + Parameters + ---------- + *bands: tuple of strings + One or more of the terms given in http://www.ivoa.net/messenger. + The constraint matches when a resource declares at least + one of the messengers listed. + """ + if self.__class__._legal_terms is None: + self.__class__._legal_terms = {w.lower() for w in + vocabularies.get_vocabulary("messenger")["terms"]} + + bands = [band.lower() for band in bands] + for band in bands: + if band not in self._legal_terms: + raise dalq.DALQueryError( + f"Waveband {band} is not in the IVOA messenger" + " vocabulary http://www.ivoa.net/rdf/messenger.") + + self.bands = list(bands) + self._condition = " OR ".join( + "1 = ivo_hashlist_has(rr.resource.waveband, {})".format( + make_sql_literal(band)) + for band in self.bands) + + +class Datamodel(Constraint): + """ + A constraint on the adherence to a data model. + + This constraint only lets resources pass that declare support for + one of several well-known data models; the SQL produced depends + on the data model identifier. + + Known data models at this point include: + + * obscore -- generic observational data + * epntap -- solar system data + * regtap -- the VO registry. + + DM names are matched case-insensitively here mainly for + historical reasons. + """ + _keyword = "datamodel" + + # if you add to this list, you have to define a method + # _make__constraint. + _known_dms = {"obscore", "epntap", "regtap"} + + def __init__(self, dmname): + """ + + Parameters + ---------- + dmname : string + A well-known name; currently one of obscore, epntap, and regtap. + """ + dmname = dmname.lower() + if dmname not in self._known_dms: + raise dalq.DALQueryError("Unknown data model id {}. Known are: {}." + .format(dmname, ", ".join(sorted(self._known_dms)))) + self._condition = getattr(self, f"_make_{dmname}_constraint")() + + def _make_obscore_constraint(self): + # There was a bit of chaos with the DM ids for Obscore. + # Be lenient here + self._extra_tables = ["rr.res_detail"] + obscore_pat = 'ivo://ivoa.net/std/obscore%' + return ("detail_xpath = '/capability/dataModel/@ivo-id'" + f" AND 1 = ivo_nocasematch(detail_value, '{obscore_pat}')") + + def _make_epntap_constraint(self): + self._extra_tables = ["rr.res_table"] + # we include legacy, pre-IVOA utypes for matches; lowercase + # any new identifiers (utypes case-fold). + return " OR ".join( + f"table_utype LIKE {pat}'" for pat in + ['ivo://vopdc.obspm/std/epncore#schema-2.%', + 'ivo://ivoa.net/std/epntap#table-2.%']) + + def _make_regtap_constraint(self): + self._extra_tables = ["rr.res_detail"] + regtap_pat = 'ivo://ivoa.net/std/RegTAP#1.%' + return ("detail_xpath = '/capability/dataModel/@ivo-id'" + f" AND 1 = ivo_nocasematch(detail_value, '{regtap_pat}')") + + +class Ivoid(Constraint): + """ + A constraint selecting a single resource by its IVOA identifier. + """ + _keyword = "ivoid" + + def __init__(self, ivoid): + """ + + Parameters + ---------- + + ivoid : string + The IVOA identifier of the resource to match. As RegTAP + requires lowercasing ivoids on ingestion, the constraint + lowercases the ivoid passed in, too. + """ + self._condition = "ivoid = {ivoid}" + self._fillers = {"ivoid": ivoid.lower()} + + +class UCD(Constraint): + """ + A constraint selecting resources having tables with columns having + UCDs matching a SQL pattern (% as wildcard). + """ + _keyword = "ucd" + + def __init__(self, *patterns): + """ + + Parameters + ---------- + + patterns : tuple of strings + SQL patterns (i.e., ``%`` is 0 or more characters) for + UCDs. The constraint will match when a resource has + at least one column matching one of the patterns. + """ + self._extra_tables = ["rr.table_column"] + self._condition = " OR ".join( + f"ucd LIKE {{ucd{i}}}" for i in range(len(patterns))) + self._fillers = dict((f"ucd{index}", pattern) + for index, pattern in enumerate(patterns)) + + +class Spatial(Constraint): + """ + A RegTAP constraint selecting resources covering a geometry in + space. + + This is a RegTAP 1.2 extension not yet available on all Registries + (in 2022). Also note that not all data providers give spatial coverage + for their resources. + + To find resources having data for RA/Dec 347.38/8.6772:: + + >>> from pyvo import registry + >>> resources = registry.Spatial((347.38, 8.6772)) + + To find resources claiming to have data for a spherical circle 2 degrees + around that point:: + + >>> resources = registry.Spatial((347.38, 8.6772, 2)) + + To find resources claiming to have data for a polygon described by + the vertices (23, -40), (26, -39), (25, -43) in ICRS RA/Dec:: + + >>> resources = registry.Spatial([23, -40, 26, -39, 25, -43]) + + To find resources claiming to cover a MOC_, pass an ASCII MOC:: + + >>> resources = registry.Spatial("0/1-3 3/") + + .. _MOC: https://www.ivoa.net/documents/MOC/ + + When you already have an astropy SkyCoord:: + + >>> from astropy.coordinates import SkyCoord + >>> resources = registry.Spatial(SkyCoord("23d +3d")) + + SkyCoords also work as circle centers (plain floats for the radius + are interpreted in degrees):: + + >>> resources = registry.Spatial((SkyCoord("23d +3d"), 3)) + """ + _keyword = "spatial" + _condition = "1 = CONTAINS({geom}, coverage)" + _extra_tables = ["rr.stc_spatial"] + + takes_sequence = True + + def __init__(self, geom_spec, order=6): + """ + + Parameters + ---------- + geom_spec : object + For now, this is DALI-style: a 2-sequence is interpreted + as a DALI point, a 3-sequence as a DALI circle, a 2n sequence + as a DALI polygon. Additionally, strings are interpreted + as ASCII MOCs, SkyCoords as points, and a pair of a + SkyCoord and a float as a circle. Other types (proper + geometries or pymoc objects) might be supported in the + future. + order : int, optional + Non-MOC geometries are converted to MOCs before comparing + them to the resource coverage. By default, this contrains + uses order 6, which corresponds to about a degree of resolution + and is what RegTAP recommends as a sane default for the + order actually used for the coverages in the database. + """ + def tomoc(s): + return _AsIs("MOC({}, {})".format(order, s)) + + if isinstance(geom_spec, str): + geom = _AsIs("MOC({})".format( + make_sql_literal(geom_spec))) + + elif isinstance(geom_spec, SkyCoord): + geom = tomoc(format_function_call("POINT", + (geom_spec.ra.value, geom_spec.dec.value))) + + elif len(geom_spec)==2: + if isinstance(geom_spec[0], SkyCoord): + geom = tomoc(format_function_call("CIRCLE", + [geom_spec[0].ra.value, geom_spec[0].dec.value, + geom_spec[1]])) + else: + geom = tomoc(format_function_call("POINT", geom_spec)) + + elif len(geom_spec)==3: + geom = tomoc(format_function_call("CIRCLE", geom_spec)) + + elif len(geom_spec)%2==0: + geom = tomoc(format_function_call("POLYGON", geom_spec)) + + else: + raise ValueError("This constraint needs DALI-style geometries.") + + self._fillers = {"geom": geom} + + +class Spectral(Constraint): + """ + A RegTAP constraint on the spectral coverage of resources. + + This is a RegTAP 1.2 extension not yet available on all Registries + (in 2022). Worse, not too many resources bother declaring this + at this point. For robustness, it might be preferable to use + the `Waveband` constraint for the time being.. + + This constraint accepts quantities, i.e., values with units, and will + convert them to RegTAP's representation (which is Joule of particle energy) + if it can. This ought to work for wavelengths, frequencies, and energies. + Plain numbers are interpreted as particle energies in Joule. + + RegTAP uses the observer frame at the solar system barycenter, but + it is probably wise to use constraints suitably relaxed such that + frame and reference position (within reason) do not matter. + + To find resources covering the messenger particle energy 5 eV:: + + >>> from pyvo import registry + >>> resources = registry.Spectral(5*units.eV) + + To find resources overlapping the band between 5000 and 6000 Ångström:: + + >>> resources = registry.Spectral((5000*units.Angstrom, 6000*units.Angstrom)) + + To find resources having data in the FM band:: + + >>> resources = registry.Spectral((88*units.MHz, 102*units.MHz)) + """ + _keyword = "spectral" + _extra_tables = ["rr.stc_spectral"] + + takes_sequence = True + + def __init__(self, spec): + """ + + Parameters + ---------- + spec : astropy.Quantity or a 2-tuple of astropy.Quantity-s + A spectral point or interval to cover. This must be a wavelength, + a frequency, or an energy, or a pair of such quantities, + in which case the argument is interpreted as an interval. + All resources *overlapping* the interval are returned. + Plain floats are interpreted as messenger energy in Joule. + """ + if isinstance(spec, tuple): + self._fillers = { + "spec_lo": self._to_joule(spec[0]), + "spec_hi": self._to_joule(spec[1])} + self._condition = ("1 = ivo_interval_overlaps(" + "spectral_start, spectral_end, {spec_lo}, {spec_hi})") + + else: + self._fillers = { + "spec": self._to_joule(spec)} + self._condition = "{spec} BETWEEN spectral_start AND spectral_end" + + def _to_joule(self, quant): + """returns a spectral quantity as a float in joule. + + A plain float is returned as-is. + """ + if isinstance(quant, (float, int)): + return quant + + try: + # is it an energy? + return quant.to(units.Joule).value + except units.UnitConversionError: + pass # try next + + try: + # is it a wavelength? + return (constants.h*constants.c/quant.to(units.m)).value + except units.UnitConversionError: + pass # try next + + try: + # is it a frequency? + return (constants.h*quant.to(units.Hz)).value + except units.UnitConversionError: + pass # fall through to give up + + raise ValueError(f"Cannot make a spectral quantity out of {quant}") + + +class Temporal(Constraint): + """ + A RegTAP constraint on the temporal coverage of resources. + + This is a RegTAP 1.2 extension not yet available on all Registries + (in 2022). Worse, not too many resources bother declaring this + at this point. Until this changes, you will probably have a lot of false + negatives (i.e., resources that should match but do not because they + are not declaring their time coverage) if you use this constraint. + + This constraint accepts astropy Time instances or pairs of Times + when specifying intervals. Plain numbers will be interpreted as + MJD. RegTAP uses TDB times at the solar system barycenter, and it is + probably wise to relax constraints such that such details do not matter. + This constraint does not attempt any conversions of time scales or + reference positions. + + To find resources claiming to have data for Jan 10, 2022:: + + >>> from pyvo import registry + >>> from astropy.time import Time + >>> resources = registry.Temporal(Time('2022-01-10')) + + To find resources claiming to have data for some time between + MJD 54130 and 54200:: + + >>> resources = registry.Temporal((54130, 54200)) + """ + _keyword = "temporal" + _extra_tables = ["rr.stc_temporal"] + + takes_sequence = True + + def __init__(self, times): + """ + + Parameters + ---------- + spec : astropy.Time or a 2-tuple of astropy.Time-s + A point in time or time interval to cover. Plain numbers + are interpreted as MJD. All resources *overlapping* the + interval are returned. + """ + if isinstance(times, tuple): + self._fillers = { + "time_lo": self._to_mjd(times[0]), + "time_hi": self._to_mjd(times[1])} + self._condition = ("1 = ivo_interval_overlaps(" + "time_start, time_end, {time_lo}, {time_hi})") + + else: + self._fillers = { + "time": self._to_mjd(times)} + self._condition = "{time} BETWEEN time_start AND time_end" + + def _to_mjd(self, quant): + """returns a time specification in MJD. + + Times not corresponding to a single point in time are rejected. + + A plain float is returned as-is. + """ + if isinstance(quant, (float, int)): + return quant + + val = quant.to_value('mjd') + if not isinstance(val, numpy.number): + raise ValueError("RegTAP time constraints must be made from" + " single time instants.") + return val + + +# NOTE: If you add new Contraint-s, don't forget to add them in +# registry.__init__ and in docs/registry/index.rst. + + +def build_regtap_query(constraints): + """returns a RegTAP query ready for submission from a list of + Constraint instances. + + Parameters + ---------- + constraints: sequence of `Constraint`-s + A sequence of constraints for a RegTAP query. All of them + will become part of a conjunction (i.e., all of them have + to be satisfied for a record to match). + + Returns + ------- + str + An ADQL literal ready for submission to a RegTAP service. + """ + if not constraints: + raise dalq.DALQueryError( + "No search parameters passed to registry search") + + serialized, extra_tables = [], set() + for constraint in constraints: + if isinstance(constraint, str): + constraint = Freetext(constraint) + + serialized.append("("+constraint.get_search_condition()+")") + extra_tables |= set(constraint._extra_tables) + + joined_tables = ["rr.resource", "rr.capability", "rr.interface" + ]+list(extra_tables) + + # see comment in regtap.RegistryResource for the following + # oddity + select_clause, plain_columns = [], [] + for col_desc in regtap.RegistryResource.expected_columns: + if isinstance(col_desc, str): + select_clause.append(col_desc) + plain_columns.append(col_desc) + else: + select_clause.append("{} AS {}".format(*col_desc)) + + fragments = ["SELECT", + ", ".join(select_clause), + "FROM", + "\nNATURAL LEFT OUTER JOIN ".join(joined_tables), + "WHERE", + "\n AND ".join(serialized), + "GROUP BY", + ", ".join(plain_columns)] + + return "\n".join(fragments) + + +def keywords_to_constraints(keywords): + """returns constraints expressed as keywords as Constraint instances. + + Parameters + ---------- + keywords : dict + regsearch arguments as a kwargs-style dictionary. + + Returns + ------- + sequence of `Constraint`-s + + Raises + ------ + DALQueryError + if an unknown keyword is encountered. + """ + constraints = [] + for keyword, value in keywords.items(): + if keyword not in _KEYWORD_TO_CONSTRAINT: + raise TypeError(f"{keyword} is not a valid registry" + " constraint keyword. Use one of {}.".format( + ", ".join(sorted(_KEYWORD_TO_CONSTRAINT)))) + + constraint_class = _KEYWORD_TO_CONSTRAINT[keyword] + if (isinstance(value, (tuple, list)) + and not constraint_class.takes_sequence): + constraints.append(constraint_class(*value)) + else: + constraints.append(constraint_class(value)) + return constraints + + +def _make_constraint_map(): + """returns a map of _keyword to constraint classes. + + This is used in module initialisation. + """ + keyword_to_constraint = {} + for att_name, obj in globals().items(): + if (isinstance(obj, type) + and issubclass(obj, Constraint) + and obj._keyword): + keyword_to_constraint[obj._keyword] = obj + return keyword_to_constraint + + +_KEYWORD_TO_CONSTRAINT = _make_constraint_map() diff --git a/pyvo/registry/tests/commonfixtures.py b/pyvo/registry/tests/commonfixtures.py new file mode 100644 index 000000000..15dfcef70 --- /dev/null +++ b/pyvo/registry/tests/commonfixtures.py @@ -0,0 +1,28 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Common fixtures for pyVO registry tests +""" + +import os + +import pytest + +from astropy.utils.data import ( + get_pkg_data_filename, + import_file_to_cache) +# We need to populate the vocabulary cache with our test data; +# we cannot use requests_mock here because a.u.data uses urllib. +from astropy.utils.data import _get_download_cache_loc, _url_to_dirname + + +@pytest.fixture() +def messenger_vocabulary(mocker): + """the IVOA messenger vocabulary in astropy's cache. + + Should we clean up after ourselves? + """ + import_file_to_cache( + 'http://www.ivoa.net/rdf/messenger', + get_pkg_data_filename( + 'data/messenger.desise', + package=__package__)) diff --git a/pyvo/registry/tests/data/README b/pyvo/registry/tests/data/README new file mode 100644 index 000000000..4a8559a09 --- /dev/null +++ b/pyvo/registry/tests/data/README @@ -0,0 +1,2 @@ +Instructions for how to update these data items should be found in +the fixtures in test_regtap.py diff --git a/pyvo/registry/tests/data/messenger.desise b/pyvo/registry/tests/data/messenger.desise new file mode 100644 index 000000000..63fb6e3af --- /dev/null +++ b/pyvo/registry/tests/data/messenger.desise @@ -0,0 +1,103 @@ +{ + "uri": "http://www.ivoa.net/rdf/messenger", + "flavour": "RDF Class", + "terms": { + "Photon": { + "label": "Photon", + "description": " Carrier particles of the electromagnetic interaction", + "preliminary": "", + "wider": [], + "narrower": [ + "Radio", + "Millimeter", + "Infrared", + "Optical", + "UV", + "X-ray", + "Gamma-ray", + "EUV" + ] + }, + "Radio": { + "label": "Radio", + "description": " Photon with a wavelength longer than 10 mm (or \u03bd<30 GHz)", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Millimeter": { + "label": "Millimeter", + "description": " Photon with a wavelength between 0.1 mm and 10 mm (or 30 GHz<=\u03bd<300 GHz)", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Infrared": { + "label": "Infrared", + "description": " Photon with a wavelength between 1 \u00b5m and 100 \u00b5m", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Optical": { + "label": "Optical", + "description": " Photon with a wavelength between 300 nm and 1000 nm", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "UV": { + "label": "Ultraviolet", + "description": " Photon with a wavelength between 100 nm and 300 nm", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [ + "EUV" + ] + }, + "EUV": { + "label": "Extreme UV", + "description": " Photon with an energy between 12 eV and 120 eV", + "preliminary": "", + "wider": [ + "UV" + ], + "narrower": [] + }, + "X-ray": { + "label": "X-Ray", + "description": " Photon with an energy between 120 eV and 120 keV", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Gamma-ray": { + "label": "Gamma Ray", + "description": " Photon with an energy above 120 keV", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Neutrino": { + "label": "Neutrino", + "description": " This term comprises all generations of neutrinos (electron, \u00b5, \u03c4), and particles as well as antiparticles.", + "preliminary": "", + "wider": [], + "narrower": [] + } + } +} \ No newline at end of file diff --git a/pyvo/registry/tests/data/multi-interface.xml b/pyvo/registry/tests/data/multi-interface.xml new file mode 100644 index 000000000..e945cc2e5 --- /dev/null +++ b/pyvo/registry/tests/data/multi-interface.xml @@ -0,0 +1,39 @@ + + Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) +present in this registry. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://localhost:8080/tableinfo/rr.capabilityFor advice on how to cite the resource(s) that contributed to this result, see http://localhost:8080/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://localhost:8080/tableinfo/rr.interface +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_level. +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_type. +The allowed values for waveband include: +Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vs:datacollection, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAIml2bzovL29yZy5nYXZvLmRjL2ZsYXNoaGVyb3MvcS9zc2EAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQRmxhc2gvSGVyb3MgU1NBUAAAABAARgBsAGEAcwBoAC8ASABlAHIAbwBzACAAUwBTAEEAUAAAAAAAAAEVAFMAcABlAGMAdAByAGEAIABmAHIAbwBtACAAdABoAGUAIABGAGwAYQBzAGgAIABhAG4AZAAgAEgAZQByAG8AcwAgAEUAYwBoAGUAbABsAGUAIABzAHAAZQBjAHQAcgBvAGcAcgBhAHAAaABzACAAZABlAHYAZQBsAG8AcABlAGQAIABhAHQACgBMAGEAbgBkAGUAcwBzAHQAZQByAG4AdwBhAHIAdABlACAASABlAGkAZABlAGwAYgBlAHIAZwAgAGEAbgBkACAAbQBvAHUAbgB0AGUAZAAgAGEAdAAgAEwAYQAgAFMAaQBsAGwAYQAgAGEAbgBkACAAdgBhAHIAaQBvAHUAcwAgAG8AdABoAGUAcgAKAG8AYgBzAGUAcgB2AGEAdABvAHIAaQBlAHMALgAgAFQAaABlACAAZABhAHQAYQAgAG0AbwBzAHQAbAB5ACAAYwBvAG4AdABhAGkAbgBzACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAE8AQgAgAHMAdABhAHIAcwAuACAASABlAHIAbwBzACAAdwBhAHMACgB0AGgAZQAgAG4AYQBtAGUAIABvAGYAIAB0AGgAZQAgAGkAbgBzAHQAcgB1AG0AZQBuAHQAIABhAGYAdABlAHIAIABGAGwAYQBzAGgAIABnAG8AdAAgAGEAIABzAGUAYwBvAG4AZAAgAGMAaABhAG4AbgBlAGwAIABpAG4AIAAxADkAOQA1AC4AAAA1aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL2luZm8AAAArAFcAbwBsAGYALAAgAEIALgA7ACAASwBhAHUAZgBlAHIALAAgAEEALgA7ACAATQBhAG4AZABlAGwALAAgAEgALgA7ACAAUwB0AGEAaABsACwAIABPAC4AAAAAAAAAB2JpYmNvZGV/wAAAAAAAB29wdGljYWwAAAIMaHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9maHNzYT86OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS93ZWIvZm9ybTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NzYS9hdmFpbGFiaWxpdHk6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS9zc2EvY2FwYWJpbGl0aWVzOjo6cHkgVk8gc2VwOjo6aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL3RhYmxlTWV0YWRhdGE6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbGdldDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbG1ldGEAAAFEaXZvOi8vaXZvYS5uZXQvc3RkL3NzYTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2F2YWlsYWJpbGl0eTo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2NhcGFiaWxpdGllczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI3RhYmxlczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3NvZGEjc3luYy0xLjA6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvZGF0YWxpbmsjbGlua3MtMS4wAAAAynZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAAB+c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3Rk
\ No newline at end of file diff --git a/pyvo/registry/tests/data/regtap.xml b/pyvo/registry/tests/data/regtap.xml index 8cb9b41ff..f7cf522c9 100644 --- a/pyvo/registry/tests/data/regtap.xml +++ b/pyvo/registry/tests/data/regtap.xml @@ -1,1600 +1,60 @@ - - - - - - - - The parent resource. - - - - - The index of the parent capability. - - - - - - An arbitrary identifier for the interfaces of a resource. - - - - - - The type of the interface (vr:webbrowser, vs:paramhttp, etc). - - - - - An identifier for the role the interface plays in the particular - capability. If the value is equal to "std" or begins with "std:", - then the interface refers to a standard interface defined by the - standard referred to by the capability's standardID attribute. - - - - - The version of a standard interface specification that this - interface complies with. When the interface is provided in the - context of a Capability element, then the standard being refered - to is the one identified by the Capability's standardID element. - - - - - Hash-joined list of expected HTTP method (get or post) supported - by the service. - - - - - The MIME type of a document returned in the HTTP response. - - - - - The location of the WSDL that describes this Web Service. If - NULL, the location can be assumed to be the accessURL with - '?wsdl' appended. - - - - - A flag indicating whether this should be interpreted as a base - URL ('base'), a full URL ('full'), or a URL to a directory that - will produce a listing of files ('dir'). - - - - - The URL at which the interface is found. - - - - - Secondary access URLs of this interface, separated by hash - characters. - - - - - An identifier of an authentication method required on this - interface, or NULL for interfaces publicly available. The - identifiers of authentication schemes recommended in the VO are - declared in the IVOA recommendation “SSO: Authentication - Mechanisms.“ - - - - - The parent resource. - - - - - An arbitrary identifier of this capability within the resource. - - - - - - The type of capability covered here. If looking for endpoints - implementing a certain standard, you should not use this column - but rather match against standard_id. - - - - - A human-readable description of what this capability provides as - part of the over-all service. - - - - - A URI for a standard this capability conforms to. - - - - - Unambiguous reference to the resource conforming to the IVOA - standard for identifiers. - - - - - Resource type (something like vs:datacollection, - vs:catalogservice, etc). - - - - - The UTC date and time this resource metadata description was - created. - - - - - A short name or abbreviation given to something, for presentation - in space-constrained fields (up to 16 characters). - - - - - The full name given to the resource. - - - - - The UTC date this resource metadata description was last updated. - - - - - A hash-separated list of content levels specifying the intended - audience. - - - - - An account of the nature of the resource. - - - - - URL pointing to a human-readable document describing this - resource. - - - - - The creator(s) of the resource in the order given by the resource - record author, separated by semicolons. - - - - - A hash-separated list of natures or genres of the content of the - resource. - - - - - The format of source_value. This, in particular, can be - ``bibcode''. - - - - - A bibliographic reference from which the present resource is - derived or extracted. - - - - - Label associated with creation or availablilty of a version of a - resource. - - - - - A single numeric value representing the angle, given in decimal - degrees, by which a positional query against this resource should - be ``blurred'' in order to get an appropriate match. - - - - - A hash-separated list of regions of the electro-magnetic spectrum - that the resource's spectral coverage overlaps with. - - - - - A statement of usage conditions (license, attribution, embargo, - etc). - - - - - A URI identifying a license the data is made available under. - - - - - IVOID of the registry this record came from. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ivo://cds.vizier/b/cb44vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/cbdata? - - ivo://cds.vizier/b/cb4cs:conesearchCone search capability for table B/cb/cbdata (Catalogue of Cataclysmic Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/b/cbvs:catalogservice2017-05-23T11:05:12B/cbCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20)http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cbRitter H., Kolb U.catalogbibcode2003A&A...404..301R29-Sep-2011 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/b/cb55vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/lmxbdata? - - ivo://cds.vizier/b/cb5cs:conesearchCone search capability for table B/cb/lmxbdata (Catalogue of Low-Mass X-Ray Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/b/cbvs:catalogservice2017-05-23T11:05:12B/cbCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20)http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cbRitter H., Kolb U.catalogbibcode2003A&A...404..301R29-Sep-2011 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/b/cb66vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/pcbdata? - - ivo://cds.vizier/b/cb6cs:conesearchCone search capability for table B/cb/pcbdata (Catalogue of Related Objects)ivo://ivoa.net/std/conesearchivo://cds.vizier/b/cbvs:catalogservice2017-05-23T11:05:12B/cbCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20)http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cbRitter H., Kolb U.catalogbibcode2003A&A...404..301R29-Sep-2011 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/506/72944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/506/729/table2? - - ivo://cds.vizier/j/a+a/506/7294cs:conesearchCone search capability for table J/A+A/506/729/table2 (Properties of the targeted member stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/506/729vs:catalogservice2009-12-30T09:41:09J/A+A/506/729Abundances in globular cluster Pal 3 (Koch+, 2009)2018-04-05T10:00:00researchChemical abundances of 25 alpha-, iron peak-, and neutron-capture elements in the remote (R=90kpc) outer halo globular cluster have been determined for 4 red giants observed with the Magellan/MIKE spectrograph and from integrated spectra of 19 stars obtained with the Keck/HIRES instrument. The resulting abundance ratios show that Pal 3 is very similar to globular clusters of the inner halo and very dissimilar from dwarf spheroidal galaxy stars. Its neutron capture element ratios are compatible with a pure r-process enrichment.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/506/729Koch A., Cote P., McWilliam A.catalogbibcode2009A&A...506..729K10-Sep-2009 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/530/a2844vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/530/A28/targets? - - ivo://cds.vizier/j/a+a/530/a284cs:conesearchCone search capability for table J/A+A/530/A28/targets (Priority targets for follow-up)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/530/a28vs:catalogservice2017-06-22T14:29:01J/A+A/530/A28Priority targets for the MUCHFUSS project (Geier+, 2011)2018-04-05T10:00:00researchThe project Massive Unseen Companions to Hot Faint Underluminous Stars from SDSS (MUCHFUSS) aims at finding sdBs with compact companions like supermassive white dwarfs (M>1.0M_{sun}_), neutron stars or black holes. The existence of such systems is predicted by binary evolution theory and recent discoveries indicate that they are likely to exist in our Galaxy. A determination of the orbital parameters is sufficient to put a lower limit on the companion mass by calculating the binary mass function. If this lower limit exceeds the Chandrasekhar mass and no sign of a companion is visible in the spectra, the existence of a massive compact companion is proven without the need for any additional assumptions. We identified about 1100 hot subdwarf stars from the SDSS by colour selection and visual inspection of their spectra. Stars with high velocities have been reobserved and individual SDSS spectra have been analysed. In total 127 radial velocity variable subdwarfs have been discovered. Binaries with high RV shifts and binaries with moderate shifts within short timespans have the highest probability of hosting massive compact companions. Atmospheric parameters of 69 hot subdwarfs in these binary systems have been determined by means of a quantitative spectral analysis. The atmospheric parameter distribution of the selected sample does not differ from previously studied samples of hot subdwarfs. The systems are considered the best candidates to search for massive compact companions by follow-up time resolved spectroscopy.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/530/A28Geier S., Hirsch H., Tillich A., Maxted P.F.L., Bentley S.J., Ostensen R.H., Heber U., Gaensicke B.T., Marsh T.R., Napiwotzki R., Barlow B.N., O'Toole S.J.catalogbibcode2011A&A...530A..28G30-Aug-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/530/a2855vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/530/A28/tablea1? - - ivo://cds.vizier/j/a+a/530/a285cs:conesearchCone search capability for table J/A+A/530/A28/tablea1 (Orbital parameters of all known hot subdwarf binaries from literature)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/530/a28vs:catalogservice2017-06-22T14:29:01J/A+A/530/A28Priority targets for the MUCHFUSS project (Geier+, 2011)2018-04-05T10:00:00researchThe project Massive Unseen Companions to Hot Faint Underluminous Stars from SDSS (MUCHFUSS) aims at finding sdBs with compact companions like supermassive white dwarfs (M>1.0M_{sun}_), neutron stars or black holes. The existence of such systems is predicted by binary evolution theory and recent discoveries indicate that they are likely to exist in our Galaxy. A determination of the orbital parameters is sufficient to put a lower limit on the companion mass by calculating the binary mass function. If this lower limit exceeds the Chandrasekhar mass and no sign of a companion is visible in the spectra, the existence of a massive compact companion is proven without the need for any additional assumptions. We identified about 1100 hot subdwarf stars from the SDSS by colour selection and visual inspection of their spectra. Stars with high velocities have been reobserved and individual SDSS spectra have been analysed. In total 127 radial velocity variable subdwarfs have been discovered. Binaries with high RV shifts and binaries with moderate shifts within short timespans have the highest probability of hosting massive compact companions. Atmospheric parameters of 69 hot subdwarfs in these binary systems have been determined by means of a quantitative spectral analysis. The atmospheric parameter distribution of the selected sample does not differ from previously studied samples of hot subdwarfs. The systems are considered the best candidates to search for massive compact companions by follow-up time resolved spectroscopy.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/530/A28Geier S., Hirsch H., Tillich A., Maxted P.F.L., Bentley S.J., Ostensen R.H., Heber U., Gaensicke B.T., Marsh T.R., Napiwotzki R., Barlow B.N., O'Toole S.J.catalogbibcode2011A&A...530A..28G30-Aug-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/537/a8344vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/537/A83/stars? - - ivo://cds.vizier/j/a+a/537/a834cs:conesearchCone search capability for table J/A+A/537/A83/stars (Properties and stellar parameters of target stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/537/a83vs:catalogservice2017-12-18T08:57:20J/A+A/537/A83Abunbances of 9 red giants of Pal 14 (Caliskan+, 2012)2018-04-05T10:00:00researchChemical abundances of 25 elements, which include {alpha}-, iron peak-, and neutron-capture elements, in the outer halo globular cluster Palomar 14 have been determined for the nine red giants observed with the FLAMES/UVES spectrograph. The abundance pattern of Pal 14 is similar to the inner halo GCs, halo field stars, and GCs of recognized extragalactic origin, but differs from what is customarily found in dSphs field stars. The abundance properties of Pal 14 as well as those of the other outer halo GCs are thus compatible with an accretion origin from dSphs. The neutron-capture elements show an r-process signature.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/537/A83Caliskan S., Christlieb N., Grebel E.K.catalogbibcode2012A&A...537A..83C21-Nov-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/34944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/table2? - - ivo://cds.vizier/j/an/331/3494cs:conesearchCone search capability for table J/AN/331/349/table2 (All values obtained from the catalogues cited in the paper)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/an/331/349vs:catalogservice2017-12-05T06:09:54J/AN/331/349O, B-type & red supergiant masses and luminosities (Hohle+, 2010)2018-04-05T10:00:00researchMassive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349Hohle M.M., Neuhauser R., Schutz B.F.catalogbibcode2010AN....331..349H03-May-2010 - infraredpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/34955vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/single? - - ivo://cds.vizier/j/an/331/3495cs:conesearchCone search capability for table J/AN/331/349/single (Input data and derived mass and luminosity for single stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/an/331/349vs:catalogservice2017-12-05T06:09:54J/AN/331/349O, B-type & red supergiant masses and luminosities (Hohle+, 2010)2018-04-05T10:00:00researchMassive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349Hohle M.M., Neuhauser R., Schutz B.F.catalogbibcode2010AN....331..349H03-May-2010 - infraredpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/34966vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/mult1? - - ivo://cds.vizier/j/an/331/3496cs:conesearchCone search capability for table J/AN/331/349/mult1 (Input data and derived mass and luminosity for primaries of Pourbaix multiple stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/an/331/349vs:catalogservice2017-12-05T06:09:54J/AN/331/349O, B-type & red supergiant masses and luminosities (Hohle+, 2010)2018-04-05T10:00:00researchMassive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349Hohle M.M., Neuhauser R., Schutz B.F.catalogbibcode2010AN....331..349H03-May-2010 - infraredpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/578/40544vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/578/405/table1? - - ivo://cds.vizier/j/apj/578/4054cs:conesearchCone search capability for table J/ApJ/578/405/table1 (Chandra X-Ray Sources in the Field of NGC 5139)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/578/405vs:catalogservice2003-03-29T10:46:43J/ApJ/578/405Neutron stars in NGC 5139 (Rutledge+, 2002)2018-04-05T10:00:00researchThe Chandra/ACIS-I detectors observed NGC 5139 in imaging mode for two continuous periods (2000 January 24 02:15-09:46 and January 25 04:33-17:24 TT) for a total exposure of ~68.6ks. We combined the two observations and analyzed them as one. We searched for point sources using CELLDETECT, using only the 0.1-2.5keV energy range, excluding regions less than 16 pixels from the detector edges and keeping only sources with signal-to-noise ratio (S/N)>5.0. We find 40 X-ray point sources over the four ACIS-I chips and chip S2 of ACIS-S, which are numbered in order of decreasing S/N in Table 1.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/578/405Rutledge R.E., Bildsten L., Brown E.F., Pavlov G.G., Zavlin V.E.catalogbibcode2002ApJ...578..405R09-Dec-2002 - x-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/714/142444vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/714/1424/table1? - - ivo://cds.vizier/j/apj/714/14244cs:conesearchCone search capability for table J/ApJ/714/1424/table1 (Candidates RASS/BSC sources and identifications)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/714/1424vs:catalogservice2017-11-06T13:23:26J/ApJ/714/1424Isolated neutron stars from Rosat and Swift (Turner+, 2010)2018-04-05T10:00:00researchFollowing selection of the isolated neutron star (INS) candidates, short (~1ks) follow-up observations with Swift/XRT were obtained on 92 of the candidates; these observations decrease the X-ray positional uncertainty (the systematic positional error associated with Swift blind pointing observations is on the order of 3.5"), and obtain (where possible) contemporaneous UV observations with Swift/UVOT for counterpart identification with off-band objects.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/714/1424Turner M.L., Rutledge R.E., Letcavage R., Shevchuk A.S.H., Fox D.B.catalogbibcode2010ApJ...714.1424T23-Apr-2012 - x-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/714/142455vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/714/1424/table2? - - ivo://cds.vizier/j/apj/714/14245cs:conesearchCone search capability for table J/ApJ/714/1424/table2 (Objects observed and detected with Swift/XRT)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/714/1424vs:catalogservice2017-11-06T13:23:26J/ApJ/714/1424Isolated neutron stars from Rosat and Swift (Turner+, 2010)2018-04-05T10:00:00researchFollowing selection of the isolated neutron star (INS) candidates, short (~1ks) follow-up observations with Swift/XRT were obtained on 92 of the candidates; these observations decrease the X-ray positional uncertainty (the systematic positional error associated with Swift blind pointing observations is on the order of 3.5"), and obtain (where possible) contemporaneous UV observations with Swift/UVOT for counterpart identification with off-band objects.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/714/1424Turner M.L., Rutledge R.E., Letcavage R., Shevchuk A.S.H., Fox D.B.catalogbibcode2010ApJ...714.1424T23-Apr-2012 - x-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/797/2144vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/797/21/table3? - - ivo://cds.vizier/j/apj/797/214cs:conesearchCone search capability for table J/ApJ/797/21/table3 (Data for literature stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/797/21vs:catalogservice2017-08-29T07:03:13J/ApJ/797/21Carbon-enhanced metal-poor stars (Placco+, 2014)2018-04-05T10:00:00researchWe revisit the observed frequencies of carbon-enhanced metal-poor (CEMP) stars as a function of the metallicity in the Galaxy, using data from the literature with available high-resolution spectroscopy. Our analysis excludes stars exhibiting clear overabundances of neutron-capture elements and takes into account the expected depletion of surface carbon abundance that occurs due to CN processing on the upper red giant branch. This allows for the recovery of the initial carbon abundance of these stars, and thus for an accurate assessment of the frequencies of carbon-enhanced stars. The correction procedure we develop is based on stellar-evolution models and depends on the surface gravity, log g, of a given star.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/797/21Placco V.M., Frebel A., Beers T.C., Stancliffe R.J.catalogbibcode2014ApJ...797...21P26-Jan-2017 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/804/11444vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/804/114/sample? - - ivo://cds.vizier/j/apj/804/1144cs:conesearchCone search capability for table J/ApJ/804/114/sample (Simulated binary neutron-star (BNS) signals of detected events for 2015 scenario using recolored noise (table C1), detections and sky-localization areas (table C2) and accuracy estimations (table C3))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/804/114vs:catalogservice2017-06-22T14:28:22J/ApJ/804/114Parameter-estimation performance with LIGO (Berry+, 2015)2018-04-05T10:00:00researchAdvanced ground-based gravitational-wave (GW) detectors begin operation imminently. Their intended goal is not only to make the first direct detection of GWs, but also to make inferences about the source systems. Binary neutron-star mergers are among the most promising sources. We investigate the performance of the parameter-estimation (PE) pipeline that will be used during the first observing run of the Advanced Laser Interferometer Gravitational-wave Observatory (aLIGO) in 2015: we concentrate on the ability to reconstruct the source location on the sky, but also consider the ability to measure masses and the distance. Accurate, rapid sky localization is necessary to alert electromagnetic (EM) observatories so that they can perform follow-up searches for counterpart transient events. We consider PE accuracy in the presence of non-stationary, non-Gaussian noise. We find that the character of the noise makes negligible difference to the PE performance at a given signal-to-noise ratio. The source luminosity distance can only be poorly constrained, since the median 90% (50%) credible interval scaled with respect to the true distance is 0.85 (0.38). However, the chirp mass is well measured. Our chirp-mass estimates are subject to systematic error because we used gravitational-waveform templates without component spin to carry out inference on signals with moderate spins, but the total error is typically less than 10^-3^M_{sun}_. The median 90% (50%) credible region for sky localization is ~600deg^2^ (~150deg^2^), with 3% (30%) of detected events localized within 100deg^2^. Early aLIGO, with only two detectors, will have a sky-localization accuracy for binary neutron stars of hundreds of square degrees; this makes EM follow-up challenging, but not impossible.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/804/114Berry C.P.L., Mandel I., Middleton H., Singer L.P., Urban A.L., Vecchio A., Vitale S., Cannon K., Farr B., Farr W.M., Graff P.B., Hanna C., Haster C.-J., Mohapatra S., Pankow C., Price L.R., Sidery T., Veitch J.catalogbibcode2015ApJ...804..114B26-Aug-2015 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/829/2044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/829/20/table1? - - ivo://cds.vizier/j/apj/829/204cs:conesearchCone search capability for table J/ApJ/829/20/table1 (X-Ray point source populations in 343 nearby galaxies)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/829/20vs:catalogservice2018-05-16T07:05:17J/ApJ/829/20Chandra ACIS survey in nearby galaxies. II (Wang+, 2016)2018-05-16T07:05:17researchBased on the recently completed Chandra/ACIS survey of X-ray point sources in nearby galaxies, we study the X-ray luminosity functions (XLFs) for X-ray point sources in different types of galaxies and the statistical properties of ultraluminous X-ray sources (ULXs). Uniform procedures are developed to compute the detection threshold, to estimate the foreground/background contamination, and to calculate the XLFs for individual galaxies and groups of galaxies, resulting in an XLF library of 343 galaxies of different types. With the large number of surveyed galaxies, we have studied the XLFs and ULX properties across different host galaxy types, and confirm with good statistics that the XLF slope flattens from lenticular ({alpha}{\sim}1.50{\pm}0.07) to elliptical ({\sim}1.21{\pm}0.02), to spirals ({\sim}0.80{\pm}0.02), to peculiars ({\sim}0.55{\pm}0.30), and to irregulars ({\sim}0.26{\pm}0.10). The XLF break dividing the neutron star and black hole binaries is also confirmed, albeit at quite different break luminosities for different types of galaxies. A radial dependency is found for ellipticals, with a flatter XLF slope for sources located between D_25_ and 2D_25_, suggesting the XLF slopes in the outer region of early-type galaxies are dominated by low-mass X-ray binaries in globular clusters. This study shows that the ULX rate in early-type galaxies is 0.24{\pm}0.05 ULXs per surveyed galaxy, on a 5{sigma} confidence level. The XLF for ULXs in late-type galaxies extends smoothly until it drops abruptly around 4x10^40^erg/s, and this break may suggest a mild boundary between the stellar black hole population possibly including 30M{\sun} black holes with super-Eddington radiation and intermediate mass black holes.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/829/20Wang S., Qiu Y., Liu J., Bregman J.N.catalogbibcode2016ApJ...829...20W06-Mar-2018 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apjs/179/36044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJS/179/360/sources? - - ivo://cds.vizier/j/apjs/179/3604cs:conesearchCone search capability for table J/ApJS/179/360/sources (Sources list)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apjs/179/360vs:catalogservice2018-01-31T07:09:53J/ApJS/179/360Thermonuclear X-ray bursts observed by RXTE (Galloway+, 2008)2018-04-05T10:00:00researchWe present a sample of 1187 thermonuclear (type-I) X-ray bursts from public (archival) observations of 48 low-mass X-ray binaries accreting neutron stars by the Rossi X-ray Timing Explorer, spanning 1996 January - 2007 June 3. For each burst, we list results of analysis of data from the Proportional Counter Array, including observed count rates, time-resolved spectroscopy, evolution of the burst lightcurve, and details of the persistent flux and source spectral state at the time of the burst.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJS/179/360Galloway D.K., Muno M.P., Hartman J.M., Psaltis D., Chakrabarty D.catalogbibcode2008ApJS..179..360G23-Sep-2008 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/81/20944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/81/209/table1? - - ivo://cds.vizier/j/azh/81/2094cs:conesearchCone search capability for table J/AZh/81/209/table1 (Stellar parameters of the selected sample and the final [Nd/Fe] ratios)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/81/209vs:catalogservice2017-12-22T06:32:10J/AZh/81/209Neutron capture elements in stars: neodymium (Mashonkina+, 2004)2018-04-05T10:00:00researchWe determined the neodymium abundances for 60 of the 78 stars studied by Mashonkina et al. (2003A&A...397..275M). We obtained spectroscopic observations of seven stars in April 2001 with the UVES echelle spectrometer mounted on the 8-m VLT2 telescope of the European Southern Observatoryin Chile. These observations cover 3800-4500{AA} and 4750-6650{AA}. Spectroscopic observations of 53 stars at 4100-6700{AA} were obtained in 1995-2001 with the FOCES echelle spectrometer mounted on the 2.2-m telescope of the German-Spanish Astronomical Center in Calar Alto, Spain.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/81/209Mashonkina L.I., Kamaeva L.A., Samotoev V.A., Sakhibullin N.A.catalogbibcode2004AZh....81..209M10-Dec-2004 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/83/54244vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/83/542/pulsars? - - ivo://cds.vizier/j/azh/83/5424cs:conesearchCone search capability for table J/AZh/83/542/pulsars (Luminosities of short- and long-period pulsars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/83/542vs:catalogservice2018-01-05T09:56:22J/AZh/83/542Integrated Radio Luminosities of Pulsars (Malov+, 2006)2018-04-05T10:00:00researchThe integrated radio luminosities of 311 long-period (P>0.1s) and 27 short-period (P<0.1s) pulsars have been calculated using a new compilation of radio spectra. The luminosities are in the range 10^27^-10^30^erg/s for 88% of the long-period pulsars and 10^28^-10^31^erg/s for 88% of the short-period pulsars. We find a high correlation between the luminosity L and the estimate L1=S_(400)_*d^2^ from the catalog of Taylor et al. (1993, See Cat. <VII/189>. The factor 'eta' for transformation of the rotational energy of the neutron star into radio emission increases/decreases with increasing period for long-period/short-period pulsars. The mean value of 'eta'=-3.73 for the long-period and -4.85 for the short-period pulsars.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/83/542Malov I.F., Malov O.I.catalogbibcode2006AZh...83...542M01-Jul-2007 - radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/88/2244vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/88/22/pulsars? - - ivo://cds.vizier/j/azh/88/224cs:conesearchCone search capability for table J/AZh/88/22/pulsars (Pulsars studied: initial parameters and calculated {beta} angles)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/88/22vs:catalogservice2017-07-05T07:00:11J/AZh/88/22Angles rotation/magnetic moment in pulsars (Malov+, 2011)2018-04-05T10:00:00researchData on the pulse structure and variations of the linear polarization angle at frequencies near 1GHz have been used to estimate the angles {beta} between the rotational axis and magnetic moment of the neutron stars associated with 80 pulsars.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/88/22Malov I.F., Nikitina E.B.catalogbibcode2011AZh....88...22M27-Jan-2011 - radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/88/95444vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/88/954/table1? - - ivo://cds.vizier/j/azh/88/9544cs:conesearchCone search capability for table J/AZh/88/954/table1 (*Calculated values of {beta}1 for 10cm and 20cm)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/88/954vs:catalogservice2017-10-18T08:24:25J/AZh/88/954Geometry of radio pulsar magnetospheres (Malov+, 2011)2018-04-05T10:00:00researchData on the profiles and polarization of the 10- and 20-cm emission of radio pulsars are used to calculate the angle {beta} between the rotational axis of the neutron star and its magnetic moment. It is shown that, for these calculations, it is sufficient to use catalog values of the pulse width at the 10% level W10, since the broadening of the observed pulses due to the transition to the full width W0 and narrowing of the pulses associated with the emission of radiation along tangents to the field lines approximately cancel each other out. The angles {beta}1 are calculated for 283 pulsars at 20cm and 132 pulsars at 10cm, assuming that the line of sight passes through the center of the emission cone.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/88/954Malov I.F., Nikitina E.B.catalogbibcode2011AZh....88..954M14-Nov-2011 - optical#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/287/29344vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/287/293/table1? - - ivo://cds.vizier/j/mnras/287/2934cs:conesearchCone search capability for table J/MNRAS/287/293/table1 (Unidentified EUV sources)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/287/293vs:catalogservice1998-02-08T13:48:38J/MNRAS/287/293BR photometry of EUVE sources (Maoz+ 1997)2018-04-05T10:00:00researchMost of the sources detected in the extreme ultraviolet (EUV; 100-600{AA}) by the ROSAT/WFC and EUVE all-sky surveys have been identified with active late-type stars and hot white dwarfs that are near enough to the Earth to escape absorption by interstellar gas. However, about 15 per cent of EUV sources are as yet unidentified with any optical counterparts. We examine whether the unidentified EUV sources may consist of the same population of late-type stars and white dwarfs. We present B and R photometry of stars in the fields of seven of the unidentified EUV sources. We detect in the optical the entire main-sequence and white dwarf population out to the greatest distances where they could still avoid absorption. We use colour-magnitude diagrams to demonstrate that, in most of the fields, none of the observed stars has the colours and magnitudes of late-type dwarfs at distances less than 100pc. Similarly, none of the observed stars is a white dwarf within 500pc that is hot enough to be a EUV emitter. The unidentified EUV sources we study are not detected in X-rays, while cataclysmic variables, X-ray binaries, and active galactic nuclei generally are. We conclude that some of the EUV sources may be a new class of nearby objects, which are either very faint at optical bands or which mimic the colours and magnitudes of distant late-type stars or cool white dwarfs. One candidate for optically faint objects is isolated old neutron stars, slowly accreting interstellar matter. Such neutron stars are expected to be abundant in the Galaxy, and have not been unambiguously detected.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/287/293Maoz D., Ofek E.O., Shemi A.catalogbibcode1997MNRAS.287..293M24-Oct-1997 - x-ray#uvpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/342/129944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/342/1299/table1? - - ivo://cds.vizier/j/mnras/342/12994cs:conesearchCone search capability for table J/MNRAS/342/1299/table1 (*Positions, flux densities and widths for 200 pulsars discovered in the Parkes Multibeam Pulsar Survey (PMPS))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/342/1299vs:catalogservice2017-06-14T07:31:14J/MNRAS/342/1299Parkes Multi-Beam Pulsar Survey. III. (Kramer+, 2003)2018-04-05T10:00:00researchThe Parkes Multibeam Pulsar Survey has unlocked vast areas of the Galactic plane, which were previously invisible to earlier low-frequency and less-sensitive surveys. The survey has discovered more than 600 new pulsars so far, including many that are young and exotic. In this paper we report the discovery of 200 pulsars for which we present positional and spin-down parameters, dispersion measures, flux densities and pulse profiles. A large number of these new pulsars are young and energetic, and we review possible associations of {gamma}-ray sources with the sample of about 1300 pulsars for which timing solutions are known. Based on a statistical analysis, we estimate that about 19+/-6 associations are genuine. The survey has also discovered 12 pulsars with spin properties similar to those of the Vela pulsar, nearly doubling the known population of such neutron stars. Studying the properties of all known 'Vela-like' pulsars, we find their radio luminosities to be similar to normal pulsars, implying that they are very inefficient radio sources. Finally, we review the use of the newly discovered pulsars as Galactic probes and discuss the implications of the new NE2001 Galactic electron density model for the determination of pulsar distances and luminosities.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/342/1299Kramer M., Bell J.F., Manchester R.N., Lyne A.G., Camilo F., Stairs I.H., D'Amico N., Kaspi V.M., Hobbs G., Morris D.J., Crawford F., Possenti A., Joshi B.C., McLaughlin M.A., Lorimer D.R., Faulkner A.J.catalogbibcode2003MNRAS.342.1299K12-Sep-2003 - gamma-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/402/236944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/402/2369/assoc? - - ivo://cds.vizier/j/mnras/402/23694cs:conesearchCone search capability for table J/MNRAS/402/2369/assoc (Positional and kinematical data for OB associations and clusters (table A1 in the paper))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/402/2369vs:catalogservice2015-02-06T11:52:18J/MNRAS/402/2369Kinematics of young associations/clusters (Tetzlaff+, 2010)2018-04-05T10:00:00researchGiven a distance of 1kpc and typical neutron star velocities of 100-500km/s (Arzoumanian et al. 2002ApJ...568..289A; Hobbs et al., 2005, Cat. J/MNRAS/360/974) and maximum ages of 5Myr for neutron stars to be detectable in the optical (see cooling curves in Gusakov et al. 2005MNRAS.363..555G and Popov, Grigorian & Blaschke 2006, Phys. Rev. C, 74, 025803), we restricted our search for birth associations and clusters of young nearby neutron stars to within 3kpc. We chose a sample of OB associations and young clusters (we use the term `association' for both in the following) within 3kpc from the Sun with available kinematic data and distance. We collected those from Dambis, Mel'nik & Rastorguev (2001AstL...27...58D) and Hoogerwerf (2001A&A...365...49H) and associations to which stars from the Galactic O-star catalogue from Maiz-Apellaniz et al. (2004, Cat. J/ApJS/151/103) are associated with. Furthermore, we added young local associations (YLA) from Fernandez, Figueras & Torra (2008A&A...480..735F) since they are possible hosts of a few SNe in the near past. We also included the Hercules-Lyrae association (Her-Lyr) and the Pleiades and massive star-forming regions (Reipurth 2008, ASP Monograph Publ. Vol. 4 and Vol. 5). We set the lower limit of the association age to 2Myr to account for the minimum lifetime of a progenitor star that can produce a neutron star (progenitor mass smaller than 30M_{sun}_ see e.g. Heger et al. 2003ApJ...591..288H). The list of all explored associations and their properties can be found in Appendix A. Coordinates as well as heliocentric velocity components are given for a right-handed coordinate system with the x-axis pointing towards the galactic centre and y is positive in the direction of galactic rotation.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/402/2369Tetzlaff N., Neuhaeuser R., Hohle M.M., Maciejewski G.catalogbibcode2010MNRAS.402.2369T09-Mar-2010 - radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/419/209544vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/419/2095/hmxb? - - ivo://cds.vizier/j/mnras/419/20954cs:conesearchCone search capability for table J/MNRAS/419/2095/hmxb (High-mass X-ray binaries Catalogue)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/419/2095vs:catalogservice2017-11-28T14:21:30J/MNRAS/419/2095HMXBs in nearby galaxies (Mineo+, 2012)2018-04-05T10:00:00researchBased on a homogeneous set of X-ray, infrared and ultraviolet observations from Chandra, Spitzer, GALEX and 2MASS archives, we study populations of high-mass X-ray binaries (HMXBs) in a sample of 29 nearby star-forming galaxies and their relation with the star formation rate (SFR). In agreement with previous results, we find that HMXBs are a good tracer of the recent star formation activity in the host galaxy and their collective luminosity and number scale with the SFR, in particular, LX~~2.6x10^39^SFR. However, the scaling relations still bear a rather large dispersion of rms~0.4dex, which we believe is of a physical origin. We present the catalog of 1057 X-ray sources detected within the D25 ellipse for galaxies of our sample and construct the average X-ray luminosity function (XLF) of HMXBs with substantially improved statistical accuracy and better control of systematic effects than achieved in previous studies. The XLF follows a power law with slope of 1.6 in the log(LX)~35-40 luminosity range with a moderately significant evidence for a break or cut-off at LX~10^40^erg/s. As before, we did not find any features at the Eddington limit for a neutron star or a stellar mass black hole. We discuss implications of our results for the theory of binary evolution. In particular we estimate the fraction of compact objects that once upon their lifetime experienced an X-ray active phase powered by accretion from a high mass companion and obtain a rather large number, fX~0.2x(0.1Myr/{tau}x) ({tau}x is the life time of the X-ray active phase). This is about 4 orders of magnitude more frequent than in LMXBs. We also derive constrains on the mass distribution of the secondary star in HMXBs.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/419/2095Mineo S., Gilfanov M., Sunyaev R.catalogbibcode2012MNRAS.419.2095M26-Sep-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/other/sci/292.229044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/other/Sci/292.2290/table1? - - ivo://cds.vizier/j/other/sci/292.22904cs:conesearchCone search capability for table J/other/Sci/292.2290/table1 (47 Tuc X-Ray Source Parameters (MS 61135))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/other/sci/292.2290vs:catalogservice2003-11-11T20:38:15J/other/Sci/292.Chandra compact binaries in 47 Tuc (Grindlay+, 2001)2018-04-05T10:00:00researchWe have obtained high-resolution (<~1") deep X-ray images of the globular cluster 47 Tucanae (NGC 104) with the Chandra X-ray Observatory to study the population of compact binaries in the high stellar density core. A 70-kilosecond exposure of the cluster reveals a centrally concentrated population of faint (L_X_~10^30-33^ergs/s) X-ray sources, with at least 108 located within the central 2'x2.5' and >~half with L_X_<~10^30.5^ergs/s. All 15 millisecond pulsars (MSPs) recently located precisely by radio observations are identified, though 2 are unresolved by Chandra. The X-ray spectral and temporal characteristics, as well as initial optical identifications with the Hubble Space Telescope, suggest that >~50 percent are MSPs, about 30 percent are accreting white dwarfs, about 15 percent are main-sequence binaries in flare outbursts, and only two to three are quiescent low-mass X-ray binaries containing neutron stars, the conventional progenitors of MSPs. An upper limit of about 470 times the mass of the sun is derived for the mass of an accreting central black hole in the cluster. These observations provide the first X-ray ``color-magnitude'' diagram for a globular cluster and census of its compact object and binary population. Observations were made on UT 16.31 - 17.22 March, 2000.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/other/Sci/292.2290Grindlay J.E., Heinke C., Edmonds P.D., Murray S.S.catalogbibcode2001Sci...292.2290G31-Jan-2002 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/113d44vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/cbdata? - - ivo://cds.vizier/v/113d4cs:conesearchCone search capability for table V/113D/cbdata (Catalogue of Cataclysmic Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/113dvs:catalogservice2018-01-05T09:56:04V/113DCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113DRitter H., Kolb U.catalogbibcode2003A&A...404..301R24-Mar-2005 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/113d55vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/lmxbdata? - - ivo://cds.vizier/v/113d5cs:conesearchCone search capability for table V/113D/lmxbdata (Catalogue of Low-Mass X-Ray Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/113dvs:catalogservice2018-01-05T09:56:04V/113DCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113DRitter H., Kolb U.catalogbibcode2003A&A...404..301R24-Mar-2005 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/113d66vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/pcbdata? - - ivo://cds.vizier/v/113d6cs:conesearchCone search capability for table V/113D/pcbdata (Catalogue of Related Objects)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/113dvs:catalogservice2018-01-05T09:56:04V/113DCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113DRitter H., Kolb U.catalogbibcode2003A&A...404..301R24-Mar-2005 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/90/table1? - - ivo://cds.vizier/v/904cs:conesearchCone search capability for table V/90/table1 (Low mass X-ray binaries (LMXB))ivo://ivoa.net/std/conesearchivo://cds.vizier/v/90vs:catalogservice2013-03-06T07:14:45V/90Catalogue of X-Ray Binaries (van Paradijs 1995)2018-04-05T10:00:00researchThe objects described in this catalog are X-Ray binaries, i.e., semi-detached binary stars in which matter is transferred from a usually more or less normal star to a neutron star or black hole. Thus, cataclysmic variables are not included. The tables provide basic information of the systems as well as selected references. The tables contain 124 low-mass and 69 high mass X-ray binaries.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/90van Paradijs J.catalogbibcode - 09-Jan-1997 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9055vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/90/table2? - - ivo://cds.vizier/v/905cs:conesearchCone search capability for table V/90/table2 (High mass X-ray binaries (HMXB))ivo://ivoa.net/std/conesearchivo://cds.vizier/v/90vs:catalogservice2013-03-06T07:14:45V/90Catalogue of X-Ray Binaries (van Paradijs 1995)2018-04-05T10:00:00researchThe objects described in this catalog are X-Ray binaries, i.e., semi-detached binary stars in which matter is transferred from a usually more or less normal star to a neutron star or black hole. Thus, cataclysmic variables are not included. The tables provide basic information of the systems as well as selected references. The tables contain 124 low-mass and 69 high mass X-ray binaries.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/90van Paradijs J.catalogbibcode - 09-Jan-1997 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/cbdata? - - ivo://cds.vizier/v/994cs:conesearchCone search capability for table V/99/cbdata (Catalogue of Cataclysmic Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/99vs:catalogservice2003-06-08T16:50:32V/99Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99Ritter H., Kolb U.catalogbibcode1998A&AS..129...83R16-Dec-1997 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9955vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/lmxbdata? - - ivo://cds.vizier/v/995cs:conesearchCone search capability for table V/99/lmxbdata (Catalogue of Low-Mass X-Ray Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/99vs:catalogservice2003-06-08T16:50:32V/99Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99Ritter H., Kolb U.catalogbibcode1998A&AS..129...83R16-Dec-1997 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9966vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/pcbdata? - - ivo://cds.vizier/v/996cs:conesearchCone search capability for table V/99/pcbdata (Catalogue of Related Objects)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/99vs:catalogservice2003-06-08T16:50:32V/99Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99Ritter H., Kolb U.catalogbibcode1998A&AS..129...83R16-Dec-1997 - opticalpublic - ivo://cds.vizier/registry
ivo://nasa.heasarc/rasscndins11vs:paramhttpstd - gettext/xml - basehttps://heasarc.gsfc.nasa.gov/cgi-bin/vo/cone/coneGet.pl?table=rasscndins& - - ivo://nasa.heasarc/rasscndins1cs:conesearch - ivo://ivoa.net/std/conesearchivo://nasa.heasarc/rasscndinsvs:catalogservice2018-09-11T00:00:00RASSCNDINSROSAT All-Sky Survey Candidate Isolated Neutron Stars2018-09-11T00:00:00researchNo Description Availablehttps://heasarc.gsfc.nasa.gov/W3Browse/all/rasscndins.htmlTurner et al.catalog - 2010ApJ...714.1424T - - optical - - ivo://nasa.heasarc/registry
-
-
+ + Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Metadata on columns of a resource's tables. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) +present in this registry. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Topics, object types, or other descriptive keywords about the +resource.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.capabilityFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.table_columnFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.interfaceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.res_subject +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_level. +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_type. +The allowed values for waveband include: +Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vg:authority, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A bibliographic reference from which the present resource is derived or extracted.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAHml2bzovL2Nkcy52aXppZXIvai9hK2EvNDkyLzkyMwAAABF2czpjYXRhbG9nc2VydmljZQAAAA1KL0ErQS80OTIvOTIzAAAAMQBQAHUAbABzAGEAcgAgAFQAaQBtAGkAbgBnACAAZgBvAHIAIABGAGUAcgBtAGkAIABHAGEAbQBtAGEALQByAGEAeQAgAFMAcABhAGMAZQAgAFQAZQBsAGUAcwBjAG8AcABlAAAACHJlc2VhcmNoAAADhABXAGUAIABkAGUAcwBjAHIAaQBiAGUAIABhACAAYwBvAG0AcAByAGUAaABlAG4AcwBpAHYAZQAgAHAAdQBsAHMAYQByACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAGMAYQBtAHAAYQBpAGcAbgAgAGYAbwByACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAEcAYQBtAG0AYQAtAHIAYQB5ACAAUwBwAGEAYwBlACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAGYAbwByAG0AZQByAGwAeQAgAEcATABBAFMAVAApAC4AIABUAGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAYQBuAGQAIABzAHQAdQBkAHkAIABvAGYAIABwAHUAbABzAGEAcgBzACAAaQBuACAAZwBhAG0AbQBhACAAcgBhAHkAcwAgAGcAaQB2AGUAIABpAG4AcwBpAGcAaAB0AHMAIABpAG4AdABvACAAdABoAGUAIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMAIABvAGYAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAYQBuAGQAIABzAHUAcABlAHIAbgBvAHYAYQAgAHIAYQB0AGUAcwAgAGkAbgAgAHQAaABlACAARwBhAGwAYQB4AHkALAAgAGkAbgB0AG8AIABwAGEAcgB0AGkAYwBsAGUAIABhAGMAYwBlAGwAZQByAGEAdABpAG8AbgAgAG0AZQBjAGgAYQBuAGkAcwBtAHMAIABpAG4AIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgAgAG0AYQBnAG4AZQB0AG8AcwBwAGgAZQByAGUAcwAsACAAYQBuAGQAIABpAG4AdABvACAAdABoAGUAIAAiAGUAbgBnAGkAbgBlAHMAIgAgAGQAcgBpAHYAaQBuAGcAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlAC4AIABMAEEAVAAnAHMAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAYgBlAHQAdwBlAGUAbgAgADIAMABNAGUAVgAgAGEAbgBkACAAMwAwADAARwBlAFYAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAaQB0AHMAIAAyAC4ANABzAHIAIABmAGkAZQBsAGQALQBvAGYALQB2AGkAZQB3ACAAbQBhAGsAZQBzACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABtAGEAbgB5ACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAbABpAGsAZQBsAHkALAAgAGoAdQBzAHQAaQBmAHkAaQBuAGcAIAB0AGgAZQAgAG0AbwBuAGkAdABvAHIAaQBuAGcAIABvAGYAIABvAHYAZQByACAAdAB3AG8AIABoAHUAbgBkAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABsAGEAcgBnAGUAIABzAHAAaQBuAC0AZABvAHcAbgAgAHAAbwB3AGUAcgBzAC4AIABUAG8AIABzAGUAYQByAGMAaAAgAGYAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAdABpAG8AbgBzACAAZgByAG8AbQAgAG0AbwBzAHQAIABvAGYAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAcgBlAHEAdQBpAHIAZQBzACAAYQAgAHMAZQB0ACAAbwBmACAAcABoAGEAcwBlAC0AYwBvAG4AbgBlAGMAdABlAGQAIAB0AGkAbQBpAG4AZwAgAHMAbwBsAHUAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYQAgAHkAZQBhAHIAIABvAHIAIABtAG8AcgBlACAAdABvACAAcAByAG8AcABlAHIAbAB5ACAAYQBsAGkAZwBuACAAdABoAGUAIABzAHAAYQByAHMAZQAgAHAAaABvAHQAbwBuACAAYQByAHIAaQB2AGEAbAAgAHQAaQBtAGUAcwAuACAAVwBlACAAZABlAHMAYwByAGkAYgBlACAAdABoAGUAIABjAGgAbwBpAGMAZQAgAG8AZgAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHQAaABlACAAaQBuAHMAdAByAHUAbQBlAG4AdABzACAAaQBuAHYAbwBsAHYAZQBkACAAaQBuACAAdABoAGUAIABjAGEAbQBwAGEAaQBnAG4ALgAAADJodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNDkyLzkyMwAAAXkAUwBtAGkAdABoACAARAAuAEEALgA7ACAARwB1AGkAbABsAGUAbQBvAHQAIABMAC4AOwAgAEMAYQBtAGkAbABvACAARgAuADsAIABDAG8AZwBuAGEAcgBkACAASQAuADsAIABEAHUAbQBvAHIAYQAgAEQALgA7ACAARQBzAHAAaQBuAG8AegBhACAAQwAuADsAIABGAHIAZQBpAHIAZQAgAFAALgBDAC4AQwAuADsAIABHAG8AdAB0AGgAZQBsAGYAIABFAC4AVgAuADsAIABIAGEAcgBkAGkAbgBnACAAQQAuAEsALgA7ACAASABvAGIAYgBzACAARwAuAEIALgA7ACAASgBvAGgAbgBzAHQAbwBuACAAUwAuADsAIABLAGEAcwBwAGkAIABWAC4ATQAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABpAHYAaQBuAGcAcwB0AG8AbgBlACAATQAuAEEALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AOwAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABSAC4ATgAuADsAIABNAGEAcgBzAGgAYQBsAGwAIABGAC4ARQAuADsAIABNAGMATABhAHUAZwBoAGwAaQBuACAATQAuAEEALgA7ACAATgBvAHUAdABzAG8AcwAgAEEALgA7ACAAUgBhAG4AcwBvAG0AIABTAC4ATQAuADsAIABSAG8AYgBlAHIAdABzACAATQAuAFMALgBFAC4AOwAgAFIAbwBtAGEAbgBpACAAUgAuAFcALgA7ACAAUwB0AGEAcABwAGUAcgBzACAAQgAuAFcALgA7ACAAVABoAGUAdQByAGUAYQB1ACAARwAuADsAIABUAGgAbwBtAHAAcwBvAG4AIABEAC4ASgAuADsAIABUAGgAbwByAHMAZQB0AHQAIABTAC4ARQAuADsAIABXAGEAbgBnACAATgAuADsAIABXAGUAbAB0AGUAdgByAGUAZABlACAAUAAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADAAOABBACYAQQAuAC4ALgA0ADkAMgAuAC4AOQAyADMAU3/AAAAAAAAPZ2FtbWEtcmF5I3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNDkyLzkyMy90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0ErQS80OTIvOTIzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQStBLzQ5Mi85MjM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAdaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTIvYTEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAMSi9BK0EvNjEyL0ExAAAAHgBIAC4ARQAuAFMALgBTAC4AIABHAGEAbABhAGMAdABpAGMAIABQAGwAYQBuAGUAIABTAHUAcgB2AGUAeQAAAAhyZXNlYXJjaAAACCoAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAHQAaABlACAAbQBvAHMAdAAgAGMAbwBtAHAAcgBlAGgAZQBuAHMAaQB2AGUAIABzAHUAcgB2AGUAeQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAaQBuACAAdgBlAHIAeQAgAGgAaQBnAGgALQBlAG4AZQByAGcAeQAgACgAVgBIAEUAKQAgAGcAYQBtAG0AYQAtAHIAYQB5AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQAgAHAAdQBiAGwAaQBjACAAcgBlAGwAZQBhAHMAZQAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAHMAawB5ACAAbQBhAHAAcwAsACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAHMAbwB1AHIAYwBlAHMALAAgAGEAbgBkACAAdABoAGUAIABkAGkAcwBjAG8AdgBlAHIAeQAgAG8AZgAgADEANgAgAG4AZQB3ACAAcwBvAHUAcgBjAGUAcwAgAG8AZgAgAFYASABFACAAZwBhAG0AbQBhAC0AcgBhAHkAcwAuACAAVABoAGUAIABIAGkAZwBoACAARQBuAGUAcgBnAHkAIABTAHAAZQBjAHQAcgBvAHMAYwBvAHAAaQBjACAAUwB5AHMAdABlAG0AIAAoAEgALgBFAC4AUwAuAFMALgApACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAcwB1AHIAdgBlAHkAIAAoAEgARwBQAFMAKQAgAHcAYQBzACAAYQAgAGQAZQBjAGEAZABlAC0AbABvAG4AZwAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgAgAHAAcgBvAGcAcgBhAG0AIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABiAHkAIAB0AGgAZQAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABhAHIAcgBhAHkAIABvAGYAIABDAGgAZQByAGUAbgBrAG8AdgAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABpAG4AIABOAGEAbQBpAGIAaQBhACAAZgByAG8AbQAgADIAMAAwADQAIAB0AG8AIAAyADAAMQAzAC4AIABUAGgAZQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAYQBtAG8AdQBuAHQAIAB0AG8AIABuAGUAYQByAGwAeQAgADIANwAwADAAIABoACAAbwBmACAAcQB1AGEAbABpAHQAeQAtAHMAZQBsAGUAYwB0AGUAZAAgAGQAYQB0AGEALAAgAGMAbwB2AGUAcgBpAG4AZwAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAYQB0ACAAbABvAG4AZwBpAHQAdQBkAGUAcwAgAGYAcgBvAG0AIABsAD0AMgA1ADAAewBkAGUAZwB9ACAAdABvACAANgA1AHsAZABlAGcAfQAgAGEAbgBkACAAbABhAHQAaQB0AHUAZABlAHMAIAB8AGIAfAA8AD0AMwAuACAASQBuACAAYQBkAGQAaQB0AGkAbwBuACAAdABvACAAdABoAGUAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBwAGEAdABpAGEAbAAgAGMAbwB2AGUAcgBhAGcAZQAsACAAdABoAGUAIABIAEcAUABTACAAYQBsAHMAbwAgAGYAZQBhAHQAdQByAGUAcwAgAGEAIAByAGUAbABhAHQAaQB2AGUAbAB5ACAAaABpAGcAaAAgAGEAbgBnAHUAbABhAHIAIAByAGUAcwBvAGwAdQB0AGkAbwBuACAAKAAwAC4AMAA4AHsAZABlAGcAfQB+ADUALQBhAHIAYwBtAGkAbgAgAG0AZQBhAG4AIABwAG8AaQBuAHQAIABzAHAAcgBlAGEAZAAgAGYAdQBuAGMAdABpAG8AbgAgADYAOAAlACAAYwBvAG4AdABhAGkAbgBtAGUAbgB0ACAAcgBhAGQAaQB1AHMAKQAsACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAKAAxAC4ANQAlACAAQwByAGEAYgAgAGYAbAB1AHgAIABmAG8AcgAgAHAAbwBpAG4AdAAtAGwAaQBrAGUAIABzAG8AdQByAGMAZQBzACkALAAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIAByAGEAbgBnAGUAIAAoADAALgAyAC0AMQAwADAAVABlAFYAKQAuACAAVwBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAGcAYQBtAG0AYQAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAEgARwBQAFMAIABkAGEAdABhACAAcwBlAHQAIAB3AGkAdABoACAAYQAgAHMAeQBzAHQAZQBtAGEAdABpAGMAIABwAHIAbwBjAGUAZAB1AHIAZQAgAGYAbwByACAAYgBvAHQAaAAgAHMAbwB1AHIAYwBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAG4AZAAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBhAHQAaQBvAG4AIABvAGYAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQBuAGQAIABzAHAAZQBjAHQAcgB1AG0ALgAgAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAaQBzACAAbABpAGsAZQBsAGkAaABvAG8AZAAtACAAYgBhAHMAZQBkACAAbQBlAHQAaABvAGQAIABpAG4AIABkAGUAdABhAGkAbAAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAB0AGgAZQAgAGkAbgB0AHIAbwBkAHUAYwB0AGkAbwBuACAAbwBmACAAYQAgAG0AbwBkAGUAbAAgAGMAbwBtAHAAbwBuAGUAbgB0ACAAdABvACAAYQBjAGMAbwB1AG4AdAAgAGYAbwByACAAdQBuAHIAZQBzAG8AbAB2AGUAZAAsACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAZQBtAGkAcwBzAGkAbwBuACAAYQBsAG8AbgBnACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUALgAgAEkAbgAgAHQAbwB0AGEAbAAsACAAdABoAGUAIAByAGUAcwB1AGwAdABpAG4AZwAgAEgARwBQAFMAIABjAGEAdABhAGwAbwBnACAAYwBvAG4AdABhAGkAbgBzACAANwA4ACAAVgBIAEUAIABzAG8AdQByAGMAZQBzACwAIABvAGYAIAB3AGgAaQBjAGgAIAAxADQAIABhAHIAZQAgAG4AbwB0ACAAcgBlAGEAbgBhAGwAeQB6AGUAZAAgAGgAZQByAGUALAAgAGYAbwByACAAZQB4AGEAbQBwAGwAZQAsACAAZAB1AGUAIAB0AG8AIAB0AGgAZQBpAHIAIABjAG8AbQBwAGwAZQB4ACAAbQBvAHIAcABoAG8AbABvAGcAeQAsACAAbgBhAG0AZQBsAHkAIABzAGgAZQBsAGwALQBsAGkAawBlACAAcwBvAHUAcgBjAGUAcwAgAGEAbgBkACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGUAbgB0AGUAcgAgAHIAZQBnAGkAbwBuAC4AIABXAGgAZQByAGUAIABwAG8AcwBzAGkAYgBsAGUALAAgAHcAZQAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgBpAHIAbQAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAVgBIAEUAIABzAG8AdQByAGMAZQAgAG8AcgAgAHAAbABhAHUAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAcwBvAHUAcgBjAGUAcwAgAGkAbgAgAG8AdABoAGUAcgAgAGEAcwB0AHIAbwBuAG8AbQBpAGMAYQBsACAAYwBhAHQAYQBsAG8AZwBzAC4AIABXAGUAIABhAGwAcwBvACAAcwB0AHUAZABpAGUAZAAgAHQAaABlACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMAIABvAGYAIAB0AGgAZQAgAFYASABFACAAcwBvAHUAcgBjAGUAcwAgAHcAaQB0AGgAIABzAG8AdQByAGMAZQAgAHAAYQByAGEAbQBlAHQAZQByACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAuACAAMQA2ACAAbgBlAHcAIABzAG8AdQByAGMAZQBzACAAdwBlAHIAZQAgAHAAcgBlAHYAaQBvAHUAcwBsAHkAIAB1AG4AawBuAG8AdwBuACAAbwByACAAdQBuAHAAdQBiAGwAaQBzAGgAZQBkACwAIABhAG4AZAAgAHcAZQAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAbAB5ACAAZABpAHMAYwB1AHMAcwAgAHQAaABlAGkAcgAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgBzACAAbwByACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGYAaQByAG0AbAB5ACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADMAMQAgAHMAbwB1AHIAYwBlAHMAIABhAHMAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlACAAKABQAFcATgBlACkALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAGMAbwBtAHAAbwBzAGkAdABlACAAUwBOAFIAcwAsACAAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbQBvAG4AZwAgAHQAaABlACAANAA3ACAAcwBvAHUAcgBjAGUAcwAgAG4AbwB0ACAAeQBlAHQAIABpAGQAZQBuAHQAaQBmAGkAZQBkACwAIABtAG8AcwB0ACAAbwBmACAAdABoAGUAbQAgACgAMwA2ACkAIABoAGEAdgBlACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAYwBhAHQAYQBsAG8AZwBlAGQAIABvAGIAagBlAGMAdABzACwAIABuAG8AdABhAGIAbAB5ACAAUABXAE4AZQAgAGEAbgBkACAAZQBuAGUAcgBnAGUAdABpAGMAIABwAHUAbABzAGEAcgBzACAAdABoAGEAdAAgAGMAbwB1AGwAZAAgAHAAbwB3AGUAcgAgAFYASABFACAAUABXAE4AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0ErQS82MTIvQTEAAAysAEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAYgByAGEAbQBvAHcAcwBrAGkAIABBAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAHIAaQBlAHQAYQAgAE0ALgA7ACAAQQB1AGIAZQByAHQAIABQAC4AOwAgAEIAYQBjAGsAZQBzACAATQAuADsAIABCAGEAbAB6AGUAcgAgAEEALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGgAYQByAGQAIABTAC4AOwAgAEIAZQByAG4AbABvAGUAaAByACAASwAuADsAIABCAGwAYQBjAGsAdwBlAGwAbAAgAFIALgA7ACAAQgBvAGUAdAB0AGMAaABlAHIAIABNAC4AOwAgAEIAbwBpAHMAcwBvAG4AIABDAC4AOwAgAEIAbwBsAG0AbwBuAHQAIABKAC4AOwAgAEIAbwBuAG4AZQBmAG8AeQAgAFMALgA7ACAAQgBvAHIAZABhAHMAIABQAC4AOwAgAEIAcgBlAGcAZQBvAG4AIABKAC4AOwAgAEIAcgB1AG4AIABGAC4AOwAgAEIAcgB1AG4AIABQAC4AOwAgAEIAcgB5AGEAbgAgAE0ALgA7ACAAQgB1AGUAYwBoAGUAbABlACAATQAuADsAIABCAHUAbABpAGsAIABUAC4AOwAgAEMAYQBwAGEAcwBzAG8AIABNAC4AOwAgAEMAYQByAHIAaQBnAGEAbgAgAFMALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAdgBlAHMAIABSAC4AQwAuAEcALgA7ACAAQwBoAGUAbgAgAEEALgA7ACAAQwBoAGUAdgBhAGwAaQBlAHIAIABKAC4AOwAgAEMAbwBsAGEAZgByAGEAbgBjAGUAcwBjAG8AIABTAC4AOwAgAEMAbwBuAGQAbwBuACAAQgAuADsAIABDAG8AbgByAGEAZAAgAEoALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAYwBvAGMAawAgAEoALgA7ACAARABlAGkAbAAgAEMALgA7ACAARABlAHYAaQBuACAASgAuADsAIABkAGUAVwBpAGwAdAAgAFAALgA7ACAARABpAHIAcwBvAG4AIABMAC4AOwAgAEQAagBhAG4AbgBhAHQAaQAtAEEAdABhAGkAIABBAC4AOwAgAEQAbwBtAGEAaQBuAGsAbwAgAFcALgA7ACAARABvAG4AYQB0AGgAIABBAC4AOwAgAEQAcgB1AHIAeQAgAEwALgBPACcAQwAuADsAIABEAHUAdABzAG8AbgAgAEsALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBkAHcAYQByAGQAcwAgAFQALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBnAGUAcgAgAFAALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGEAcgBuAGkAZQByACAAQwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAZQByAG4AYQBuAGQAZQBzACAATQAuAFYALgA7ACAARgBpAGEAcwBzAG8AbgAgAEEALgA7ACAARgBvAG4AdABhAGkAbgBlACAARwAuADsAIABGAG8AZQByAHMAdABlAHIAIABBAC4AOwAgAEYAdQBuAGsAIABTAC4AOwAgAEYAdQBlAHMAcwBsAGkAbgBnACAATQAuADsAIABHAGEAYgBpAGMAaQAgAFMALgA7ACAARwBhAGwAbABhAG4AdAAgAFkALgBBAC4AOwAgAEcAYQByAHIAaQBnAG8AdQB4ACAAVAAuADsAIABHAGEAcwB0ACAASAAuADsAIABHAGEAdABlACAARgAuADsAIABHAGkAYQB2AGkAdAB0AG8AIABHAC4AOwAgAEcAaQBlAGIAZQBsAHMAIABCAC4AOwAgAEcAbABhAHcAaQBvAG4AIABEAC4AOwAgAEcAbABpAGMAZQBuAHMAdABlAGkAbgAgAEoALgBGAC4AOwAgAEcAbwB0AHQAcwBjAGgAYQBsAGwAIABEAC4AOwAgAEcAcgBvAG4AZABpAG4AIABNAC4ALQBIAC4AOwAgAEgAYQBoAG4AIABKAC4AOwAgAEgAYQB1AHAAdAAgAE0ALgA7ACAASABhAHcAawBlAHMAIABKAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASQB2AGEAcwBjAGUAbgBrAG8AIABBAC4AOwAgAEkAdwBhAHMAYQBrAGkAIABIAC4AOwAgAEoAYQBjAGgAbwBsAGsAbwB3AHMAawBhACAAQQAuADsAIABKAGEAbQByAG8AegB5ACAATQAuADsAIABKAGEAbgBrAG8AdwBzAGsAeQAgAEQALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABGAC4AOwAgAEoAaQBuAGcAbwAgAE0ALgA7ACAASgBvAHUAdgBpAG4AIABMAC4AOwAgAEoAdQBuAGcALQBSAGkAYwBoAGEAcgBkAHQAIABJAC4AOwAgAEsAYQBzAHQAZQBuAGQAaQBlAGMAawAgAE0ALgBBAC4AOwAgAEsAYQB0AGEAcgB6AHkATgBzAGsAaQAgAEsALgA7ACAASwBhAHQAcwB1AHIAYQBnAGEAdwBhACAATQAuADsAIABLAGEAdAB6ACAAVQAuADsAIABLAGUAcgBzAHoAYgBlAHIAZwAgAEQALgA7ACAASwBoAGEAbgBnAHUAbAB5AGEAbgAgAEQALgA7ACAASwBoAGUAbABpAGYAaQAgAEIALgA7ACAASwBpAG4AZwAgAEoALgA7ACAASwBsAGUAcABzAGUAcgAgAFMALgA7ACAASwBsAG8AYwBoAGsAbwB2ACAARAAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAawBhAHUAIABTAC4AOwAgAEsAcgBhAHUAcwAgAE0ALgA7ACAASwByAHUAZQBnAGUAcgAgAFAALgBQAC4AOwAgAEwAYQBmAGYAbwBuACAASAAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGUAcwAgAEoALgAtAFAALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHIAZQBuAHQAegAgAE0ALgA7ACAATABpAHUAIABSAC4AOwAgAEwAbwBwAGUAegAtAEMAbwB0AG8AIABSAC4AOwAgAEwAeQBwAG8AdgBhACAASQAuADsAIABNAGEAcgBhAG4AZABvAG4AIABWAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYwBvAHcAaQB0AGgAIABBAC4AOwAgAE0AYQByAGkAYQB1AGQAIABDAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGEAeAB0AGUAZAAgAE4ALgA7ACAATQBhAHkAZQByACAATQAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGUAeQBlAHIAIABNAC4AOwAgAE0AaQB0AGMAaABlAGwAbAAgAEEALgBNAC4AVwAuADsAIABNAG8AZABlAHIAcwBrAGkAIABSAC4AOwAgAE0AbwBoAGEAbQBlAGQAIABNAC4AOwAgAE0AbwBoAHIAbQBhAG4AbgAgAEwALgA7ACAATQBvAHIAYQAgAEsALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAGQAbwB2AGEAbgBpACAATQAuADsAIABQAGEAbgB0AGUAcgAgAE0ALgA7ACAAUABhAHIAcwBvAG4AcwAgAFIALgBEAC4AOwAgAFAAYQB6ACAAQQByAHIAaQBiAGEAcwAgAE0ALgA7ACAAUABlAGsAZQB1AHIAIABOAC4AVwAuADsAIABQAGUAbABsAGUAdABpAGUAcgAgAEcALgA7ACAAUABlAHIAZQBuAG4AZQBzACAAQwAuADsAIABQAGUAdAByAHUAYwBjAGkAIABQAC4ALQBPAC4AOwAgAFAAZQB5AGEAdQBkACAAQgAuADsAIABQAGkAZQBsACAAUQAuADsAIABQAGkAdABhACAAUwAuADsAIABQAG8AaQByAGUAYQB1ACAAVgAuADsAIABQAG8AbwBuACAASAAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgA7ACAAUAByAG8AawBvAHAAaAAgAEgALgA7ACAAUAB1AGUAaABsAGgAbwBmAGUAcgAgAEcALgA7ACAAUAB1AG4AYwBoACAATQAuADsAIABRAHUAaQByAHIAZQBuAGIAYQBjAGgAIABBAC4AOwAgAFIAYQBhAGIAIABTAC4AOwAgAFIAYQB1AHQAaAAgAFIALgA7ACAAUgBlAGkAbQBlAHIAIABBAC4AOwAgAFIAZQBpAG0AZQByACAATwAuADsAIABSAGUAbgBhAHUAZAAgAE0ALgA7ACAAZABlACAAbABvAHMAIABSAGUAeQBlAHMAIABSAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBsAHQAZQBuACAAQwAuAEIALgA7ACAAUwBhAGYAaQAtAEgAYQByAGIAIABTAC4AOwAgAFMAYQBoAGEAawBpAGEAbgAgAFYALgA7ACAAUwBhAGkAdABvACAAUwAuADsAIABTAGEAbgBjAGgAZQB6ACAARAAuAEEALgA7ACAAUwBhAG4AdABhAG4AZwBlAGwAbwAgAEEALgA7ACAAUwBhAHMAYQBrAGkAIABNAC4AOwAgAFMAYwBoAGEAbgBkAHIAaQAgAE0ALgA7ACAAUwBjAGgAbABpAGMAawBlAGkAcwBlAHIAIABSAC4AOwAgAFMAYwBoAHUAZQBzAHMAbABlAHIAIABGAC4AOwAgAFMAYwBoAHUAbAB6ACAAQQAuADsAIABTAGMAaAB3AGEAbgBrAGUAIABVAC4AOwAgAFMAYwBoAHcAZQBtAG0AZQByACAAUwAuADsAIABTAGUAZwBsAGEAcgAtAEEAcgByAG8AeQBvACAATQAuADsAIABTAGUAdAB0AGkAbQBvACAATQAuADsAIABTAGUAeQBmAGYAZQByAHQAIABBAC4AUwAuADsAIABTAGgAYQBmAGkAIABOAC4AOwAgAFMAaABpAGwAbwBuACAASQAuADsAIABTAGgAaQBuAGkAbgBnAGEAeQBhAG0AdwBlACAASwAuADsAIABTAGkAbQBvAG4AaQAgAFIALgA7ACAAUwBvAGwAIABIAC4AOwAgAFMAcABhAG4AaQBlAHIAIABGAC4AOwAgAFMAcABpAHIALQBKAGEAYwBvAGIAIABNAC4AOwAgAFMAdABhAHcAYQByAHoAIABMAC4AOwAgAFMAdABlAGUAbgBrAGEAbQBwACAAUgAuADsAIABTAHQAZQBnAG0AYQBuAG4AIABDAC4AOwAgAFMAdABlAHAAcABhACAAQwAuADsAIABTAHUAcwBoAGMAaAAgAEkALgA7ACAAVABhAGsAYQBoAGEAcwBoAGkAIABUAC4AOwAgAFQAYQB2AGUAcgBuAGUAdAAgAEoALgAtAFAALgA7ACAAVABhAHYAZQByAG4AaQBlAHIAIABUAC4AOwAgAFQAYQB5AGwAbwByACAAQQAuAE0ALgA7ACAAVABlAHIAcgBpAGUAcgAgAFIALgA7ACAAVABpAGIAYQBsAGQAbwAgAEwALgA7ACAAVABpAHoAaQBhAG4AaQAgAEQALgA7ACAAVABsAHUAYwB6AHkAawBvAG4AdAAgAE0ALgA7ACAAVAByAGkAYwBoAGEAcgBkACAAQwAuADsAIABUAHMAaQByAG8AdQAgAE0ALgA7ACAAVABzAHUAagBpACAATgAuADsAIABUAHUAZgBmAHMAIABSAC4AOwAgAFUAYwBoAGkAeQBhAG0AYQAgAFkALgA7ACAAdgBhAG4AIABkAGUAcgAgAFcAYQBsAHQAIABEAC4ASgAuADsAIAB2AGEAbgAgAEUAbABkAGkAawAgAEMALgA7ACAAdgBhAG4AIABSAGUAbgBzAGIAdQByAGcAIABDAC4AOwAgAHYAYQBuACAAUwBvAGUAbABlAG4AIABCAC4AOwAgAFYAYQBzAGkAbABlAGkAYQBkAGkAcwAgAEcALgA7ACAAVgBlAGgAIABKAC4AOwAgAFYAZQBuAHQAZQByACAAQwAuADsAIABWAGkAYQBuAGEAIABBAC4AOwAgAFYAaQBuAGMAZQBuAHQAIABQAC4AOwAgAFYAaQBuAGsAIABKAC4AOwAgAFYAbwBpAHMAaQBuACAARgAuADsAIABWAG8AZQBsAGsAIABIAC4ASgAuADsAIABWAHUAaQBsAGwAYQB1AG0AZQAgAFQALgA7ACAAVwBhAGQAaQBhAHMAaQBuAGcAaAAgAFoALgA7ACAAVwBhAGcAbgBlAHIAIABTAC4ASgAuADsAIABXAGEAZwBuAGUAcgAgAFAALgA7ACAAVwBhAGcAbgBlAHIAIABSAC4ATQAuADsAIABXAGgAaQB0AGUAIABSAC4AOwAgAFcAaQBlAHIAegBjAGgAbwBsAHMAawBhACAAQQAuADsAIABXAGkAbABsAG0AYQBuAG4AIABQAC4AOwAgAFcAbwBlAHIAbgBsAGUAaQBuACAAQQAuADsAIABXAG8AdQB0AGUAcgBzACAARAAuADsAIABZAGEAbgBnACAAUgAuADsAIABaAGEAYgBvAHIAbwB2ACAARAAuADsAIABaAGEAYwBoAGEAcgBpAGEAcwAgAE0ALgA7ACAAWgBhAG4AaQBuACAAUgAuADsAIABaAGQAegBpAGEAcgBzAGsAaQAgAEEALgBBAC4AOwAgAFoAZQBjAGgAIABBAC4AOwAgAFoAZQBmAGkAIABGAC4AOwAgAFoAaQBlAGcAbABlAHIAIABBAC4AOwAgAFoAbwByAG4AIABKAC4AOwAgAFoAeQB3AHUAYwBrAGEAIABOAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2RlAAAAEwAyADAAMQA4AEEAJgBBAC4ALgAuADYAMQAyAEEALgAuAC4AMQBIf8AAAAAAAAlnYW1tYS1yYXkAAASraHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NucmNhdD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9sc2NvbXA/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvY29tcG9uPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9saXN0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NvdXJjZXM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc25yY2F0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xzY29tcD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9jb21wb24/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xpc3Q/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc291cmNlcz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMQAAAjdpdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6OjoAAAGjdnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAEFc3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAH2l2bzovL2Nkcy52aXppZXIvai9hK2EvNjE4L2ExODYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAOSi9BK0EvNjE4L0ExODYAAAAdAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAbwBmACAAMQAwACAAcAB1AGwAcwBhAHIAcwAAAAhyZXNlYXJjaAAABwUAUAB1AGwAcwBhAHIAcwAgAHMAYwBpAG4AdABpAGwAbABhAHQAZQAuACAARAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEAIABzAGgAbwB3ACAAYgByAGkAZwBoAHQAbgBlAHMAcwAgAHYAYQByAGkAYQB0AGkAbwBuACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAdABpAG0AZQAgAGEAbgBkACAAZgByAGUAcQB1AGUAbgBjAHkAIABkAG8AbQBhAGkAbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAZABlAG0AbwBuAHMAdAByAGEAdABlACAAdABoAGUAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAG8AZgAgAGYAbAB1AGMAdAB1AGEAdABpAG8AbgAgAHAAbwB3AGUAcgAgAGkAbgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAcwB0AHIAbwBuAGcAbAB5ACAAZABlAHAAZQBuAGQAIABvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AYQBsACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACwAIABiAHUAdAAgAHcAZQByAGUAIABvAGYAdABlAG4AIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABsAG8AdwBlAHIAIAB0AGgAYQBuACAAMQAuADUARwBIAHoALgAgAFMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGEAdAAgAGgAaQBnAGgAZQByACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACAAaABlAGwAcAAgAHQAbwAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIAB0AHUAcgBiAHUAbABlAG4AYwBlACAAZgBlAGEAdAB1AHIAZQAgAG8AZgAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgAG8AdgBlAHIAIABhACAAdwBpAGQAZQAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAcgBhAG4AZwBlACAAYQBuAGQAIABjAGEAbgAgAGQAZQB0AGUAYwB0ACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMAIABvAGYAIABtAG8AcgBlACAAZABpAHMAdABhAG4AdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAZQBuACAAcAB1AGwAcwBhAHIAcwAgAHcAZQByAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIAAyADIANQAwAE0ASAB6ACAAKABTAC0AYgBhAG4AZAApACAAdwBpAHQAaAAgAHQAaABlACAASgBpAGEAbQB1AHMAaQAgADYANgBtACAAdABlAGwAZQBzAGMAbwBwAGUAIAB0AG8AIABzAHQAdQBkAHkAIAB0AGgAZQBpAHIAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMALgAgAFQAaABlAGkAcgAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGYAaQByAHMAdAAgAG8AYgB0AGEAaQBuAGUAZAAsACAAZgByAG8AbQAgAHcAaABpAGMAaAAgAHQAaABlACAAZABlAGMAbwByAHIAZQBsAGEAdABpAG8AbgAgAGIAYQBuAGQAdwBpAGQAdABoAHMAIABhAG4AZAAgAHQAaQBtAGUAIABzAGMAYQBsAGUAcwAgAG8AZgAgAGQAaQBmAGYAcgBhAGMAdABpAHYAZQAgAHMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIAB3AGUAcgBlACAAdABoAGUAbgAgAGQAZQByAGkAdgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwByAHIAZQBsAGEAdABpAG8AbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABiAHkAIABmAG8AcgBtAGkAbgBnACAAdABoAGUAIABGAG8AdQByAGkAZQByACAAcABvAHcAZQByACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAE0AbwBzAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3AGwAeQAgAG8AYgB0AGEAaQBuAGUAZAAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAYQByAGUAIABhAHQAIAB0AGgAZQAgAGgAaQBnAGgAZQBzAHQAIABmAHIAZQBxAHUAZQBuAGMAeQAgAG8AcgAgAGgAYQB2AGUAIAB0AGgAZQAgAGwAbwBuAGcAZQBzAHQAIAB0AGkAbQBlACAAcwBwAGEAbgAgAG8AZgAgAGEAbgB5ACAAcAB1AGIAbABpAHMAaABlAGQAIABkAGEAdABhACAAZgBvAHIAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzAC4AIABGAG8AcgAgAFAAUwBSAHMAIABCADAANQA0ADAAKwAyADMALAAgAEIAMgAzADIANAArADYAMAAgAGEAbgBkACAAQgAyADMANQAxACsANgAxACwAIAB0AGgAZQBzAGUAIAB3AGUAcgBlACAAdABoAGUAIABmAGkAcgBzAHQAIABkAHkAbgBhAG0AaQBjACAAcwBwAGUAYwB0AHIAYQAgAGUAdgBlAHIAIAByAGUAcABvAHIAdABlAGQALgAgAFQAaABlACAAZgByAGUAcQB1AGUAbgBjAHkALQBkAGUAcABlAG4AZABlAG4AYwBlACAAbwBmACAAcwBjAGkAbgB0AGkAbABsAGEAdABpAG8AbgAgAHAAYQByAGEAbQBlAHQAZQByAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAHQAaABhAHQAIAB0AGgAZQAgAGkAbgB0AGUAcgB2AGUAbgBpAG4AZwAgAG0AZQBkAGkAdQBtACAAYwBhAG4AIAByAGEAcgBlAGwAeQAgAGIAZQAgAGkAZABlAGEAbABsAHkAIAB0AHUAcgBiAHUAbABlAG4AdAAgAHcAaQB0AGgAIABhACAASwBvAGwAbQBvAGcAbwByAG8AdgAgAHMAcABlAGMAdAByAHUAbQAuACAAVABoAGUAIAB0AGgAaQBuACAAcwBjAHIAZQBlAG4AIABtAG8AZABlAGwAIAB3AG8AcgBrAGUAZAAgAHcAZQBsAGwAIABhAHQAIABTAC0AYgBhAG4AZAAgAGYAbwByACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuACAAbwBmACAAUABTAFIAIABCADEAOQAzADMAKwAxADYALgAgAFAAYQByAGEAYgBvAGwAaQBjACAAYQByAGMAcwAgAHcAZQByAGUAIABkAGUAdABlAGMAdABlAGQAIABpAG4AIAB0AGgAZQAgAHMAZQBjAG8AbgBkAGEAcgB5ACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaAByAGUAZQAgAHAAdQBsAHMAYQByAHMALAAgAFAAUwBSAHMAIABCADAAMwA1ADUAKwA1ADQALAAgAEIAMAA1ADQAMAArADIAMwAgAGEAbgBkACAAQgAyADEANQA0ACsANAAwACwAIABhAGwAbAAgAG8AZgAgAHcAaABpAGMAaAAgAHcAZQByAGUAIABhAHMAeQBtAG0AZQB0AHIAaQBjAGEAbABsAHkAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQALgAgAFQAaABlACAAaQBuAHYAZQByAHQAZQBkACAAYQByAGMAbABlAHQAcwAgAG8AZgAgAFAAUwBSACAAQgAwADMANQA1ACsANQA0ACAAdwBlAHIAZQAgAHMAZQBlAG4AIAB0AG8AIABlAHYAbwBsAHYAZQAgAGEAbABvAG4AZwAgAHQAaABlACAAbQBhAGkAbgAgAHAAYQByAGEAYgBvAGwAYQAgAHcAaQB0AGgAaQBuACAAYQAgAGMAbwBuAHQAaQBuAHUAbwB1AHMAIABvAGIAcwBlAHIAdgBpAG4AZwAgAHMAZQBzAHMAaQBvAG4AIABvAGYAIAAxADIAIABoAG8AdQByAHMALAAgAGYAcgBvAG0AIAB3AGgAaQBjAGgAIAB0AGgAZQAgAGEAbgBnAHUAbABhAHIAIAB2AGUAbABvAGMAaQB0AHkAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdwBhAHMAIABlAHMAdABpAG0AYQB0AGUAZAAgAHQAaABhAHQAIAB3AGEAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABiAHkAIAB2AGUAcgB5ACAAbABvAG4AZwAgAGIAYQBzAGUAbABpAG4AZQAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAeQAgACgAVgBMAEIASQApAC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYxOC9BMTg2AAAAVABXAGEAbgBnACAAUAAuAEYALgA7ACAASABhAG4AIABKAC4ATAAuADsAIABIAGEAbgAgAEwALgA7ACAAWgBoAGEAbgBnACAASgAuAEgALgA7ACAATABpACAASgAuAFEALgA7ACAAVwBhAG4AZwAgAEMALgA7ACAASABhAG4AIABKAC4AOwAgAFcAYQBuAGcAIABUAC4AOwAgAEcAYQBvACAAWAAuAFkALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADgAQQAmAEEALgAuAC4ANgAxADgAQQAuADEAOAA2AFd/wAAAAAAABXJhZGlvAAABGWh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTgvQTE4Ni90YWJsZTE/AAAAZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAfaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTkvYTEyNAAAABF2czpjYXRhbG9nc2VydmljZQAAAA5KL0ErQS82MTkvQTEyNAAAACYAVABIAE8AUgAgAHMAdQByAHYAZQB5ACAAaQBuACAAbgBvAHIAdABoAGUAcgBuACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlAAAACHJlc2VhcmNoAAAJAQBSAGEAZABpAG8AIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAdQByAHYAZQB5AHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGMAYQBuACAAZgBpAG4AZAAgAGEAbgBkACAAYwBoAGEAcgBhAGMAdABlAHIAaQB6AGUAIABIAEkASQAgAHIAZQBnAGkAbwBuAHMALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAHAAbABhAG4AZQB0AGEAcgB5ACAAbgBlAGIAdQBsAGEAZQAgACgAUABOAGUAKQAsACAAYQBuAGQAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAuACAAQQAgAG4AdQBtAGIAZQByACAAbwBmACAAcwB1AHIAdgBlAHkAcwAgAGEAdAAgAGgAaQBnAGgAIABhAG4AZwB1AGwAYQByACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgACgAPAB+ADIANQAiACkAIABhAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGUAeABpAHMAdAAgAHQAbwAgAHMAdAB1AGQAeQAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgACgASQBTAE0AKQAsACAAYgB1AHQAIABuAG8AIABjAG8AbQBwAGEAcgBhAGIAbABlACAAaABpAGcAaAAtAHIAZQBzAG8AbAB1AHQAaQBvAG4AIABhAG4AZAAgAGgAaQBnAGgALQBzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABzAHUAcgB2AGUAeQAgAGUAeABpAHMAdABzACAAYQB0ACAAbABvAG4AZwAgAHIAYQBkAGkAbwAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGEAcgBvAHUAbgBkACAAMgAxAGMAbQAuACAATwB1AHIAIABnAG8AYQBsACAAaQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAIAAyADEAYwBtACAAcgBhAGQAaQBvACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABpAG4AIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGEAdAAgADwAMgA1ACIAIAByAGUAcwBvAGwAdQB0AGkAbwBuAC4AIABXAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhACAAbABhAHIAZwBlACAAZgByAGEAYwB0AGkAbwBuACAAbwBmACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUAIABpAG4AIAB0AGgAZQAgAGYAaQByAHMAdAAgAHEAdQBhAGQAcgBhAG4AdAAgAG8AZgAgAHQAaABlACAATQBpAGwAawB5ACAAVwBhAHkAIAAoAGwAPQAxADQALgAwAHsAZABlAGcAfQAtADYANwAuADQAewBkAGUAZwB9ACAAYQBuAGQAIAB8AGIAfAA8AD0AMQAuADIANQB7AGQAZQBnAH0AKQAgAHcAaQB0AGgAIAB0AGgAZQAgAEsAYQByAGwAIABHAC4AIABKAGEAbgBzAGsAeQAgAFYAZQByAHkAIABMAGEAcgBnAGUAIABBAHIAcgBhAHkAIAAoAFYATABBACkAIABpAG4AIAB0AGgAZQAgAEMALQBjAG8AbgBmAGkAZwB1AHIAYQB0AGkAbwBuACAAYwBvAHYAZQByAGkAbgBnACAAcwBpAHgAIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3AHMALgAgAFQAaABlAHMAZQAgAGQAYQB0AGEAIABwAHIAbwB2AGkAZABlACAAYQAgAGQAZQB0AGEAaQBsAGUAZAAgAHYAaQBlAHcAIABvAG4AIAB0AGgAZQAgAGMAbwBtAHAAYQBjAHQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAZQB4AHQAZQBuAGQAZQBkACAAcgBhAGQAaQBvACAAZQBtAGkAcwBzAGkAbwBuACAAbwBmACAAbwB1AHIAIABHAGEAbABhAHgAeQAgAGEAbgBkACAAdABoAG8AdQBzAGEAbgBkAHMAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAFcAZQAgAHUAcwBlAGQAIAB0AGgAZQAgAEIATABPAEIAQwBBAFQAIABzAG8AZgB0AHcAYQByAGUAIABhAG4AZAAgAGUAeAB0AHIAYQBjAHQAZQBkACAAMQAwADkAMQA2ACAAcwBvAHUAcgBjAGUAcwAuACAAQQBmAHQAZQByACAAcgBlAG0AbwB2AGkAbgBnACAAcwBwAHUAcgBpAG8AdQBzACAAcwBvAHUAcgBjAGUAIABkAGUAdABlAGMAdABpAG8AbgBzACAAYwBhAHUAcwBlAGQAIABiAHkAIAB0AGgAZQAgAHMAaQBkAGUAbABvAGIAZQBzACAAbwBmACAAdABoAGUAIABzAHkAbgB0AGgAZQBzAGkAcwBlAGQAIABiAGUAYQBtACwAIAB3AGUAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAMQAwADMAOAA3ACAAcwBvAHUAcgBjAGUAcwAgAGEAcwAgAHIAZQBsAGkAYQBiAGwAZQAgAGQAZQB0AGUAYwB0AGkAbwBuAHMALgBXAGUAIABzAG0AbwBvAHQAaABlAGQAIAB0AGgAZQAgAGkAbQBhAGcAZQBzACAAdABvACAAYQAgAGMAbwBtAG0AbwBuACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgAG8AZgAgADIANQAiACAAYQBuAGQAIABlAHgAdAByAGEAYwB0AGUAZAAgAHQAaABlACAAcABlAGEAawAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdAB5ACAAbwBmACAAZQBhAGMAaAAgAHMAbwB1AHIAYwBlACAAaQBuACAAZQBhAGMAaAAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3ACAAKABTAFAAVwApACAAdABvACAAZABlAHQAZQByAG0AaQBuAGUAIAB0AGgAZQAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIAB7AGEAbABwAGgAYQB9ACAAKABhAHMAcwB1AG0AaQBuAGcAIABJACgAbgB1ACkAewBwAHIAbwBwAC4AdABvAH0AbgB1AF4AYQBsAHAAaABhAF4AKQAuACAAQgB5ACAAYwByAG8AcwBzAC0AbQBhAHQAYwBoAGkAbgBnACAAdwBpAHQAaAAgAGMAYQB0AGEAbABvAGcAcwAgAG8AZgAgAEgASQBJACAAcgBlAGcAaQBvAG4AcwAsACAAUwBOAFIAcwAsACAAUABOAGUALAAgAGEAbgBkACAAcAB1AGwAcwBhAHIAcwAsACAAdwBlACAAZgBvAHUAbgBkACAAcgBhAGQAaQBvACAAYwBvAHUAbgB0AGUAcgBwAGEAcgB0AHMAIABmAG8AcgAgADgANAAwACAASABJAEkAIAByAGUAZwBpAG8AbgBzACwAIAA1ADIAIABTAE4AUgBzACwAIAAxADYANAAgAFAATgBlACwAIABhAG4AZAAgADMAOAAgAHAAdQBsAHMAYQByAHMALgAgAFcAZQAgAGYAbwB1AG4AZAAgADcAOQAgAGMAbwBuAHQAaQBuAHUAdQBtACAAcwBvAHUAcgBjAGUAcwAgAHQAaABhAHQAIABhAHIAZQAgAGEAcwBzAG8AYwBpAGEAdABlAGQAIAB3AGkAdABoACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAuACAAVwBlACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADYAOQA5ACAAdQBsAHQAcgBhAHMAdABlAGUAcAAgAHMAcABlAGMAdAByAGEAbAAgAHMAbwB1AHIAYwBlAHMAIAAoAGEAbABwAGgAYQA8AC0AMQAuADMAKQAgAHQAaABhAHQAIABjAG8AdQBsAGQAIABiAGUAIABoAGkAZwBoAC0AcgBlAGQAcwBoAGkAZgB0ACAAZwBhAGwAYQB4AGkAZQBzAC4AIABBAHIAbwB1AG4AZAAgADkAMAAwADAAIABvAGYAIAB0AGgAZQAgAHMAbwB1AHIAYwBlAHMAIAB3AGUAIABlAHgAdAByAGEAYwB0AGUAZAAgAGEAcgBlACAAbgBvAHQAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAcwBwAGUAYwBpAGYAaQBjAGEAbABsAHkALAAgAGIAdQB0ACAAYgBhAHMAZQBkACAAbwBuACAAdABoAGUAaQByACAAcwBwAGEAdABpAGEAbAAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4ALAAgAGEAIABsAGEAcgBnAGUAIABmAHIAYQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQBtACAAaQBzACAAbABpAGsAZQBsAHkAIAB0AG8AIABiAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAE0AbwByAGUAIAB0AGgAYQBuACAANwA3ADUAMAAgAHMAbwB1AHIAYwBlAHMAIABkAG8AIABuAG8AdAAgAGgAYQB2AGUAIABjAG8AdQBuAHQAZQByAHAAYQByAHQAcwAgAGkAbgAgAHQAaABlACAAUwBJAE0AQgBBAEQAIABkAGEAdABhAGIAYQBzAGUALAAgAGEAbgBkACAAbQBvAHIAZQAgAHQAaABhAG4AIAAzADcANgAwACAAcwBvAHUAcgBjAGUAcwAgAGQAbwAgAG4AbwB0ACAAaABhAHYAZQAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzACAAaQBuACAAdABoAGUAIABOAEUARAAgAGQAYQB0AGEAYgBhAHMAZQAuACAAUwB0AHUAZAB5AGkAbgBnACAAdABoAGUAIABsAG8AbgBnACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACAAYwBtACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABhAG4AZAAgAHQAaABlACAAYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIABhAGwAbABvAHcAcwAgAHUAcwAgAHQAbwAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBlACAAYQAgAGwAYQByAGcAZQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAGEAbgBkACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABpAG4AIAB0AGgAZQAgAGEAcgBlAGEAIABvAGYAIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAGkAbgBuAGUAcgAgAE0AaQBsAGsAeQAgAFcAYQB5AC4AIABUAGgAaQBzACAAZABhAHQAYQBiAGEAcwBlACAAdwBpAGwAbAAgAGIAZQAgAGUAeAB0AHIAZQBtAGUAbAB5ACAAdQBzAGUAZgB1AGwAIABmAG8AcgAg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AGkAZQB3ACAAbwBmACAAdABoAGUAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQAgACgAUABXAE4AKQAgAEgARQBTAFMAIABKADEAOAAyADUALQAtADEAMwA3AC4AIABXAGUAIABhAGkAbQAgAHQAbwAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIABtAGUAYwBoAGEAbgBpAHMAbQBzACAAZABvAG0AaQBuAGEAdABpAG4AZwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALAAgAGEAYwBjAG8AdQBuAHQAaQBuAGcAIABmAG8AcgAgAGkAdABzACAAYQBuAG8AbQBhAGwAbwB1AHMAbAB5ACAAbABhAHIAZwBlACAAcwBpAHoAZQAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMALgAgAFQAaABlACAAbgBlAGIAdQBsAGEAIABpAHMAIABzAHQAdQBkAGkAZQBkACAAdQBzAGkAbgBnACAAYQAgAGQAZQBlAHAAIABlAHgAcABvAHMAdQByAGUAIABmAHIAbwBtACAAbwB2AGUAcgAgADEAMgAgAHkAZQBhAHIAcwAgAG8AZgAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABvAHAAZQByAGEAdABpAG8AbgAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAGQAYQB0AGEAIABmAHIAbwBtACAASAAuAEUALgBTAC4AUwAuACAASQBJACAAaQBtAHAAcgBvAHYAaQBuAGcAIAB0AGgAZQAgAGwAbwB3ACAAZQBuAGUAcgBnAHkAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkALgAgAEUAbgBoAGEAbgBjAGUAZAAgAGUAbgBlAHIAZwB5AC0AIABkAGUAcABlAG4AZABlAG4AdAAgAG0AbwByAHAAaABvAGwAbwBnAGkAYwBhAGwAIABhAG4AZAAgAHMAcABhAHQAaQBhAGwAbAB5AC0AcgBlAHMAbwBsAHYAZQBkACAAcwBwAGUAYwB0AHIAYQBsACAAYQBuAGEAbAB5AHMAZQBzACAAcAByAG8AYgBlACAAdABoAGUAIABWAGUAcgB5ACAASABpAGcAaAAgAEUAbgBlAHIAZwB5ACAAKABWAEgARQAsACAARQA+ADAALgAxAFQAZQBWACkAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhAC4AIABUAGgAZQAgAG4AZQBiAHUAbABhACAAZQBtAGkAcwBzAGkAbwBuACAAaQBzACAAcgBlAHYAZQBhAGwAZQBkACAAdABvACAAZQB4AHQAZQBuAGQAIABvAHUAdAAgAHQAbwAgADEALgA1ACAAZABlAGcAcgBlAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAHAAdQBsAHMAYQByACwAIAB+ADEALgA1ACAAdABpAG0AZQBzACAAZgB1AHIAdABoAGUAcgAgAHQAaABhAG4AIABwAHIAZQB2AGkAbwB1AHMAbAB5ACAAcwBlAGUAbgAsACAAbQBhAGsAaQBuAGcAIABIAEUAUwBTACAASgAxADgAMgA1AC0AMQAzADcALAAgAHcAaQB0AGgAIABhAG4AIABpAG4AdAByAGkAbgBzAGkAYwAgAGQAaQBhAG0AZQB0AGUAcgAgAG8AZgAgAH4AMQAwADAAcABjACwAIABwAG8AdABlAG4AdABpAGEAbABsAHkAIAB0AGgAZQAgAGwAYQByAGcAZQBzAHQAIABnAGEAbQBtAGEALQByAGEAeQAgAFAAVwBOACAAYwB1AHIAcgBlAG4AdABsAHkAIABrAG4AbwB3AG4ALgAgAEMAaABhAHIAYQBjAHQAZQByAGkAcwBhAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhACcAcwAgAHMAdAByAG8AbgBnAGwAeQAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAZQBuAGEAYgBsAGUAcwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIABtAGUAYwBoAGEAbgBpAHMAbQBzACAAdABvACAAYgBlACAAYwBvAG4AcwB0AHIAYQBpAG4AZQBkAC4AIABBACAAZABlAHAAZQBuAGQAZQBuAGMAZQAgAG8AZgAgAHQAaABlACAAbgBlAGIAdQBsAGEAIABlAHgAdABlAG4AdAAgAHcAaQB0AGgAIABlAG4AZQByAGcAeQAgAG8AZgAgAFIAewBwAHIAbwBwAC4AdABvAH0AIABFAF4AYQBsAHAAaABhAF4AIAB3AGkAdABoACAAYQBsAHAAaABhAD0ALQAwAC4AMgA5ACsALwAtADAALgAwADQAKABzAHQAYQB0ACkAKwAvAC0AMAAuADAANQAoAHMAeQBzACkAIABkAGkAcwBmAGEAdgBvAHUAcgBzACAAYQAgAHAAdQByAGUAIABkAGkAZgBmAHUAcwBpAG8AbgAgAHMAYwBlAG4AYQByAGkAbwAgAGYAbwByACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAgAFQAaABlACAAdABvAHQAYQBsACAAZwBhAG0AbQBhAC0AcgBhAHkAIABmAGwAdQB4ACAAbwBmACAAdABoAGUAIABuAGUAYgB1AGwAYQAgAGEAYgBvAHYAZQAgADEAfgBUAGUAVgAgAGkAcwAgAGYAbwB1AG4AZAAgAHQAbwAgAGIAZQAgACgAMQAuADEAMgArAC8ALQAwAC4AMAAzACgAcwB0AGEAdAApACsALwAtADAALgAyADUAKABzAHkAcwApACkAeAAxADAAXgAtADEAMQBeAGMAbQBeAC0AMgBeAHMAXgAtADEAXgAsACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAHQAbwAgAH4ANgA0ACUAIABvAGYAIAB0AGgAZQAgAGYAbAB1AHgAIABvAGYAIAB0AGgAZQAgAEMAcgBhAGIAIABOAGUAYgB1AGwAYQAuACAASABFAFMAUwAgAEoAMQA4ADIANQAtADEAMwA3ACAAaQBzACAAYQAgAFAAVwBOACAAdwBpAHQAaAAgAGMAbABlAGEAcgAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQB0ACAAVgBIAEUAIABnAGEAbQBtAGEALQByAGEAeQAgAGUAbgBlAHIAZwBpAGUAcwAuACAAVABoAGkAcwAgAHMAbwB1AHIAYwBlACAAaQBzACAAdQBzAGUAZAAgAGEAcwAgAGEAIABsAGEAYgBvAHIAYQB0AG8AcgB5ACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAG0AaQBkAGQAbABlAC0AYQBnAGUAZAAgAFAAVwBOAGUALgAgAEQAZQBlAHAAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAG8AZgAgAHQAaABpAHMAIABoAGkAZwBoAGwAeQAgAHMAcABhAHQAaQBhAGwAbAB5AC0AZQB4AHQAZQBuAGQAZQBkACAAUABXAE4AIABlAG4AYQBiAGwAZQAgAGEAIABzAHAAZQBjAHQAcgBhAGwAIABtAGEAcAAgAG8AZgAgAHQAaABlACAAcgBlAGcAaQBvAG4AIAB0AG8AIABiAGUAIABwAHIAbwBkAHUAYwBlAGQALAAgAHAAcgBvAHYAaQBkAGkAbgBnACAAaQBuAHMAaQBnAGgAdABzACAAaQBuAHQAbwAgAHQAaABlACAAcwBwAGUAYwB0AHIAYQBsACAAdgBhAHIAaQBhAHQAaQBvAG4AIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAAADNodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNjIxL0ExMTYAAAs2AEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAGMAYQByAG8AIABDAC4AOwAgAEEAcgBtAGEAbgBkACAAQwAuADsAIABBAHIAcgBpAGUAdABhACAATQAuADsAIABCAGEAYwBrAGUAcwAgAE0ALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGwAbwBlAGgAcgAgAEsALgA7ACAAQgBsAGEAYwBrAHcAZQBsAGwAIABSAC4AOwAgAEIAbwBlAHQAdABjAGgAZQByACAATQAuADsAIABCAG8AaQBzAHMAbwBuACAAQwAuADsAIABCAG8AbABtAG8AbgB0ACAASgAuADsAIABCAG8AbgBuAGUAZgBvAHkAIABTAC4AOwAgAEIAbwByAGQAYQBzACAAUAAuADsAIABCAHIAZQBnAGUAbwBuACAASgAuADsAIABCAHIAdQBuACAARgAuADsAIABCAHIAdQBuACAAUAAuADsAIABCAHIAeQBhAG4AIABNAC4AOwAgAEIAdQBlAGMAaABlAGwAZQAgAE0ALgA7ACAAQgB1AGwAaQBrACAAVAAuADsAIABCAHkAbAB1AG4AZAAgAFQALgA7ACAAQwBhAHAAYQBzAHMAbwAgAE0ALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAbgBkACAAVAAuADsAIABDAGgAYQBuAGQAcgBhACAAUwAuADsAIABDAGgAYQB2AGUAcwAgAFIALgBDAC4ARwAuADsAIABDAGgAZQBuACAAQQAuADsAIABDAG8AbABhAGYAcgBhAG4AYwBlAHMAYwBvACAAUwAuADsAIABDAG8AbgBkAG8AbgAgAEIALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAaQBsACAAQwAuADsAIABEAGUAdgBpAG4AIABKAC4AOwAgAGQAZQBXAGkAbAB0ACAAUAAuADsAIABEAGkAcgBzAG8AbgAgAEwALgA7ACAARABqAGEAbgBuAGEAdABpAC0AQQB0AGEAaQAgAEEALgA7ACAARABtAHkAdAByAGkAaQBlAHYAIABBAC4AOwAgAEQAbwBuAGEAdABoACAAQQAuADsAIABEAG8AcgBvAHMAaABlAG4AawBvACAAVgAuADsAIABEAHIAdQByAHkAIABMAC4ATwAnAEMALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAaQBhAHMAcwBvAG4AIABBAC4AOwAgAEYAbwBuAHQAYQBpAG4AZQAgAEcALgA7ACAARgB1AG4AawAgAFMALgA7ACAARgB1AGUAcwBzAGwAaQBuAGcAIABNAC4AOwAgAEcAYQBiAGkAYwBpACAAUwAuADsAIABHAGEAbABsAGEAbgB0ACAAWQAuAEEALgA7ACAARwBhAHQAZQAgAEYALgA7ACAARwBpAGEAdgBpAHQAdABvACAARwAuADsAIABHAGwAYQB3AGkAbwBuACAARAAuADsAIABHAGwAaQBjAGUAbgBzAHQAZQBpAG4AIABKAC4ARgAuADsAIABHAG8AdAB0AHMAYwBoAGEAbABsACAARAAuADsAIABHAHIAbwBuAGQAaQBuACAATQAuAC0ASAAuADsAIABIAGEAaABuACAASgAuADsAIABIAGEAdQBwAHQAIABNAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASAB1AGIAZQByACAARAAuADsAIABJAHcAYQBzAGEAawBpACAASAAuADsAIABKAGEAYwBoAG8AbABrAG8AdwBzAGsAYQAgAEEALgA7ACAASgBhAG0AcgBvAHoAeQAgAE0ALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABEAC4AOwAgAEoAYQBuAGsAbwB3AHMAawB5ACAARgAuADsAIABKAG8AdQB2AGkAbgAgAEwALgA7ACAASgB1AG4AZwAtAFIAaQBjAGgAYQByAGQAdAAgAEkALgA7ACAASwBhAHMAdABlAG4AZABpAGUAYwBrACAATQAuAEEALgA7ACAASwBhAHQAYQByAHoAeQBuAHMAawBpACAASwAuADsAIABLAGEAdABzAHUAcgBhAGcAYQB3AGEAIABNAC4AOwAgAEsAYQB0AHoAIABVAC4AOwAgAEsAZQByAHMAegBiAGUAcgBnACAARAAuADsAIABLAGgAYQBuAGcAdQBsAHkAYQBuACAARAAuADsAIABLAGgAZQBsAGkAZgBpACAAQgAuADsAIABLAGkAbgBnACAASgAuADsAIABLAGwAZQBwAHMAZQByACAAUwAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAdQBzACAATQAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHAAZQB6AC0AQwBvAHQAbwAgAFIALgA7ACAATAB5AHAAbwB2AGEAIABJAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYQBuAGQAbwBuACAAVgAuADsAIABNAGEAcgBjAG8AdwBpAHQAaAAgAEEALgA7ACAATQBhAHIAaQBhAHUAZAAgAEMALgA7ACAATQBhAHIAdABpAC0ARABlAHYAZQBzAGEAIABHAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGkAdABjAGgAZQBsAGwAIABBAC4ATQAuAFcALgA7ACAATQBvAGQAZQByAHMAawBpACAAUgAuADsAIABNAG8AaABhAG0AZQBkACAATQAuADsAIABNAG8AaAByAG0AYQBuAG4AIABMAC4AOwAgAE0AbwBvAHIAZQAgAEMALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAG4AdABlAHIAIABNAC4AOwAgAFAAYQByAHMAbwBuAHMAIABSAC4ARAAuADsAIABQAGUAcgBlAG4AbgBlAHMAIABDAC4AOwAgAFAAZQB0AHIAdQBjAGMAaQAgAFAALgAtAE8ALgA7ACAAUABlAHkAYQB1AGQAIABCAC4AOwAgAFAAaQBlAGwAIABRAC4AOwAgAFAAaQB0AGEAIABTAC4AOwAgAFAAbwBpAHIAZQBhAHUAIABWAC4AOwAgAFAAcgBpAHkAYQBuAGEAIABOAG8AZQBsACAAQQAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgBBAC4AOwAgAFAAcgBvAGsAbwBwAGgAIABIAC4AOwAgAFAAdQBlAGgAbABoAG8AZgBlAHIAIABHAC4AOwAgAFAAdQBuAGMAaAAgAE0ALgA7ACAAUQB1AGkAcgByAGUAbgBiAGEAYwBoACAAQQAuADsAIABSAGEAYQBiACAAUwAuADsAIABSAGEAdQB0AGgAIABSAC4AOwAgAFIAZQBpAG0AZQByACAAQQAuADsAIABSAGUAaQBtAGUAcgAgAE8ALgA7ACAAUgBlAG4AYQB1AGQAIABNAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBpAHoALQBWAGUAbABhAHMAYwBvACAARQAuADsAIABTAGEAaABhAGsAaQBhAG4AIABWAC4AOwAgAFMAYQBpAHQAbwAgAFMALgA7ACAAUwBhAG4AYwBoAGUAegAgAEQALgBBAC4AOwAgAFMAYQBuAHQAYQBuAGcAZQBsAG8AIABBAC4AOwAgAFMAYQBzAGEAawBpACAATQAuADsAIABTAGMAaABsAGkAYwBrAGUAaQBzAGUAcgAgAFIALgA7ACAAUwBjAGgAdQBlAHMAcwBsAGUAcgAgAEYALgA7ACAAUwBjAGgAdQBsAHoAIABBAC4AOwAgAFMAYwBoAHUAdAB0AGUAIABIAC4AOwAgAFMAYwBoAHcAYQBuAGsAZQAgAFUALgA7ACAAUwBjAGgAdwBlAG0AbQBlAHIAIABTAC4AOwAgAFMAZQBnAGwAYQByAC0AQQByAHIAbwB5AG8AIABNAC4AOwAgAFMAZQBuAG4AaQBhAHAAcABhAG4AIABNAC4AOwAgAFMAZQB5AGYAZgBlAHIAdAAgAEEALgBTAC4AOwAgAFMAaABhAGYAaQAgAE4ALgA7ACAAUwBoAGkAbABvAG4AIABJAC4AOwAgAFMAaABpAG4AaQBuAGcAYQB5AGEAbQB3AGUAIABLAC4AOwAgAFMAaQBtAG8AbgBpACAAUgAuADsAIABTAGkAbgBoAGEAIABBAC4AOwAgAFMAbwBsACAASAAuADsAIABTAHAAZQBjAG8AdgBpAHUAcwAgAEEALgA7ACAAUwBwAGkAcgAtAEoAYQBjAG8AYgAgAE0ALgA7ACAAUwB0AGEAdwBhAHIAegAgAEwALgA7ACAAUwB0AGUAZQBuAGsAYQBtAHAAIABSAC4AOwAgAFMAdABlAGcAbQBhAG4AbgAgAEMALgA7ACAAUwB0AGUAcABwAGEAIABDAC4AOwAgAFQAYQBrAGEAaABhAHMAaABpACAAVAAuADsAIABUAGEAdgBlAHIAbgBlAHQAIABKAC4ALQBQAC4AOwAgAFQAYQB2AGUAcgBuAGkAZQByACAAVAAuADsAIABUAGEAeQBsAG8AcgAgAEEALgBNAC4AOwAgAFQAZQByAHIAaQBlAHIAIABSAC4AOwAgAFQAaQBiAGEAbABkAG8AIABMAC4AOwAgAFQAaQB6AGkAYQBuAGkAIABEAC4AOwAgAFQAbAB1AGMAegB5AGsAbwBuAHQAIABNAC4AOwAgAFQAcgBpAGMAaABhAHIAZAAgAEMALgA7ACAAVABzAGkAcgBvAHUAIABNAC4AOwAgAFQAcwB1AGoAaQAgAE4ALgA7ACAAVAB1AGYAZgBzACAAUgAuADsAIABVAGMAaABpAHkAYQBtAGEAIABZAC4AOwAgAHYAYQBuACAAZABlAHIAIABXAGEAbAB0ACAARAAuAEoALgA7ACAAdgBhAG4AIABFAGwAZABpAGsAIABDAC4AOwAgAHYAYQBuACAAUgBlAG4AcwBiAHUAcgBnACAAQwAuADsAIAB2AGEAbgAgAFMAbwBlAGwAZQBuACAAQgAuADsAIABWAGEAcwBpAGwAZQBpAGEAZABpAHMAIABHAC4AOwAgAFYAZQBoACAASgAuADsAIABWAGUAbgB0AGUAcgAgAEMALgA7ACAAVgBpAG4AYwBlAG4AdAAgAFAALgA7ACAAVgBpAG4AawAgAEoALgA7ACAAVgBvAGkAcwBpAG4AIABGAC4AOwAgAFYAbwBlAGwAawAgAEgALgBKAC4AOwAgAFYAdQBpAGwAbABhAHUAbQBlACAAVAAuADsAIABXAGEAZABpAGEAcwBpAG4AZwBoACAAWgAuADsAIABXAGEAZwBuAGUAcgAgAFMALgBKAC4AOwAgAFcAYQBnAG4AZQByACAAUgAuAE0ALgA7ACAAVwBoAGkAdABlACAAUgAuADsAIABXAGkAZQByAHoAYwBoAG8AbABzAGsAYQAgAEEALgA7ACAAWQBhAG4AZwAgAFIALgA7ACAAWQBvAG4AZQBkAGEAIABIAC4AOwAgAFoAYQBiAG8AcgBvAHYAIABEAC4AOwAgAFoAYQBjAGgAYQByAGkAYQBzACAATQAuADsAIABaAGEAbgBpAG4AIABSAC4AOwAgAFoAZAB6AGkAYQByAHMAawBpACAAQQAuAEEALgA7ACAAWgBlAGMAaAAgAEEALgA7ACAAWgBlAGYAaQAgAEYALgA7ACAAWgBpAGUAZwBsAGUAcgAgAEEALgA7ACAAWgBvAHIAbgAgAEoALgA7ACAAWgB5AHcAdQBjAGsAYQAgAE4ALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADkAQQAmAEEALgAuAC4ANgAyADEAQQAuADEAMQA2AEh/wAAAAAAAD3JhZGlvI2dhbW1hLXJheQAAAWlodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2JveGZpdHM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MjEvQTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjIxL0ExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2xpc3Q/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZAAAAB9pdm86Ly9jZHMudml6aWVyL2ovYSthLzYyNi9hMTA0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADkovQStBLzYyNi9BMTA0AAAAGQBMAE8AVABBAEEAUwAgAHAAdQBsAHMAYQByACAAZABpAHMAYwBvAHYAZQByAGkAZQBzAAAACHJlc2VhcmNoAAAG1wBXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQBuACAAbwB2AGUAcgB2AGkAZQB3ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABUAGkAZQBkAC0AQQByAHIAYQB5ACAAQQBsAGwALQBTAGsAeQAgAFMAdQByAHYAZQB5ACAAKABMAE8AVABBAEEAUwApACAAZgBvAHIAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgBzACAAYQBuAGQAIABmAGEAcwB0ACAAdAByAGEAbgBzAGkAZQBuAHQAcwAuACAAVABoAGUAIABzAHUAcgB2AGUAeQAgAHUAcwBlAHMAIAB0AGgAZQAgAGgAaQBnAGgALQBiAGEAbgBkACAAYQBuAHQAZQBuAG4AYQBzACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABTAHUAcABlAHIAdABlAHIAcAAsACAAdABoAGUAIABkAGUAbgBzAGUAIABpAG4AbgBlAHIAIABwAGEAcgB0ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABjAG8AcgBlACwAIAB0AG8AIABzAHUAcgB2AGUAeQAgAHQAaABlACAAbgBvAHIAdABoAGUAcgBuACAAcwBrAHkAIAAoAHsAZABlAGwAdABhAH0APgAwAHsAZABlAGcAfQApACAAYQB0ACAAYQAgAGMAZQBuAHQAcgBhAGwAIABvAGIAcwBlAHIAdgBpAG4AZwAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAbwBmACAAMQAzADUATQBIAHoALgAgAEEAIAB0AG8AdABhAGwAIABvAGYAIAAyADEAOQAgAHQAaQBlAGQALQBhAHIAcgBhAHkAIABiAGUAYQBtAHMAIAAoAGMAbwBoAGUAcgBlAG4AdAAgAHMAdQBtAG0AYQB0AGkAbwBuACAAbwBmACAAcwB0AGEAdABpAG8AbgAgAHMAaQBnAG4AYQBsAHMALAAgAGMAbwB2AGUAcgBpAG4AZwAgADEAMgAgAHMAcQB1AGEAcgBlACAAZABlAGcAcgBlAGUAcwApACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAdABoAHIAZQBlACAAaQBuAGMAbwBoAGUAcgBlAG4AdAAgAGIAZQBhAG0AcwAgACgAYwBvAHYAZQByAGkAbgBnACAANgA3ACAAcwBxAHUAYQByAGUAIABkAGUAZwByAGUAZQBzACkAIABhAHIAZQAgAGYAbwByAG0AZQBkACAAaQBuACAAZQBhAGMAaAAgAHMAdQByAHYAZQB5ACAAcABvAGkAbgB0AGkAbgBnAC4AIABGAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgADIAMgAyACAAYgBlAGEAbQBzACwAIAB0AG8AdABhAGwAIABpAG4AdABlAG4AcwBpAHQAeQAgAGkAcwAgAHIAZQBjAG8AcgBkAGUAZAAgAGEAdAAgADQAOQAxAC4ANQAyACAAewBtAHUAfQBzACAAdABpAG0AZQAgAHIAZQBzAG8AbAB1AHQAaQBvAG4ALgAgAEUAYQBjAGgAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AIABpAG4AdABlAGcAcgBhAHQAZQBzACAAZgBvAHIAIAAxAGgAcgAgAGEAbgBkACAAYwBvAHYAZQByAHMAIAAyADUAOQAyACAAYwBoAGEAbgBuAGUAbABzACAAZgByAG8AbQAgADEAMQA5ACAAdABvACAAMQA1ADEATQBIAHoALgAgAFQAaABpAHMAIABpAG4AcwB0AHIAdQBtAGUAbgB0AGEAbAAgAHMAZQB0AHUAcAAgAGEAbABsAG8AdwBzACAATABPAFQAQQBBAFMAIAB0AG8AIAByAGUAYQBjAGgAIABhACAAZABlAHQAZQBjAHQAaQBvAG4AIAB0AGgAcgBlAHMAaABvAGwAZAAgAG8AZgAgADEALQA1AG0ASgB5ACAAZgBvAHIAIABwAGUAcgBpAG8AZABpAGMAIABlAG0AaQBzAHMAaQBvAG4ALgAgAFQAaAB1AHMAIABmAGEAcgAsACAAdABoAGUAIABMAE8AVABBAEEAUwAgAHMAdQByAHYAZQB5ACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGQAaQBzAGMAbwB2AGUAcgB5ACAAbwBmACAANwAzACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAuACAAQQBtAG8AbgBnACAAdABoAGUAcwBlACAAYQByAGUAIAB0AHcAbwAgAG0AaQBsAGQAbAB5ACAAcgBlAGMAeQBjAGwAZQBkACAAYgBpAG4AYQByAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABQAD0AMQAzACAAYQBuAGQAIAAzADMAbQBzACkALAAgAGEAcwAgAHcAZQBsAGwAIABhAHMAIAB0AGgAZQAgAHMAbABvAHcAZQBzAHQALQBzAHAAaQBuAG4AaQBuAGcAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgAgAGMAdQByAHIAZQBuAHQAbAB5ACAAawBuAG8AdwBuACAAKABQAD0AMgAzAC4ANQBzACkALgAgAFQAaABlACAAcwB1AHIAdgBlAHkAIABoAGEAcwAgAHQAaAB1AHMAIABmAGEAcgAgAGQAZQB0AGUAYwB0AGUAZAAgADMAMQAxACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAdwBpAHQAaAAgAHMAcABpAG4AIABwAGUAcgBpAG8AZABzACAAcgBhAG4AZwBpAG4AZwAgAGYAcgBvAG0AIAA0AG0AcwAgAHQAbwAgADUALgAwAHMAIABhAG4AZAAgAGQAaQBzAHAAZQByAHMAaQBvAG4AIABtAGUAYQBzAHUAcgBlAHMAIABmAHIAbwBtACAAMwAuADAAIAB0AG8AIAAyADEANwBwAGMALwBjAG0AXgAzAF4ALgAgAEsAbgBvAHcAbgAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAZQB0AGUAYwB0AGUAZAAgAGEAdAAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAbABpAHQAZQByAGEAdAB1AHIAZQAgAHYAYQBsAHUAZQBzAC4AIABXAGUAIABmAGkAbgBkACAAdABoAGEAdAAgAHQAaABlACAATABPAFQAQQBBAFMAIABwAHUAbABzAGEAcgAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGgAYQB2AGUALAAgAG8AbgAgAGEAdgBlAHIAYQBnAGUALAAgAGwAbwBuAGcAZQByACAAcwBwAGkAbgAgAHAAZQByAGkAbwBkAHMAIAB0AGgAYQBuACAAdABoAGUAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgAgAHAAbwBwAHUAbABhAHQAaQBvAG4ALgAgAFQAaABpAHMAIABtAGEAeQAgAHIAZQBmAGwAZQBjAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHMAZQBsAGUAYwB0AGkAbwBuACAAYgBpAGEAcwBlAHMAIABiAGUAdAB3AGUAZQBuACAATABPAFQAQQBBAFMAIABhAG4AZAAgAHAAcgBlAHYAaQBvAHUAcwAgAHMAdQByAHYAZQB5AHMALAAgAHQAaABvAHUAZwBoACAAaQB0ACAAaQBzACAAYQBsAHMAbwAgAHAAbwBzAHMAaQBiAGwAZQAgAHQAaABhAHQAIABzAGwAbwB3AGUAcgAtAHMAcABpAG4AbgBpAG4AZwAgAHAAdQBsAHMAYQByAHMAIABwAHIAZQBmAGUAcgBlAG4AdABpAGEAbABsAHkAIABoAGEAdgBlACAAcwB0AGUAZQBwAGUAcgAgAHIAYQBkAGkAbwAgAHMAcABlAGMAdAByAGEALgAgAEwATwBUAEEAQQBTACAAaQBzACAAdABoAGUAIABkAGUAZQBwAGUAcwB0ACAAYQBsAGwALQBzAGsAeQAgAHAAdQBsAHMAYQByACAAcwB1AHIAdgBlAHkAIAB1AHMAaQBuAGcAIABhACAAZABpAGcAaQB0AGEAbAAgAGEAcABlAHIAdAB1AHIAZQAgAGEAcgByAGEAeQA7ACAAdwBlACAAZABpAHMAYwB1AHMAcwAgAHMAbwBtAGUAIABvAGYAIAB0AGgAZQAgAGwAZQBzAHMAbwBuAHMAIABsAGUAYQByAG4AZQBkACAAdABoAGEAdAAgAGMAYQBuACAAaQBuAGYAbwByAG0AIAB0AGgAZQAgAGEAcABwAHIAbwBhAGMAaAAgAGYAbwByACAAcwBpAG0AaQBsAGEAcgAgAHMAdQByAHYAZQB5AHMAIAB1AHMAaQBuAGcAIABmAHUAdAB1AHIAZQAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABzAHUAYwBoACAAYQBzACAAdABoAGUAIABTAHEAdQBhAHIAZQAgAEsAaQBsAG8AbQBlAHQAcgBlACAAQQByAHIAYQB5AC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYyNi9BMTA0AAABMgBTAGEAbgBpAGQAYQBzACAAUwAuADsAIABDAG8AbwBwAGUAcgAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABLAG8AbgBkAHIAYQB0AGkAZQB2ACAAVgAuAEkALgA7ACAATQBpAGMAaABpAGwAbABpACAARAAuADsAIABTAHQAYQBwAHAAZQByAHMAIABCAC4AVwAuADsAIABUAGEAbgAgAEMALgBNAC4AOwAgAFYAYQBuACAATABlAGUAdQB3AGUAbgAgAEoALgA7ACAAQwBlAHIAcgBpAGcAbwBuAGUAIABMAC4AOwAgAEYAYQBsAGwAbwB3AHMAIABSAC4AQQAuADsAIABJAGEAYwBvAGIAZQBsAGwAaQAgAE0ALgA7ACAATwByAHIAdQAgAEUALgA7ACAAUABpAHoAegBvACAAUgAuAEYALgA7ACAAUwBoAHUAbABlAHYAcwBrAGkAIABBAC4AOwAgAFQAbwByAGkAYgBpAG8AIABNAC4AQwAuADsAIABUAGUAcgAgAFYAZQBlAG4AIABTAC4AOwAgAFoAdQBjAGMAYQAgAFAALgA7ACAAQgBvAG4AZABvAG4AbgBlAGEAdQAgAEwALgA7ACAARwByAGkAZQBzAHMAbQBlAGkAZQByACAASgAuAC0ATQAuADsAIABLAGEAcgBhAHMAdABlAHIAZwBpAG8AdQAgAEEALgA7ACAASwByAGEAbQBlAHIAIABNAC4AOwAgAFMAbwBiAGUAeQAgAEMALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADkAQQAmAEEALgAuAC4ANgAyADYAQQAuADEAMAA0AFN/wAAAAAAABXJhZGlvAAABa2h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjI2L0ExMDQvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BK0EvNjI2L0ExMDQ6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYyNi9BMTA0Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MjYvQTEwNC90YWJsZWExPwAAAJBpdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAAB5dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAAEVzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAeaXZvOi8vY2RzLnZpemllci9qL2FqLzEzMC8yNjEzAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADUovQUovMTMwLzI2MTMAAAAnAFQAaABlACAAQQByAGUAYwBpAGIAbwAgAEwAZQBnAGEAYwB5ACAARgBhAHMAdAAgAEEATABGAEEAIABzAHUAcgB2AGUAeQAuACAASQBJAAAACHJlc2VhcmNoAAADjwBJAG4AIABwAHIAZQBwAGEAcgBhAHQAaQBvAG4AIABmAG8AcgAgAHQAaABlACAAZgB1AGwAbAAgAEEAcgBlAGMAaQBiAG8AIABMAGUAZwBhAGMAeQAgAEYAYQBzAHQAIABBAEwARgBBACAAKABBAEwARgBBAEwARgBBACkAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAASABJACAAcwB1AHIAdgBlAHkALAAgAHAAcgBlAGMAdQByAHMAbwByACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMAIAB3AGUAcgBlACAAYwBhAHIAcgBpAGUAZAAgAG8AdQB0ACAAaQBuACAAMgAwADAANAAgAEEAdQBnAHUAcwB0AC0AUwBlAHAAdABlAG0AYgBlAHIAIAB3AGkAdABoACAAdABoAGUAIABzAGUAdgBlAG4ALQBiAGUAYQBtACAAQQByAGUAYwBpAGIAbwAgAEwALQBiAGEAbgBkACAARgBlAGUAZAAgAEEAcgByAGEAeQAgACgAQQBMAEYAQQApACAAcgBlAGMAZQBpAHYAZQByACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAVwBpAGQAZQBiAGEAbgBkACAAQQByAGUAYwBpAGIAbwAgAFAAdQBsAHMAYQByACAAUAByAG8AYwBlAHMAcwBvAHIAIABzAHAAZQBjAHQAcgBhAGwAIABwAHIAbwBjAGUAcwBzAG8AcgBzAC4AIABXAGgAaQBsAGUAIAB0AGgAZQBzAGUAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAHcAZQByAGUAIABnAGUAYQByAGUAZAAgAG0AYQBpAG4AbAB5ACAAYQB0ACAAdABlAHMAdABpAG4AZwAgAGEAbgBkACAAZABlAGIAdQBnAGcAaQBuAGcAIABzAHUAcgB2AGUAeQAgAHMAdAByAGEAdABlAGcAeQAsACAAaABhAHIAZAB3AGEAcgBlACwAIABhAG4AZAAgAHMAbwBmAHQAdwBhAHIAZQAsACAAYQBwAHAAcgBvAHgAaQBtAGEAdABlAGwAeQAgADQAOABoAHIAIABvAGYAIAB0AGUAbABlAHMAYwBvAHAAZQAgAHQAaQBtAGUAIAB5AGkAZQBsAGQAZQBkACAAcwBjAGkAZQBuAGMAZQAtAHEAdQBhAGwAaQB0AHkAIABkAGEAdABhAC4AIABUAG8AIAB0AGUAcwB0ACAAbwB1AHIAIABhAGIAaQBsAGkAdAB5ACAAdABvACAAZABpAHMAYwByAGkAbQBpAG4AYQB0AGUAIABjAG8AcwBtAGkAYwAgAHMAaQBnAG4AYQBsAHMAIABmAHIAbwBtACAAcgBhAGQAaQBvAC0AZgByAGUAcQB1AGUAbgBjAHkAIABpAG4AdABlAHIAZgBlAHIAZQBuAGMAZQAgAGEAbgBkACAAbgBvAGkAcwBlACwAIAAxADYANQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIAByAGEAbgBnAGkAbgBnACAAaQBuACAAcgBlAGwAaQBhAGIAaQBsAGkAdAB5ACAAbABpAGsAZQBsAGkAaABvAG8AZAAgAHcAZQByAGUAIAByAGUAbwBiAHMAZQByAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBpAG4AZwBsAGUALQBiAGUAYQBtACAATAAtAGIAYQBuAGQAIAB3AGkAZABlACAAcwB5AHMAdABlAG0AIABhAHQAIABBAHIAZQBjAGkAYgBvACAAaQBuACAAMgAwADAANQAgAEoAYQBuAHUAYQByAHkALQBGAGUAYgByAHUAYQByAHkALgAgAE8AZgAgAHQAaABvAHMAZQAsACAANAAxACUAIAB3AGUAcgBlACAAYwBvAG4AZgBpAHIAbQBlAGQAIABhAHMAIAByAGUAYQBsAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAdABoAGUAIAByAGUAcwB1AGwAdABzACAAbwBmACAAYgBvAHQAaAAgAHQAaABlACAAQQBMAEYAQQAgAGEAbgBkACAAdABoAGUAIABzAGkAbgBnAGwAZQAtAGIAZQBhAG0AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABzAGEAbQBwAGwAZQAgAG8AZgAgADEANgA2ACAAYwBvAG4AZgBpAHIAbQBlAGQAIABIAEkAIABzAG8AdQByAGMAZQBzACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAbwB1AHIAIABhAHMAcwBlAHMAcwBtAGUAbgB0ACAAbwBmACAAdABoAGUAaQByACAAbwBwAHQAaQBjAGEAbAAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzAC4AAAAyaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQUovMTMwLzI2MTMAAAEWAEcAaQBvAHYAYQBuAGUAbABsAGkAIABSAC4AOwAgAEgAYQB5AG4AZQBzACAATQAuAFAALgA7ACAASwBlAG4AdAAgAEIALgBSAC4AOwAgAFAAZQByAGkAbABsAGEAdAAgAFAALgA7ACAAQwBhAHQAaQBuAGUAbABsAGEAIABCAC4AOwAgAEgAbwBmAGYAbQBhAG4AIABHAC4ATAAuADsAIABNAG8AbQBqAGkAYQBuACAARQAuADsAIABSAG8AcwBlAG4AYgBlAHIAZwAgAEoALgBMAC4AOwAgAFMAYQBpAG4AdABvAG4AZwBlACAAQQAuADsAIABTAHAAZQBrAGsAZQBuAHMAIABLAC4AOwAgAFMAdABpAGUAcgB3AGEAbAB0ACAAUwAuADsAIABCAHIAbwBzAGMAaAAgAE4ALgA7ACAATQBhAHMAdABlAHIAcwAgAEsALgBMAC4AOwAgAFMAcAByAGkAbgBnAG8AYgAgAEMALgBNAC4AOwAgAEsAYQByAGEAYwBoAGUAbgB0AHMAZQB2ACAASQAuAEQALgA7ACAASwBhAHIAYQBjAGgAZQBuAHQAcwBlAHYAYQAgAFYALgBFAC4AOwAgAEsAbwBvAHAAbQBhAG4AbgAgAFIALgBBAC4AOwAgAE0AdQBsAGwAZQByACAARQAuADsAIAB2AGEAbgAgAEQAcgBpAGUAbAAgAFcALgA7ACAAdgBhAG4AIABaAGUAZQAgAEwALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAwADUAQQBKAC4ALgAuAC4AMQAzADAALgAyADYAMQAzAEd/wAAAAAAABXJhZGlvAAAC12h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BSi8xMzAvMjYxMzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy9kYXRhPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy90YWJsZTM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQUovMTMwLzI2MTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL2RhdGE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL3RhYmxlMz8AAAEvOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1o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TABNACAAcwB1AHIAdgBlAHkALgAgAFYALgAgAFcAaABpAHQAZQAgAGQAdwBhAHIAZgAgAGIAaQBuAGEAcgBpAGUAcwAAAAhyZXNlYXJjaAAAA4wAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAZABpAHMAYwBvAHYAZQByAHkAIABvAGYAIAAxADcAIABsAG8AdwAtAG0AYQBzAHMAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYAcwAgACgAVwBEAHMAKQAgAGkAbgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkACAAKABQADwAPQAxACAAZABhAHkAKQAgAGIAaQBuAGEAcgBpAGUAcwAuACAATwB1AHIAIABzAGEAbQBwAGwAZQAgAGkAbgBjAGwAdQBkAGUAcwAgAGYAbwB1AHIAIABvAGIAagBlAGMAdABzACAAdwBpAHQAaAAgAHIAZQBtAGEAcgBrAGEAYgBsAGUAIABsAG8AZwBnAD0AfgA1ACAAcwB1AHIAZgBhAGMAZQAgAGcAcgBhAHYAaQB0AGkAZQBzACAAYQBuAGQAIABvAHIAYgBpAHQAYQBsACAAcwBvAGwAdQB0AGkAbwBuAHMAIAB0AGgAYQB0ACAAcgBlAHEAdQBpAHIAZQAgAHQAaABlAG0AIAB0AG8AIABiAGUAIABkAG8AdQBiAGwAZQAgAGQAZQBnAGUAbgBlAHIAYQB0AGUAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbABsACAAbwBmACAAdABoAGUAIABsAG8AdwBlAHMAdAAgAHMAdQByAGYAYQBjAGUAIABnAHIAYQB2AGkAdAB5ACAAVwBEAHMAIABoAGEAdgBlACAAbQBlAHQAYQBsACAAbABpAG4AZQBzACAAaQBuACAAdABoAGUAaQByACAAcwBwAGUAYwB0AHIAYQAgAGkAbQBwAGwAeQBpAG4AZwAgAGwAbwBuAGcAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAcwBlAHQAdABsAGkAbgBnACAAdABpAG0AZQBzACAAbwByACAAbwBuAGcAbwBpAG4AZwAgAGEAYwBjAHIAZQB0AGkAbwBuAC4AIABOAG8AdABhAGIAbAB5ACwAIABzAGkAeAAgAG8AZgAgAHQAaABlACAAVwBEAHMAIABpAG4AIABvAHUAcgAgAHMAYQBtAHAAbABlACAAaABhAHYAZQAgAGIAaQBuAGEAcgB5ACAAbQBlAHIAZwBlAHIAIAB0AGkAbQBlAHMAIAA8ADEAMABHAHkAcgAuACAARgBvAHUAcgAgAGgAYQB2AGUAIAA+AH4AMAAuADkATQBfAHsAcwB1AG4AfQBfACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAASQBmACAAdABoAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAYQByAGUAIABtAGEAcwBzAGkAdgBlACAAVwBEAHMALAAgAHQAaABlAHMAZQAgAGYAbwB1AHIAIABiAGkAbgBhAHIAaQBlAHMAIAB3AGkAbABsACAAZQB2AG8AbAB2AGUAIABpAG4AdABvACAAcwB0AGEAYgBsAGUAIABtAGEAcwBzACAAdAByAGEAbgBzAGYAZQByACAAQQBNACAAQwBWAG4AIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAG8AcwBzAGkAYgBsAHkAIABlAHgAcABsAG8AZABlACAAYQBzACAAdQBuAGQAZQByAGwAdQBtAGkAbgBvAHUAcwAgAHMAdQBwAGUAcgBuAG8AdgBhAGUALgAgAEkAZgAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAgAGEAcgBlACAAbgBlAHUAdAByAG8AbgAgAHMAdABhAHIAcwAsACAAdABoAGUAbgAgAHQAaABlAHMAZQAgAG0AYQB5ACAAYgBlACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAIABiAGkAbgBhAHIAaQBlAHMALgAgAFQAaABlAHMAZQAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGkAbgBjAHIAZQBhAHMAZQAgAHQAaABlACAAbgB1AG0AYgBlAHIAIABvAGYAIABkAGUAdABhAGMAaABlAGQALAAgAGQAbwB1AGIAbABlACAAZABlAGcAZQBuAGUAcgBhAHQAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGkAbgAgAHQAaABlACAARQB4AHQAcgBlAG0AZQBsAHkAIABsAG8AdwAgAG0AYQBzAHMAIAAoAEUATABNACkAIABTAHUAcgB2AGUAeQAgAHQAbwAgADUANAA7ACAAMwAxACAAbwBmACAAdABoAGUAcwBlACAAYgBpAG4AYQByAGkAZQBzACAAdwBpAGwAbAAgAG0AZQByAGcAZQAgAHcAaQB0AGgAaQBuACAAYQAgAEgAdQBiAGIAbABlACAAdABpAG0AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi83NjkvNjYAAABCAEIAcgBvAHcAbgAgAFcALgBSAC4AOwAgAEsAaQBsAGkAYwAgAE0ALgA7ACAAQQBsAGwAZQBuAGQAZQAgAFAAcgBpAGUAdABvACAAQwAuADsAIABHAGkAYQBuAG4AaQBuAGEAcwAgAEEALgA7ACAASwBlAG4AeQBvAG4AIABTAC4ASgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADEAMwBBAHAASgAuAC4ALgA3ADYAOQAuAC4ALgA2ADYAQn/AAAAAAAAHb3B0aWNhbAAAARJodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzc2OS82Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BcEovNzY5LzY2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi83NjkvNjYvd2RiaW4/AAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAeaXZvOi8vY2RzLnZpemllci9qL2Fwai84NjEvMTEzAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADUovQXBKLzg2MS8xMTMAAAAsAFYATABCAEEAIABhAHMAdAByAG8AbQBlAHQAcgB5ACAAYwBvAG0AYgBpAG4AZQBkACAAdwBpAHQAaAAgAEcAYQBpAGEAIABEAFIAMQAgAGUAcABvAGMAaAAAAAhyZXNlYXJjaAAABXUAVABoAGUAIABjAGEAbgBvAG4AaQBjAGEAbAAgAG0AZQB0AGgAbwBkAHMAIABmAG8AcgAgAGcAcgBhAHYAaQB0AGEAdABpAG8AbgBhAGwAIAB3AGEAdgBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAHIAZQAgAGcAcgBvAHUAbgBkAC0AIABhAG4AZAAgAHMAcABhAGMAZQAtACAAYgBhAHMAZQBkACAAbABhAHMAZQByACAAaQBuAHQAZQByAGYAZQByAG8AbQBlAHQAcgB5ACwAIABwAHUAbABzAGEAcgAgAHQAaQBtAGkAbgBnACwAIABhAG4AZAAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABjAG8AcwBtAGkAYwAgAG0AaQBjAHIAbwB3AGEAdgBlACAAYgBhAGMAawBnAHIAbwB1AG4AZAAuACAAQgB1AHQAIABhAHMAIABoAGEAcwAgAGIAZQBlAG4AIABzAHUAZwBnAGUAcwB0AGUAZAAgAGIAeQAgAG4AdQBtAGUAcgBvAHUAcwAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAbwByAHMALAAgAGEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAZgBlAHIAcwAgAGEAbgAgAGEAZABkAGkAdABpAG8AbgBhAGwAIABwAGEAdABoACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAuACAARwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAGQAZQBmAGwAZQBjAHQAIABsAGkAZwBoAHQAIAByAGEAeQBzACAAbwBmACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAG8AYgBqAGUAYwB0AHMALAAgAGMAcgBlAGEAdABpAG4AZwAgAGEAcABwAGEAcgBlAG4AdAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGkAbgAgAGEAIABxAHUAYQBkAHIAdQBwAG8AbABhAHIAIAAoAGEAbgBkACAAaABpAGcAaABlAHIALQBvAHIAZABlAHIAIABtAG8AZABlAHMAKQAgAHAAYQB0AHQAZQByAG4ALgAgAEEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcgBhAGQAaQBvACAAcwBvAHUAcgBjAGUAcwAgAGkAcwAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAHcAaQB0AGgAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABiAGUAdAB3AGUAZQBuACAAcgBvAHUAZwBoAGwAeQAgADEAMABeAC0AMQA4AF4AIABhAG4AZAAgADEAMABeAC0AOABeAEgAegAgACgASABfADAAXwAgAGEAbgBkACAAMQAvADMAeQByAF4ALQAxAF4AKQAsACAAbwB2AGUAcgBsAGEAcABwAGkAbgBnACAAYQBuAGQAIABiAHIAaQBkAGcAaQBuAGcAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdABpAG0AaQBuAGcAIABhAG4AZAAgAEMATQBCACAAcABvAGwAYQByAGkAegBhAHQAaQBvAG4AIAByAGUAZwBpAG0AZQBzAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQAgAG0AZQB0AGgAbwBkAG8AbABvAGcAeQAgAGYAbwByACAAYQBzAHQAcgBvAG0AZQB0AHIAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAgAGkAbgAgAHQAaABlACAAcAByAGUAcwBlAG4AYwBlACAAbwBmACAAbABhAHIAZwBlACAAaQBuAHQAcgBpAG4AcwBpAGMAIAB1AG4AYwBvAHIAcgBlAGwAYQB0AGUAZAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgACgAaQAuAGUALgAsACAAcgBhAGQAaQBvACAAagBlAHQAcwApAC4AIABXAGUAIABvAGIAdABhAGkAbgAgADkANQAlACAAYwBvAG4AZgBpAGQAZQBuAGMAZQAgAGwAaQBtAGkAdABzACAAbwBuACAAdABoAGUAIABzAHQAbwBjAGgAYQBzAHQAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABiAGEAYwBrAGcAcgBvAHUAbgBkACAAdQBzAGkAbgBnACAANwAxADEAIAByAGEAZABpAG8AIABzAG8AdQByAGMAZQBzACwAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADYANAAsACAAYQBuAGQAIAB1AHMAaQBuAGcAIAA1ADAAOAAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbQBiAGkAbgBlAGQAIAB3AGkAdABoACAAdABoAGUAIABmAGkAcgBzAHQAIABHAGEAaQBhACAAZABhAHQAYQAgAHIAZQBsAGUAYQBzAGUAOgAgAHsATwBtAGUAZwBhAH0AXwBHAFcAXwA8ADAALgAwADEAMQAuACAAVABoAGUAcwBlACAAbABpAG0AaQB0AHMAIABwAHIAbwBiAGUAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAdwBhAHYAZQAgAGYAcgBlAHEAdQBlAG4AYwBpAGUAcwAgADYAeAAxADAAXgAtADEAOABeAEgAegA8AH4AZgA8AH4AMQB4ADEAMABeAC0AOQBeAEgAegAuACAAVQBzAGkAbgBnACAAYQAgAFcASQBTAEUALQBHAGEAaQBhACAAYwBhAHQAYQBsAG8AZwAgAG8AZgAgADUANgA3ADcAMgAxACAAQQBHAE4ALAAgAHcAZQAgAHAAcgBlAGQAaQBjAHQAIABhACAAbABpAG0AaQB0ACAAZQB4AHAAZQBjAHQAZQBkACAAZgByAG8AbQAgAEcAYQBpAGEAIABhAGwAbwBuAGUAIABvAGYAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADAANgAsACAAdwBoAGkAYwBoACAAaQBzACAAcwBpAGcAbgBpAGYAaQBjAGEAbgB0AGwAeQAgAGgAaQBnAGgAZQByACAAdABo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AGcAaABsAGkAZwBoAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3ACAAZABpAHMAYwBvAHYAZQByAGkAZQBzACAAaQBzACAAUABTAFIAIABKADAANAAwADcAKwAxADYAMAA3ACwAIAB3AGgAaQBjAGgAIABoAGEAcwAgAGEAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAIABvAGYAIAAyADUALgA3AG0AcwAsACAAYQAgAGMAaABhAHIAYQBjAHQAZQByAGkAcwB0AGkAYwAgAGEAZwBlACAAbwBmACAAMQAuADUARwB5AHIAIABhAG4AZAAgAGkAcwAgAGkAbgAgAGEAIAAxAC4AOAAtAHkAcgAgAG8AcgBiAGkAdAAgAGEAYgBvAHUAdAAgAGEAIABsAG8AdwAtAG0AYQBzAHMAIAAoAD4AMAAuADIATQApACAAYwBvAG0AcABhAG4AaQBvAG4ALgAgAFQAaABlACAAbABvAG4AZwAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGEAbgBkACAAcwBtAGEAbABsACAAZQBjAGMAZQBuAHQAcgBpAGMAaQB0AHkAIAAoAGUAPQAwAC4AMAAwADAAOQApACAAbQBhAGsAZQAgAHQAaABlACAAYgBpAG4AYQByAHkAIABzAHkAcwB0AGUAbQAgAGEAbgAgAGkAbQBwAG8AcgB0AGEAbgB0ACAAbgBlAHcAIABhAGQAZABpAHQAaQBvAG4AIAB0AG8AIAB0AGgAZQAgAGUAbgBzAGUAbQBiAGwAZQAgAG8AZgAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBpAHQAYQBiAGwAZQAgAHQAbwAgAHQAZQBzAHQAIABmAG8AcgAgAHYAaQBvAGwAYQB0AGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAHMAdAByAG8AbgBnACAAZQBxAHUAaQB2AGEAbABlAG4AYwBlACAAcAByAGkAbgBjAGkAcABsAGUALgAgAFcAZQAgAGEAbABzAG8AIAByAGUAcABvAHIAdAAgAG8AbgAgAG8AdQByACAAaQBuAGkAdABpAGEAbABsAHkAIAB1AG4AcwB1AGMAYwBlAHMAcwBmAHUAbAAgAGEAdAB0AGUAbQBwAHQAcwAgAHQAbwAgAGQAZQB0AGUAYwB0ACAAbwBwAHQAaQBjAGEAbABsAHkAIAB0AGgAZQAgAGMAbwBtAHAAYQBuAGkAbwBuACAAdABvACAASgAwADQAMAA3ACsAMQA2ADAANwAsACAAdwBoAGkAYwBoACAAaQBtAHAAbAB5ACAAdABoAGEAdAAgAGkAdABzACAAYQBiAHMAbwBsAHUAdABlACAAdgBpAHMAdQBhAGwAIABtAGEAZwBuAGkAdAB1AGQAZQAgAGkAcwAgAD4AMQAyAC4AMQAuACAASQBmACwAIABhAHMAIABlAHgAcABlAGMAdABlAGQAIABvAG4AIABlAHYAbwBsAHUAdABpAG8AbgBhAHIAeQAgAGcAcgBvAHUAbgBkAHMALAAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AIABpAHMAIABhAG4AIABIAGUAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYALAAgAG8AdQByACAAbgBvAG4ALQBkAGUAdABlAGMAdABpAG8AbgAgAGkAbQBwAGwAaQBlAHMAIABhACAAYwBvAG8AbABpAG4AZwAgAGEAZwBlACAAbwBmACAAbABlAGEAcwB0ACAAMQBHAHkAcgAuAAAANWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL01OUkFTLzM1OS8xNTI0AAAAmQBMAG8AcgBpAG0AZQByACAARAAuAFIALgA7ACAAWABpAGwAbwB1AHIAaQBzACAASwAuAE0ALgA7ACAARgByAHUAYwBoAHQAZQByACAAQQAuAFMALgA7ACAAUwB0AGEAaQByAHMAIABJAC4ASAAuADsAIABDAGEAbQBpAGwAbwAgAEYALgA7ACAAVgBhAHoAcQB1AGUAegAgAEEALgBNAC4AOwAgAEUAZABlAHIAIABKAC4AQQAuADsAIABNAGMATABhAHUAZwBoAGwAaQBuACAATQAuAEEALgA7ACAAUgBvAGIAZQByAHQAcwAgAE0ALgBTAC4ARQAuADsAIABIAGUAcwBzAGUAbABzACAASgAuAFcALgBUAC4AOwAgAHIAYQBuAHMAbwBtACAAUwAuAE0ALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAwADUATQBOAFIAQQBTAC4AMwA1ADkALgAxADUAMgA0AEx/wAAAAAAABXJhZGlvAAABxWh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy8zNTkvMTUyNC90YWJsZTM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzM1OS8xNTI0L3RhYmxlNT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvMzU5LzE1MjQvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy8zNTkvMTUyNDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy8zNTkvMTUyNAAAALxpdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAAJR2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyAAAAV3N0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDI3LzEwNTIAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80MjcvMTA1MgAAACEASABUAFIAVQAgAHMAdQByAHYAZQB5AC4AIABUAGkAbQBpAG4AZwAgAG8AZgAgADUANAAgAHAAdQBsAHMAYQByAHMAAAAIcmVzZWFyY2gAAAR1AFcAZQAgAHAAcgBlAHMAZQBuAHQAIAA3ADUAIABwAHUAbABzAGEAcgBzACAAZABpAHMAYwBvAHYAZQByAGUAZAAgAGkAbgAgAHQAaABlACAAbQBpAGQALQBsAGEAdABpAHQAdQBkAGUAIABwAG8AcgB0AGkAbwBuACAAbwBmACAAdABoAGUAIABIAGkAZwBoACAAVABpAG0AZQAgAFIAZQBzAG8AbAB1AHQAaQBvAG4AIABVAG4AaQB2AGUAcgBzAGUAIABzAHUAcgB2AGUAeQAsACAANQA0ACAAbwBmACAAdwBoAGkAYwBoACAAaABhAHYAZQAgAGYAdQBsAGwAIAB0AGkAbQBpAG4AZwAgAHMAbwBsAHUAdABpAG8AbgBzAC4AIABBAGwAbAAgAHQAaABlACAAcAB1AGwAcwBhAHIAcwAgAGgAYQB2AGUAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAcwAgAGcAcgBlAGEAdABlAHIAIAB0AGgAYQBuACAAMQAwADAAbQBzACwAIABhAG4AZAAgAG4AbwBuAGUAIABvAGYAIAB0AGgAbwBzAGUAIAB3AGkAdABoACAAdABpAG0AaQBuAGcAIABzAG8AbAB1AHQAaQBvAG4AcwAgAGkAcwAgAGkAbgAgAGIAaQBuAGEAcgBpAGUAcwAuACAAVAB3AG8AIABkAGkAcwBwAGwAYQB5ACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIABpAG4AdABlAHIAZQBzAHQAaQBuAGcAIABiAGUAaABhAHYAaQBvAHUAcgA7ACAAUABTAFIAIABKADEAMAA1ADQALQA1ADkANAA0ACAAaQBzACAAZgBvAHUAbgBkACAAdABvACAAYgBlACAAYQBuACAAaQBuAHQAZQByAG0AaQB0AHQAZQBuAHQAIABwAHUAbABzAGEAcgAsACAAYQBuAGQAIABQAFMAUgAgAEoAMQA4ADAAOQAtADAAMQAxADkAIABoAGEAcwAgAGcAbABpAHQAYwBoAGUAZAAgAHQAdwBpAGMAZQAgAHMAaQBuAGMAZQAgAGkAdABzACAAZABpAHMAYwBvAHYAZQByAHkALgAgAEkAbgAgAHQAaABlACAAcwBlAGMAbwBuAGQAIABoAGEAbABmACAAbwBmACAAdABoAGUAIABwAGEAcABlAHIAIAB3AGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABhAG4AZAAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAgAG8AZgAgAGEAbgAgAGEAcgB0AGkAZgBpAGMAaQBhAGwAIABuAGUAdQByAGEAbAAgAG4AZQB0AHcAbwByAGsAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEALQBwAHIAbwBjAGUAcwBzAGkAbgBnACAAcABpAHAAZQBsAGkAbgBlACAAZgBvAHIAIAB0AGgAZQAgAHMAdQByAHYAZQB5AC4AIABXAGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIAB0AGUAcwB0AHMAIAB0AGgAYQB0ACAAdwBlAHIAZQAgAHUAcwBlAGQAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABzAGMAbwByAGUAcwAgAGEAbgBkACAAZgBpAG4AZAAgAHQAaABhAHQAIABvAHUAcgAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawAgAHcAYQBzACAAYQBiAGwAZQAgAHQAbwAgAHIAZQBqAGUAYwB0ACAAbwB2AGUAcgAgADkAOQBwAGUAcgAgAGMAZQBuAHQAIABvAGYAIAB0AGgAZQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIABwAHIAbwBkAHUAYwBlAGQAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEAIABwAHIAbwBjAGUAcwBzAGkAbgBnACwAIABhAG4AZAAgAGEAYgBsAGUAIAB0AG8AIABiAGwAaQBuAGQAbAB5ACAAZABlAHQAZQBjAHQAIAA4ADUAcABlAHIAIABjAGUAbgB0ACAAbwBmACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAcwB1AGcAZwBlAHMAdAAgAHQAaABhAHQAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAgAHQAbwAgAHQAaABlACAAYQBjAGMAdQByAGEAYwB5ACAAcwBoAG8AdQBsAGQAIABiAGUAIABwAG8AcwBzAGkAYgBsAGUAIABpAGYAIABmAHUAcgB0AGgAZQByACAAYwBhAHIAZQAgAGkAcwAgAHQAYQBrAGUAbgAgAHcAaABlAG4AIAB0AHIAYQBpAG4AaQBuAGcAIABhAG4AIABhAHIAdABpAGYAaQBjAGkAYQBsACAAbgBlAHUAcgBhAGwAIABuAGUAdAB3AG8AcgBrADsAIABmAG8AcgAgAGUAeABhAG0AcABsAGUALAAgAGUAbgBzAHUAcgBpAG4AZwAgAHQAaABhAHQAIABhACAAcgBlAHAAcgBlAHMAZQBuAHQAYQB0AGkAdgBlACAAcwBhAG0AcABsAGUAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAcABvAHAAdQBsAGEAdABpAG8AbgAgAGkAcwAgAHUAcwBlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdAByAGEAaQBuAGkAbgBnACAAcAByAG8AYwBlAHMAcwAsACAAbwByACAAdABoAGUAIAB1AHMAZQAgAG8AZgAgAGQAaQBmAGYAZQByAGUAbgB0ACAAYQByAHQAaQBmAGkAYwBpAGEAbAAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawBzACAAZgBvAHIAIAB0AGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAbwBmACAAZABpAGYAZgBlAHIAZQBuAHQAIAB0AHkAcABlAHMAIABvAGYAIABwAHUAbABzAGEAcgBzAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDI3LzEwNTIAAAELAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABCAGEAcgBzAGQAZQBsAGwAIABCAC4AUgAuADsAIABCAGgAYQB0ACAATgAuAEQALgBSAC4AOwAgAEIAdQByAGcAYQB5ACAATQAuADsAIABCAHUAcgBrAGUALQBTAHAAbwBsAGEAbwByACAAUwAuADsAIABDAGgAYQBtAHAAaQBvAG4AIABEAC4ASgAuADsAIABDAG8AcwB0AGUA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AGMAdQBsAGEAcgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAYQBuAGQAIABuAGEAcgByAG8AdwAsACAAbQB1AGwAdABpAC0AYwBvAG0AcABvAG4AZQBuAHQAIABwAHIAbwBmAGkAbABlAHMALgAgAEEAbAB0AGgAbwB1AGcAaAAgAHQAaABlACAAcABvAHMAaQB0AGkAbwBuACAAYQBuAGcAbABlACAAcwB3AGkAbgBnAHMAIABhAHIAZQAgAGcAZQBuAGUAcgBhAGwAbAB5ACAAYwBvAG0AcABsAGUAeAAsACAAZgBvAHIAIAB0AHcAbwAgAG8AZgAgAHQAaABlACAAYQBuAGEAbAB5AHMAZQBkACAAcAB1AGwAcwBhAHIAcwAgACgASgAxADYAMgAyAC0AMwA3ADUAMQAgAGEAbgBkACAASgAxADcAMQAwAC0AMgA2ADEANgApACAAdwBlACAAbwBiAHQAYQBpAG4AZQBkACAAYQBuACAAaQBuAGQAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAZwBlAG8AbQBlAHQAcgB5ACAAdgBpAGEAIAB0AGgAZQAgAHIAbwB0AGEAdABpAG4AZwAgAHYAZQBjAHQAbwByACAAbQBvAGQAZQBsAC4AIABXAGUAIAB3AGUAcgBlACAAYQBiAGwAZQAgAHQAbwAgAGQAZQB0AGUAcgBtAGkAbgBlACAAYQAgAHYAYQBsAHUAZQAgAG8AZgAgAHQAaABlACAAcgBvAHQAYQB0AGkAbwBuACAAbQBlAGEAcwB1AHIAZQAgACgAUgBNACkAIABmAG8AcgAgADMANAAgAG8AZgAgAHQAaABlACAAcwBvAHUAcgBjAGUAcwAgAHcAaABpAGMAaAAsACAAdwBoAGUAbgAgAGMAbwBtAGIAaQBuAGUAZAAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABkAGkAcwBwAGUAcgBzAGkAbwBuACAAbQBlAGEAcwB1AHIAZQBzACAAKABEAE0AKQAsACAAeQBpAGUAbABkAHMAIABhAG4AIABpAG4AdABlAGcAcgBhAHQAZQBkACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAcwB0AHIAZQBuAGcAdABoACAAYQBsAG8AbgBnACAAdABoAGUAIABsAGkAbgBlACAAbwBmACAAcwBpAGcAaAB0AC4AIABXAGkAdABoACAAdABoAGUAIABkAGEAdABhACAAcAByAGUAcwBlAG4AdABlAGQAIABoAGUAcgBlACwAIAB0AGgAZQAgAHQAbwB0AGEAbAAgAG4AdQBtAGIAZQByACAAbwBmACAAdgBhAGwAdQBlAHMAIABvAGYAIABSAE0AIABhAHMAcwBvAGMAaQBhAHQAZQBkACAAdwBpAHQAaAAgAHAAdQBsAHMAYQByAHMAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAZAB1AHIAaQBuAGcAIAB0AGgAZQAgAEgAVABSAFUAIABzAG8AdQB0AGgAZQByAG4AIABzAHUAcgB2AGUAeQAgAHMAdQBtAHMAIAB0AG8AIAA1ADEALgAgAFQAaABlACAAUgBNAHMAIABhAHIAZQAgAG4AbwB0ACAAYwBvAG4AcwBpAHMAdABlAG4AdAAgAHcAaQB0AGgAIAB0AGgAZQAgAGgAeQBwAG8AdABoAGUAcwBpAHMAIABvAGYAIABhACAAYwBvAHUAbgB0AGUAcgAtAGMAbABvAGMAawB3AGkAcwBlACAAZABpAHIAZQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG0AYQBnAG4AZQB0AGkAYwAgAGYAaQBlAGwAZAAgAHcAaQB0AGgAaQBuACAAYQBuACAAYQBuAG4AdQBsAHUAcwAgAGkAbgBjAGwAdQBkAGUAZAAgAGIAZQB0AHcAZQBlAG4AIAA0ACAAYQBuAGQAIAA2AGsAcABjACAAZgByAG8AbQAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAQwBlAG4AdAByAGUALgAgAEEAIABwAGEAcgB0AGkAYQBsACAAYQBnAHIAZQBlAG0AZQBuAHQAIAB3AGkAdABoACAAYQAgAGMAbwB1AG4AdABlAHIALQBjAGwAbwBjAGsAdwBpAHMAZQAgAHMAZQBuAHMAZQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAdwBpAHQAaABpAG4AIAB0AGgAZQAgAHMAcABpAHIAYQBsACAAYQByAG0AcwAgAGkAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAZgBvAHUAbgBkACAAaQBuACAAdABoAGUAIABhAHIAZQBhACAAbwBmACAAdABoAGUAIABDAGEAcgBpAG4AYQAtAFMAYQBnAGkAdAB0AGEAcgBpAHUAcwAgAGEAcgBtAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDM2LzM1NTcAAADnAFQAaQBiAHUAcgB6AGkAIABDAC4AOwAgAEoAbwBoAG4AcwB0AG8AbgAgAFMALgA7ACAAQgBhAGkAbABlAHMAIABNAC4AOwAgAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAaABhAHQAIABOAC4ARAAuAFIALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEIAdQByAGsAZQAtAFMAcABvAGwAYQBvAHIAIABTAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgA7ACAAQwBvAHMAdABlAHIAIABQAC4AOwAgAEQAJwBBAG0AaQBjAG8AIABOAC4AOwAgAEsAZQBpAHQAaAAgAE0ALgBKAC4AOwAgAEsAcgBhAG0AZQByACAATQAuADsAIABMAGUAdgBpAG4AIABMAC4AOwAgAE0AaQBsAGkAYQAgAFMALgA7ACAATgBnACAAQwAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAFQAaABvAHIAbgB0AG8AbgAgAEQALgA7ACAAdgBhAG4AIABTAHQAcgBhAHQAZQBuACAAVwAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADEAMwBNAE4AUgBBAFMALgA0ADMANgAuADMANQA1ADcAVH/AAAAAAAAFcmFkaW8AAALzaHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMj86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80MzYvMzU1Nzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDM2LzM1NTcvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80MzYvMzU1Ny90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQzNi8zNTU3Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMT8AAAEvaXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAmXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDU4LzMzNDEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80NTgvMzM0MQAAACwANAAyACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAcwAgAGgAaQBnAGgALQBwAHIAZQBjAGkAcwBpAG8AbgAgAHQAaQBtAGkAbgBnAAAACHJlc2VhcmNoAAAGYABXAGUAIAByAGUAcABvAHIAdAAgAG8AbgAgAHQAaABlACAAaABpAGcAaAAtAHAAcgBlAGMAaQBzAGkAbwBuACAAdABpAG0AaQBuAGcAIABvAGYAIAA0ADIAIAByAGEAZABpAG8AIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABNAFMAUABzACkAIABvAGIAcwBlAHIAdgBlAGQAIABiAHkAIAB0AGgAZQAgAEUAdQByAG8AcABlAGEAbgAgAFAAdQBsAHMAYQByACAAVABpAG0AaQBuAGcAIABBAHIAcgBhAHkAIAAoAEUAUABUAEEAKQAuACAAVABoAGkAcwAgAEUAUABUAEEAIABEAGEAdABhACAAUgBlAGwAZQBhAHMAZQAgADEALgAwACAAZQB4AHQAZQBuAGQAcwAgAHUAcAAgAHQAbwAgAG0AaQBkAC0AMgAwADEANAAgAGEAbgBkACAAYgBhAHMAZQBsAGkAbgBlAHMAIAByAGEAbgBnAGUAIABmAHIAbwBtACAANwAtADEAOAB5AHIALgAgAEkAdAAgAGYAbwByAG0AcwAgAHQAaABlACAAYgBhAHMAaQBzACAAZgBvAHIAIAB0AGgAZQAgAHMAdABvAGMAaABhAHMAdABpAGMAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsAC0AdwBhAHYAZQAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBpAHMAbwB0AHIAbwBwAGkAYwAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBkACAAYwBvAG4AdABpAG4AdQBvAHUAcwAtAHcAYQB2AGUAIABsAGkAbQBpAHQAcwAgAHIAZQBjAGUAbgB0AGwAeQAgAHAAcgBlAHMAZQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABFAFAAVABBACAAZQBsAHMAZQB3AGgAZQByAGUALgAgAFQAaABlACAAQgBhAHkAZQBzAGkAYQBuACAAdABpAG0AaQBuAGcAIABhAG4AYQBsAHkAcwBpAHMAIABwAGUAcgBmAG8AcgBtAGUAZAAgAHcAaQB0AGgAIABUAEUATQBQAE8ATgBFAFMAVAAgAHkAaQBlAGwAZABzACAAdABoAGUAIABkAGUAdABlAGMAdABpAG8AbgAgAG8AZgAgAHMAZQB2AGUAcgBhAGwAIABuAGUAdwAgAHAAYQByAGEAbQBlAHQAZQByAHMAOgAgAHMAZQB2AGUAbgAgAHAAYQByAGEAbABsAGEAeABlAHMALAAgAG4AaQBuAGUAIABwAHIAbwBwAGUAcgAgAG0AbwB0AGkAbwBuAHMAIABhAG4AZAAsACAAaQBuACAAdABoAGUAIABjAGEAcwBlACAAbwBmACAAcwBpAHgAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgAgAGEAcABwAGEAcgBlAG4AdAAgAGMAaABhAG4AZwBlACAAbwBmACAAdABoAGUAIABzAGUAbQBpAG0AYQBqAG8AcgAgAGEAeABpAHMALgAgAFcAZQAgAGYAaQBuAGQAIAB0AGgAZQAgAE4ARQAyADAAMAAxACAARwBhAGwAYQBjAHQAaQBjACAAZQBsAGUAYwB0AHIAbwBuACAAZABlAG4AcwBpAHQAeQAgAG0AbwBkAGUAbAAgAHQAbwAgAGIAZQAgAGEAIABiAGUAdAB0AGUAcgAgAG0AYQB0AGMAaAAgAHQAbwAgAG8AdQByACAAcABhAHIAYQBsAGwAYQB4ACAAZABpAHMAdABhAG4AYwBlAHMAIAAoAGEAZgB0AGUAcgAgAGMAbwByAHIAZQBjAHQAaQBvAG4AIABmAHIAbwBtACAAdABoAGUAIABMAHUAdAB6AC0ASwBlAGwAawBlAHIAIABiAGkAYQBzACkAIAB0AGgAYQBuACAAdABoAGUAIABNADIAIABhAG4AZAAgAE0AMwAgAG0AbwBkAGUAbABzACAAYgB5ACAAUwBjAGgAbgBpAHQAegBlAGwAZQByAC4AIABIAG8AdwBlAHYAZQByACwAIAB3AGUAIABtAGUAYQBzAHUAcgBlACAAYQBuACAAYQB2AGUAcgBhAGcAZQAgAHUAbgBjAGUAcgB0AGEAaQBuAHQAeQAgAG8AZgAgADgAMAAgAHAAZQByACAAYwBlAG4AdAAgACgAZgByAGEAYwB0AGkAbwBuAGEAbAApACAAZgBvAHIAIABOAEUAMgAwADAAMQAsACAAdABoAHIAZQBlACAAdABpAG0AZQBzACAAbABhAHIAZwBlAHIAIAB0AGgAYQBuACAAdwBoAGEAdAAgAGkAcwAgAHQAeQBwAGkAYwBhAGwAbAB5ACAAYQBzAHMAdQBtAGUAZAAgAGkAbgAgAHQAaABlACAAbABpAHQAZQByAGEAdAB1AHIAZQAuACAAVwBlACAAcgBlAHYAaQBzAGkAdAAgAHQAaABlACAAdAByAGEAbgBzAHYAZQByAHMAZQAgAHYAZQBsAG8AYwBpAHQAeQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuACAAZgBvAHIAIABhACAAcwBlAHQAIABvAGYAIAAxADkAIABpAHMAbwBsAGEAdABlAGQAIABhAG4AZAAgADUANwAgAGIAaQBuAGEAcgB5ACAATQBTAFAAcwAgAGEAbgBkACAAZgBpAG4AZAAgAG4AbwAgAHMAdABhAHQAaQBzAHQAaQBjAGEAbAAgAGQAaQBmAGYAZQByAGUAbgBjAGUAIABiAGUAdAB3AGUAZQBuACAAdABoAGUAcwBlACAAdAB3AG8AIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGQAZQB0AGUAYwB0ACAAUwBoAGEAcABpAHIAbwAgAGQAZQBsAGEAeQAgAGkAbgAgAHQAaABlACAAdABpAG0AaQBuAGcAIAByAGUAcwBpAGQAdQBhAGwAcwAgAG8AZgAgAFAAUwBSAHMAIABKADEANgAwADAALQAzADAANQAzACAAYQBuAGQAIABKADEAOQAxADgALQAwADYANAAyACwAIABpAG0AcABsAHkAaQBuAGcAIABwAHUAbABzAGEAcgAgAGEAbgBkACAAYwBvAG0AcABhAG4AaQBvAG4AIABtAGEAcwBzAGUAcwAgAG0AcAA9ADEALgAyADIAXgArADAALgA1AF4AXwAtADAALgAzADUAXwBNAF8AewBzAHUAbgB9AF8ALAAgAG0AYwA9ADAALgAyADEAXgArADAALgAwADYAXgBfAC0AMAAuADAANABfAE0AXwB7AHMAdQBuAH0AXwAgAGEAbgBkACAAbQBwAD0AMQAuADIANQBeACsAMAAuADYAXgBfAC0AMAAuADQAXwBNAF8AewBzAHUAbgB9AH0ALAAgAG0AYwA9ADAALgAyADMAXgArADAALgAwADcAXgBfAC0AMAAuADAANQBfAE0AXwB7AHMAdQBuAH0AXwAsACAAcgBlAHMAcABlAGMAdABpAHYAZQBsAHkALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABvAGYAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB0AG8AIABzAGUAdAAgAGEAIABzAHQAcgBpAG4AZwBlAG4AdAAgAGMAbwBuAHMAdAByAGEAaQBuAHQAIABvAG4AIAB0AGgAZQAgAGQAaQBzAHQAYQBuAGMAZQAgAHQAbwAgAFAAUwBSAHMAIABKADEAMAAxADIAKwA1ADMAMAA3ACAAYQBuAGQAIABKADEAOQAwADkALQAzADcANAA0ACwAIABhAG4AZAAgAHMAZQB0ACAAbABpAG0AaQB0AHMAIABvAG4AIAB0AGgAZQAgAGwAbwBuAGcAaQB0AHUAZABlACAAbwBmACAAYQBzAGMAZQBuAGQAaQBuAGcAIABuAG8AZABlACAAdABoAHIAbwB1AGcAaAAgAHQAaABlACAAcwBlAGEAcgBjAGgAIABvAGYAIAB0AGgAZQAgAGEAbgBuAHUAYQBsAC0AbwByAGIAaQB0AGEAbAAgAHAAYQByAGEAbABsAGEAeAAgAGYAbwByACAAUABTAFIAcwAgAEoAMQA2ADAAMAAtADMAMAA1ADMAIABhAG4AZAAgAEoAMQA5ADAAOQAtADMANwA0ADQALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80NTgvMzM0MQAAAiMARABlAHMAdgBpAGcAbgBlAHMAIABHAC4AOwAgAEMAYQBiAGEAbABsAGUAcgBvACAAUgAuAE4ALgA7ACAATABlAG4AdABhAHQAaQAgAEwALgA7ACAAVgBlAHIAYgBpAGUAcwB0ACAASgAuAFAALgBXAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgBKAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAEoAYQBuAHMAcwBlAG4AIABHAC4ASAAuADsAIABMAGEAegBhAHIAdQBzACAAUAAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAEIAYQBiAGEAawAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAAQgByAGUAbQAgAFAALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEMAbwBnAG4AYQByAGQAIABJAC4AOwAgAEcAYQBpAHIAIABKAC4AUgAuADsAIABHAHIAYQBpAGsAbwB1ACAARQAuADsAIABHAHUAaQBsAGwAZQBtAG8AdAAgAEwALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABKAGUAcwBzAG4AZQByACAAQQAuADsAIABKAG8AcgBkAGEAbgAgAEMALgA7ACAASwBhAHIAdQBwAHAAdQBzAGEAbQB5ACAAUgAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABhAHMAcwB1AHMAIABBAC4AOwAgAEwAYQB6AGEAcgBpAGQAaQBzACAASwAuADsAIABMAGUAZQAgAEsALgBKAC4AOwAgAEwAaQB1ACAASwAuADsAIABMAHkAbgBlACAAQQAuAEcALgA7ACAATQBjAGsAZQBlACAASgAuADsAIABNAGkAbgBnAGEAcgBlAGwAbABpACAAQwAuAE0ALgBGAC4AOwAgAFAAZQByAHIAbwBkAGkAbgAgAEQALgA7ACAAUABlAHQAaQB0AGUAYQB1ACAAQQAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFAAdQByAHYAZQByACAATQAuAEIALgA7ACAAUgBvAHMAYQBkAG8AIABQAC4AQQAuADsAIABTAGEAbgBpAGQAYQBzACAAUwAuADsAIABTAGUAcwBhAG4AYQAgAEEALgA7ACAAUwBoAGEAaQBmAHUAbABsAGEAaAAgAEcALgA7ACAAUwBtAGkAdABzACAAUgAuADsAIABUAGEAeQBsAG8AcgAgAFMALgBSAC4AOwAgAFQAaABlAHUAcgBlAGEAdQAgAEcALgA7ACAAVABpAGIAdQByAHoAaQAgAEMALgA7ACAAVgBhAG4AIABIAGEAYQBzAHQAZQByAGUAbgAgAFIALgA7ACAAVgBlAGMAYwBoAGkAbwAgAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADYATQBOAFIAQQBTAC4ANAA1ADgALgAzADMANAAxAER/wAAAAAAABXJhZGlvAAAIOmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MQAAAxY6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6AAAC7HZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAG/Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAIGl2bzovL2Nkcy52aXppZXIvai9tbnJhcy80NTkvMTQwAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAD0ovTU5SQVMvNDU5LzE0MAAAACYATQA4ADEALAAgAEwATQBDACAAYQBuAGQAIAAzAEMAIAAyADcAMwAvAEMAbwBtAGEAIAAxADcALQA2ADAAawBlAFYAIABvAGIAcwAuAAAACHJlc2VhcmNoAAAGFgBXAGUAIABwAHIAZQBzAGUAbgB0ACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAGEAIABkAGUAZQBwACAAcwB1AHIAdgBlAHkAIABvAGYAIAB0AGgAcgBlAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAZgBpAGUAbABkAHMALAAgAE0AOAAxACAAKABlAHgAcABvAHMAdQByAGUAIABvAGYAIAA5AC4ANwBNAHMAKQAsACAATABhAHIAZwBlACAATQBhAGcAZQBsAGwAYQBuAGkAYwAgAEMAbABvAHUAZAAgACgANgAuADgAIABNAHMAKQAgAGEAbgBkACAAMwBDACAAMgA3ADMALwBDAG8AbQBhACAAKAA5AC4AMwBNAHMAKQAsACAAaQBuACAAdABoAGUAIABoAGEAcgBkACAAWAAtAHIAYQB5ACAAKAAxADcALQA2ADAAawBlAFYAKQAgAGUAbgBlAHIAZwB5ACAAYgBhAG4AZAAgAHcAaQB0AGgAIAB0AGgAZQAgAEkAQgBJAFMAIAB0AGUAbABlAHMAYwBvAHAAZQAgAG8AbgBiAG8AYQByAGQAIAB0AGgAZQAgAEkATgBUAEUARwBSAEEATAAgAG8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAAYgBhAHMAZQBkACAAbwBuACAAMQAyACAAeQBlAGEAcgBzACAAbwBmACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMAIAAoADIAMAAwADMALQAyADAAMQA1ACkALgAgAFQAaABlACAAYwBvAG0AYgBpAG4AZQBkACAAcwB1AHIAdgBlAHkAIAByAGUAYQBjAGgAZQBzACAAYQAgADQAewBzAGkAZwBtAGEAfQAgAHAAZQBhAGsAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIAAwAC4AMQA4AG0AQwByAGEAYgAgACgAMgAuADYAeAAxADAAXgAtADEAMgBeAGUAcgBnAC8AcwAvAGMAbQBeADIAXgApACAAYQBuAGQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABiAGUAdAB0AGUAcgAgAHQAaABhAG4AIAAwAC4AMgA1ACAAYQBuAGQAIAAwAC4AOAA3AG0AQwByAGEAYgAgAG8AdgBlAHIAIAAxADAAIABwAGUAcgAgAGMAZQBuAHQAIABhAG4AZAAgADkAMAAgAHAAZQByACAAYwBlAG4AdAAgAG8AZgAgAGkAdABzACAAZgB1AGwAbAAgAGEAcgBlAGEAIABvAGYAIAA0ADkAMAAwACAAZABlAGcAXgAyAF4ALAAgAHIAZQBzAHAAZQBjAHQAaQB2AGUAbAB5AC4AIABXAGUAIABoAGEAdgBlACAAZABlAHQAZQBjAHQAZQBkACAAaQBuACAAdABvAHQAYQBsACAAMQA0ADcAIABzAG8AdQByAGMAZQBzACAAYQB0ACAAUwAvAE4APgA0AHsAcwBpAGcAbQBhAH0ALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAMwA3ACAAcwBvAHUAcgBjAGUAcwAgAG8AYgBzAGUAcgB2AGUAZAAgAGkAbgAgAGgAYQByAGQAIABYAC0AcgBhAHkAcwAgAGYAbwByACAAdABoAGUAIABmAGkAcgBzAHQAIAB0AGkAbQBlAC4AIABUAGgAZQAgAHMAdQByAHYAZQB5ACAAaQBzACAAZABvAG0AaQBuAGEAdABlAGQAIABiAHkAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAsACAAbQBvAHMAdABsAHkAIABhAGMAdABpAHYAZQAgAGcAYQBsAGEAYwB0AGkAYwAgAG4AdQBjAGwAZQBpACAAKABBAEcATgApAC4AIABUAGgAZQAgAHMAYQBtAHAAbABlACAAbwBmACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbgB0AGEAaQBuAHMAIAA5ADgAIABBAEcATgAgACgAaQBuAGMAbAB1AGQAaQBuAGcAIAA2ADQAIABTAGUAeQBmAGUAcgB0ACAAZwBhAGwAYQB4AGkAZQBzACwAIABzAGUAdgBlAG4AIABsAG8AdwAtAGkAbwBuAGkAegBhAHQAaQBvAG4AIABuAHUAYwBsAGUAYQByACAAZQBtAGkAcwBzAGkAbwBuAC0AbABpAG4AZQAgAHIAZQBnAGkAbwBuACAAZwBhAGwAYQB4AGkAZQBzACwAIAB0AGgAcgBlAGUAIABYAC0AcgBhAHkAIABiAHIAaQBnAGgAdAAgAG8AcAB0AGkAYwBhAGwAbAB5ACAAbgBvAHIAbQBhAGwAIABnAGEAbABhAHgAaQBlAHMALAAgADEANgAgAGIAbABhAHoAYQByAHMAIABhAG4AZAAgAGUAaQBnAGgAdAAgAEEARwBOACAAbwBmACAAdQBuAGMAbABlAGEAcgAgAG8AcAB0AGkAYwBhAGwAIABjAGwAYQBzAHMAKQAsACAAdAB3AG8AIABnAGEAbABhAHgAeQAgAGMAbAB1AHMAdABlAHIAcwAgACgAQwBvAG0AYQAgAGEAbgBkACAAQQBiAGUAbABsACAAMwAyADYANgApACwAIAAxADcAIABvAGIAagBlAGMAdABzACAAbABvAGMAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAATABhAHIAZwBlACAAYQBuAGQAIABTAG0AYQBsAGwAIABNAGEAZwBlAGwAbABhAG4AaQBjACAAQwBsAG8AdQBkAHMAIAAoADEAMwAgAGgAaQBnAGgALQAgAGEAbgBkACAAdAB3AG8AIABsAG8AdwAtAG0AYQBzAHMAIABYAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMAIABhAG4AZAAgAHQAdwBvACAAWAAtAHIAYQB5ACAAcAB1AGwAcwBhAHIAcwApACwAIAB0AGgAcgBlAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGEAdABhAGMAbAB5AHMAbQBpAGMAIAB2AGEAcgBpAGEAYgBsAGUAcwAsACAAbwBuAGUAIAB1AGwAdAByAGEAbAB1AG0AaQBuAG8AdQBzACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAIAAoAE0AOAAyACAAWAAtADEAKQAgAGEAbgBkACAAbwBuAGUAIABiAGwAZQBuAGQAZQBkACAAcwBvAHUAcgBjAGUAIAAoAFMAVwBJAEYAVAAgAEoAMQAxADAANQAuADcAKwA1ADgANQA0ACkALgAgAFQAaABlACAAbgBhAHQAdQByAGUAIABvAGYAIAAyADUAIABzAG8AdQByAGMAZQBzACAAcgBlAG0AYQBpAG4AcwAgAHUAbgBrAG4AbwB3AG4ALAAgAHMAbwAgAHQAaABhAHQAIAB0AGgAZQAgAHMAdQByAHYAZQB5ACcAcwAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAGkAcwAgAGMAdQByAHIAZQBuAHQAbAB5ACAAYwBvAG0AcABsAGUAdABlACAAYQB0ACAAOAAzACAAcABlAHIAIABjAGUAbgB0AC4AIABXAGUAIABoAGEAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAQQBHAE4AIABuAHUAbQBiAGUAcgAtAGYAbAB1AHgAIAByAGUAbABhAHQAaQBvAG4AcwAgACgAbABvAGcAIABOAC0AbABvAGcAIABTACkAIABhAG4AZAAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABBAEcATgAgAG4AdQBtAGIAZQByACAAZABlAG4AcwBpAHQAaQBlAHMAIABpAG4AIAB0AGgAZQAgAGwAbwBjAGEAbAAgAFUAbgBpAHYAZQByAHMAZQAgAGYAbwByACAAdABoAGUAIABlAG4AdABpAHIAZQAgAHMAdQByAHYAZQB5ACAAYQBuAGQAIABmAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgAHQAaAByAGUAZQAgAGUAeAB0AHIAYQBnAGEAbABhAGMAdABpAGMAIABmAGkAZQBsAGQAcwAuAAAANGh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL01OUkFTLzQ1OS8xNDAAAABcAE0AZQByAGUAbQBpAG4AcwBrAGkAeQAgAEkALgBBAC4AOwAgAEsAcgBpAHYAbwBuAG8AcwAgAFIALgBBAC4AOwAgAEwAdQB0AG8AdgBpAG4AbwB2ACAAQQAuAEEALgA7ACAAUwBhAHoAbwBuAG8AdgAgAFMALgBZAC4AOwAgAFIAZQB2AG4AaQB2AHQAcwBlAHYAIABNAC4ARwAuADsAIABTAHUAbgB5AGEAZQB2ACAAUgAuAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADYATQBOAFIAQQBTAC4ANAA1ADkALgAuADEANAAwAE1/wAAAAAAABXgtcmF5AAABHGh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80NTkvMTQwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OS8xNDA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDU5LzE0MC90YWJsZTE/AAAAZGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzQ4NC8zNjkxAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvNDg0LzM2OTEAAAAiAFUAVABNAE8AUwBUACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlAC4AIABJAC4AAAAIcmVzZWFyY2gAAAZHAFcAZQAgAHAAcgBlAHMAZQBuAHQAIABhAG4AIABvAHYAZQByAHYAaQBlAHcAIABhAG4AZAAgAHQAaABlACAAZgBpAHIAcwB0ACAAcgBlAHMAdQBsAHQAcwAgAGYAcgBvAG0AIABhACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlACAAdABoAGEAdAAgAGkAcwAgAHAAYQByAHQAIABvAGYAIAB0AGgAZQAgAFUAVABNAE8AUwBUACAAcAByAG8AagBlAGMAdAAgAGEAdAAgAHQAaABlACAAcgBlAGYAdQByAGIAaQBzAGgAZQBkACAATQBvAGwAbwBuAGcAbABvACAATwBiAHMAZQByAHYAYQB0AG8AcgB5ACAAUwB5AG4AdABoAGUAcwBpAHMAIABSAGEAZABpAG8AIABUAGUAbABlAHMAYwBvAHAAZQAgACgATQBPAFMAVAApACAAbgBlAGEAcgAgAEMAYQBuAGIAZQByAHIAYQAsACAAQQB1AHMAdAByAGEAbABpAGEALgAgAFcAZQAgAGMAdQByAHIAZQBuAHQAbAB5ACAAbwBiAHMAZQByAHYAZQAgAG0AbwByAGUAIAB0AGgAYQBuACAANAAwADAAIABtAGEAaQBuAGwAeQAgAGIAcgBpAGcAaAB0ACAAcwBvAHUAdABoAGUAcgBuACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIAB1AHAAIAB0AG8AIABkAGEAaQBsAHkAIABjAGEAZABlAG4AYwBlAHMALgAgAEYAbwByACAAMgAwADUAIAAoADgAIABpAG4AIABiAGkAbgBhAHIAaQBlAHMALAAgADQAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACkALAAgAHcAZQAgAHAAdQBiAGwAaQBzAGgAIAB1AHAAZABhAHQAZQBkACAAdABpAG0AaQBuAGcAIABtAG8AZABlAGwAcwAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAsACAAZgBsAHUAeAAgAGQAZQBuAHMAaQB0AHkAIAB2AGEAcgBpAGEAYgBpAGwAaQB0AHkALAAgAGEAbgBkACAAcAB1AGwAcwBlACAAdwBpAGQAdABoAHMAIABhAHQAIAA4ADQAMwAgAE0ASAB6ACwAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYgBlAHQAdwBlAGUAbgAgADEALgA0ACAAYQBuAGQAIAAzACAAeQByAC4AIABJAG4AIABjAG8AbQBwAGEAcgBpAHMAbwBuACAAdwBpAHQAaAAgAHQAaABlACAAQQBUAE4ARgAgAHAAdQBsAHMAYQByACAAYwBhAHQAYQBsAG8AZwB1AGUALAAgAHcAZQAgAGkAbQBwAHIAbwB2AGUAIAB0AGgAZQAgAHAAcgBlAGMAaQBzAGkAbwBuACAAbwBmACAAdABoAGUAIAByAG8AdABhAHQAaQBvAG4AYQBsACAAYQBuAGQAIABhAHMAdAByAG8AbQBlAHQAcgBpAGMAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIAAxADIAMwAgAHAAdQBsAHMAYQByAHMALAAgAGYAbwByACAANAA3ACAAYgB5ACAAYQB0ACAAbABlAGEAcwB0ACAAYQBuACAAbwByAGQAZQByACAAbwBmACAAbQBhAGcAbgBpAHQAdQBkAGUALgAgAFQAaABlACAAdABpAG0AZQAgAHMAcABhAG4AcwAgAGIAZQB0AHcAZQBlAG4AIABvAHUAcgAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzACAAYQBuAGQAIAB0AGgAbwBzAGUAIABpAG4AIAB0AGgAZQAgAGwAaQB0AGUAcgBhAHQAdQByAGUAIABhAHIAZQAgAHUAcAAgAHQAbwAgADQAOAAgAHkAcgAsACAAdwBoAGkAYwBoACAAYQBsAGwAbwB3ACAAdQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAaQByACAAbABvAG4AZwAtAHQAZQByAG0AIABzAHAAaQBuAC0AZABvAHcAbgAgAGgAaQBzAHQAbwByAHkAIABhAG4AZAAgAHQAbwAgAGUAcwB0AGkAbQBhAHQAZQAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGYAbwByACAANgAwACAAcAB1AGwAcwBhAHIAcwAsACAAbwBmACAAdwBoAGkAYwBoACAAMgA0ACAAYQByAGUAIABuAGUAdwBsAHkAIABkAGUAdABlAHIAbQBpAG4AZQBkACAAYQBuAGQAIABtAG8AcwB0ACAAYQByAGUAIABtAGEAagBvAHIAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAuACAAVABoAGUAIAByAGUAcwB1AGwAdABzACAAYQByAGUAIABjAG8AbgBzAGkAcwB0AGUAbgB0ACAAdwBpAHQAaAAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAaQBjACAAbQBlAGEAcwB1AHIAZQBtAGUAbgB0AHMAIABmAHIAbwBtACAAdABoAGUAIABsAGkAdABlAHIAYQB0AHUAcgBlAC4AIABBACAAbQBvAGQAZQBsACAAdwBpAHQAaAAgAHQAdwBvACAARwBhAHUAcwBzAGkAYQBuACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGMAZQBuAHQAcgBlAGQAIABhAHQAIAAxADMAOQAgAGEAbgBkACAANAA2ADMAawBtAC8AcwAgAGYAaQB0AHMAIAB0AGgAZQAgAHQAcgBhAG4AcwB2AGUAcgBzAGUAIAB2AGUAbABvAGMAaQB0AHkAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAGIAZQBzAHQALgAgAFQAaABlACAAcAB1AGwAcwBlACAAZAB1AHQAeQAgAGMAeQBjAGwAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuAHMAIABhAHQAIAA1ADAAIABhAG4AZAAgADEAMAAgAHAAZQByACAAYwBlAG4AdAAgAG0AYQB4AGkAbQB1AG0AIABhAHIAZQAgAGIAZQBzAHQAIABkAGUAcwBjAHIAaQBiAGUAZAAgAGIAeQAgAGwAbwBnAG4AbwByAG0AYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAgAHcAaQB0AGgAIABtAGUAZABpAGEAbgBzACAAbwBmACAAMgAuADMAIABhAG4AZAAgADQALgA0ACAAcABlAHIAIABjAGUAbgB0ACwAIAByAGUAcwBwAGUAYwB0AGkAdgBlAGwAeQAuACAAVwBlACAAZABpAHMAYwB1AHMAcwAgAHQAdwBvACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAHQAIABlAHgAaABpAGIAaQB0ACAAcwBwAGkAbgAtAGQAbwB3AG4AIAByAGEAdABlACAAYwBoAGEAbgBnAGUAcwAgAGEAbgBkACAAZAByAGkAZgB0AGkAbgBnACAAcwB1AGIAcAB1AGwAcwBlAHMALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAGQAZQBzAGMAcgBpAGIAZQAgAHQAaABlACAAYQB1AHQAbwBuAG8AbQBvAHUAcwAgAG8AYgBzAGUAcgB2AGkAbgBnACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAYwBoAGUAZAB1AGwAZQByACAAdABoAGEAdAAgAGgAYQBzACAAaQBuAGMAcgBlAGEAcwBlAGQAIAB0AGgAZQAgAG8AYgBzAGUAcgB2AGkAbgBnACAAZQBmAGYAaQBjAGkAZQBuAGMAeQAgAGIAeQAgAGEAIABmAGEAYwB0AG8AcgAgAG8AZgAgADIALQAzACAAaQBuACAAYwBvAG0AcABhAHIAaQBzAG8AbgAgAHcAaQB0AGgAIABzAHQAYQB0AGkAYwAgAHMAYwBoAGUAZAB1AGwAaQBuAGcALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80ODQvMzY5MQAAAPUASgBhAG4AawBvAHcAcwBrAGkAIABGAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABWAGEAbgAgAFMAdAByAGEAdABlAG4AIABXAC4AOwAgAEsAZQBhAG4AZQAgAEUALgBGAC4AOwAgAEYAbAB5AG4AbgAgAEMALgA7ACAAQgBhAHIAcgAgAEUALgBEAC4AOwAgAEIAYQB0AGUAbQBhAG4AIABUAC4AOwAgAEIAaABhAG4AZABhAHIAaQAgAFMALgA7ACAAQwBhAGwAZQBiACAATQAuADsAIABDAGEAbQBwAGIAZQBsAGwALQBXAGkAbABzAG8AbgAgAEQALgA7ACAARgBhAHIAYQBoACAAVwAuADsAIABHAHIAZQBlAG4AIABBAC4ASgAuADsAIABIAHUAbgBzAHQAZQBhAGQAIABSAC4AVwAuADsAIABKAGEAbQBlAHMAbwBuACAAQQAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAFAAYQByAHQAaABhAHMAYQByAGEAdABoAHkAIABBAC4AOwAgAFIAbwBzAGEAZABvACAAUAAuAEEALgA7ACAAVgBlAG4AawBhAHQAcgBhAG0AYQBuACAASwByAGkAcwBoAG4AYQBuACAAVgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADEAOQBNAE4AUgBBAFMALgA0ADgANAAuADMANgA5ADEASn/AAAAAAAAFcmFkaW8AAAF0aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ4NC8zNjkxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ4NC8zNjkxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ4NC8zNjkxL3RhYmxlYjI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ4NC8zNjkxL3RhYmxlYjE/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNTAxLzExMTYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy81MDEvMTExNgAAACMARwBBAEkAQQAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHcAaABlAHIAZQAgAHQAbwAgAGYAaQBuAGQAIAB0AGgAZQBtAAAACHJlc2VhcmNoAAAGYwBXAGgAaQBsAGUAIAB0AGgAZQAgAG0AYQBqAG8AcgBpAHQAeQAgAG8AZgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIABoAGEAdgBlACAAYQAgAHMAdABlAGwAbABhAHIAIABjAG8AbQBwAGEAbgBpAG8AbgAsACAAbQBvAHMAdAAgAHAAdQBsAHMAYQByAHMAIABhAHAAcABlAGEAcgAgAHQAbwAgAGIAZQAgAGkAcwBvAGwAYQB0AGUAZAAuACAAVABhAGsAZQBuACAAYQB0ACAAZgBhAGMAZQAgAHYAYQBsAHUAZQAsACAAdABoAGkAcwAgAHMAdQBnAGcAZQBzAHQAcwAgAHQAaABhAHQAIABtAG8AcwB0ACAAbQBhAHMAcwBpAHYAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGIAcgBlAGEAawAgAGEAcABhAHIAdAAgAGQAdQBlACAAdABvACAAcwB0AHIAbwBuAGcAIABuAGEAdABhAGwAIABrAGkAYwBrAHMAIAByAGUAYwBlAGkAdgBlAGQAIABpAG4AIABzAHUAcABlAHIAbgBvAHYAYQAgAGUAeABwAGwAbwBzAGkAbwBuAHMALgAgAEgAbwB3AGUAdgBlAHIALAAgAHQAaABlACAAbwBiAHMAZQByAHYAZQBkACAAYgBpAG4AYQByAHkAIABmAHIAYQBjAHQAaQBvAG4AIABjAGEAbgAgAHMAdABpAGwAbAAgAGIAZQAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIABzAHQAcgBvAG4AZwAgAHMAZQBsAGUAYwB0AGkAbwBuACAAZQBmAGYAZQBjAHQAcwAsACAAYQBzACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAG8AZgAgAG4AZQB3AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAaQBzACAAcgBhAHIAZQBsAHkAIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABmAG8AcgAgAGwAbwBuAGcAIABlAG4AbwB1AGcAaAAgAHQAbwAgAGMAbwBuAGMAbAB1AHMAaQB2AGUAbAB5ACAAcgB1AGwAZQAgAG8AdQB0ACAAbQB1AGwAdABpAHAAbABpAGMAaQB0AHkALgAgAEgAZQByAGUALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABzAGUAYwBvAG4AZAAgAEcAYQBpAGEAIABkAGEAdABhACAAcgBlAGwAZQBhAHMAZQAgAHQAbwAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAMQA1ADMANAAgAHIAbwB0AGEAdABpAG8AbgAtAHAAbwB3AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAdwBpAHQAaAAgAHAAbwBzAGkAdABpAG8AbgBzACAAawBuAG8AdwBuACAAdABvACAAYgBlAHQAdABlAHIAIAB0AGgAYQBuACAAMAAuADUAYQByAGMAcwBlAGMALgAgAFcAZQAgAGYAaQBuAGQAIAAyADIAIABtAGEAdABjAGgAZQBzACAAdABvACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAAxACAAbgBvAHQAIAByAGUAcABvAHIAdABlAGQAIABlAGwAcwBlAHcAaABlAHIAZQAsACAAYQBuAGQAIAA4ACAAbgBlAHcAIABwAG8AcwBzAGkAYgBsAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAeQBvAHUAbgBnACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAZQB4AGEAbQBpAG4AZQAgAHQAaABlACAAcABoAG8AdABvAG0AZQB0AHIAaQBjACAAYQBuAGQAIABrAGkAbgBlAG0AYQB0AGkAYwAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQBzAGUAIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAHIAbwB2AGkAZABlACAAZQBtAHAAaQByAGkAYwBhAGwAIAByAGUAbABhAHQAaQBvAG4AcwAgAGYAbwByACAAaQBkAGUAbgB0AGkAZgB5AGkAbgBnACAARwBhAGkAYQAgAHMAbwB1AHIAYwBlAHMAIAB3AGkAdABoACAAcABvAHQAZQBuAHQAaQBhAGwAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgAgAGMAbwBtAHAAYQBuAGkAbwBuAHMALgAgAE8AdQByACAAcgBlAHMAdQBsAHQAcwAgAGMAbwBuAGYAaQByAG0AIAB0AGgAYQB0ACAAdABoAGUAIABvAGIAcwBlAHIAdgBlAGQAIABtAHUAbAB0AGkAcABsAGkAYwBpAHQAeQAgAGYAcgBhAGMAdABpAG8AbgAgAGkAcwAgAHMAbQBhAGwAbAAuACAASABvAHcAZQB2AGUAcgAsACAAdwBlACAAcwBoAG8AdwAgAHQAaABhAHQAIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAbwBmACAAYgBpAG4AYQByAGkAZQBzACAAYgBlAGwAbwB3ACAAdABoAGUAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIABHAGEAaQBhACAAYQBuAGQAIAByAGEAZABpAG8AIAB0AGkAbQBpAG4AZwAgAGkAbgAgAG8AdQByACAAcwBhAG0AcABsAGUAIABjAG8AdQBsAGQAIABzAHQAaQBsAGwAIABiAGUAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaABpAGcAaABlAHIALgAgAFcAZQAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMAIAB0AG8AIABiAGUAIABmAF4AdAByAHUAZQBeAF8AeQBvAHUAbgBnAF8APAA1AC4AMwAoADgALgAzACkAIABwAGUAcgAgAGMAZQBuAHQAIAB1AG4AZABlAHIAIAByAGUAYQBsAGkAcwB0AGkAYwAgACgAYwBvAG4AcwBlAHIAdgBhAHQAaQB2AGUAKQAgAGEAcwBzAHUAbQBwAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABhAG4AZAAgAGMAdQByAHIAZQBuAHQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIAB0AGgAcgBlAHMAaABvAGwAZABzAC4AIABGAG8AcgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIAAoAD4AMQAwAE0AXwB7AHMAdQBuAH0AXwApACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdwBlACAAZgBpAG4AZAAgAGYAXgB0AHIAdQBlAF4AXwBPAEIAXwA8ADMALgA3ACAAcABlAHIAIABjAGUAbgB0ACwAIAB3AGgAaQBjAGgAIABzAGUAdABzACAAYQAgAGYAaQByAG0AIABpAG4AZABlAHAAZQBuAGQAZQBuAHQAIAB1AHAAcABlAHIAIABsAGkAbQBpAHQAIABvAG4AIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG4AZQB1AHQAcgBvAG4AIABzAHQAYQByACAAbQBlAHIAZwBlAHIAIAByAGEAdABlACwAIAA8AD0ANwAuADIAeAAxADAAXgAtADQAXgAvAHkAcgAuACAATwBuAGcAbwBpAG4AZwAgAGEAbgBkACAAZgB1AHQAdQByAGUAIABwAHIAbwBqAGUAYwB0AHMALAAgAHMAdQBjAGgAIABhAHMAIAB0AGgAZQAgAEMASABJAE0ARQAvAHAAdQBsAHMAYQByACAAcAByAG8AZwByAGEAbQAsACAATQBlAGUAcgBUAGkAbQBlACwAIABIAEkAUgBBAFgALAAgAGEAbgBkACAAdQBsAHQAaQBtAGEAdABlAGwAeQAgAHQAaABlACAAUwBLAEEALAAgAHcAaQBsAGwAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaQBtAHAAcgBvAHYAZQAgAHQAaABlAHMAZQAgAGMAbwBuAHMAdAByAGEAaQBuAHQAcwAgAGkAbgAgAHQAaABlACAAZgB1AHQAdQByAGUALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy81MDEvMTExNgAAAA0AQQBuAHQAbwBuAGkAYQBkAGkAcwAgAEoALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAyADEATQBOAFIAQQBTAC4ANQAwADEALgAxADEAMQA2AEF/wAAAAAAABXJhZGlvAAACT2h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzUwMS8xMTE2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNTAxLzExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNgAAANc6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAAMt2czpwYXJhbWh0dHA6OjpweSBW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OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xNTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTU2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE1Ni90YWJsZTE/AAABvTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAAGldnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAAPk6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAYaXZvOi8vY2RzLnZpemllci92aWkvMTg5AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAB1ZJSS8xODkAAAASAEMAYQB0AGEAbABvAGcAIABvAGYAIABQAHUAbABzAGEAcgBzAAAACHJlc2VhcmNoAAABxQBUAGgAZQAgAGMAYQB0AGEAbABvAGcAdQBlACAAaQBzACAAYQAgAGMAbwBtAHAAaQBsAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAcAByAGkAbgBjAGkAcABhAGwAIABvAGIAcwBlAHIAdgBlAGQAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAbwBmACAANwAwADYAIABwAHUAbABzAGEAcgBzACAAKAB1AHAAZABhAHQAZQBkACAAZgByAG8AbQAgADUANQA4ACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAcAByAGUAdgBpAG8AdQBzACAAdgBlAHIAcwBpAG8AbgApACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAHAAbwBzAGkAdABpAG8AbgBzACwAIAB0AGkAbQBpAG4AZwAgAHAAYQByAGEAbQBlAHQAZQByAHMALAAgAHAAdQBsAHMAZQAgAHcAaQBkAHQAaABzACwAIABmAGwAdQB4ACAAZABlAG4AcwBpAHQAaQBlAHMALAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAsACAAZABpAHMAdABhAG4AYwBlAHMALAAgAGEAbgBkACAAZABpAHMAcABlAHIAcwBpAG8AbgAsACAAcgBvAHQAYQB0AGkAbwBuACwAIABhAG4AZAAgAHMAYwBhAHQAdABlAHIAaQBuAGcAIABtAGUAYQBzAHUAcgBlAHMALgAgAEkAdAAgAGEAbABzAG8AIABsAGkAcwB0AHMAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABlAGwAZQBtAGUAbgB0AHMAIABvAGYAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgBkACAAcwBvAG0AZQAgAGMAbwBtAG0AbwBuAGwAeQAgAHUAcwBlAGQAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZABlAHIAaQB2AGUAZAAgAGYAcgBvAG0AIAB0AGgAZQAgAGIAYQBzAGkAYwAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzAC4AIABVAG4AYwBlAHIAdABhAGkAbgB0AGkAZQBzACAAYQByAGUAIABxAHUAbwB0AGUAZAAgAGYAbwByACAAbQBvAHMAdAAgAHEAdQBhAG4AdABpAHQAaQBlAHMALgAAACxodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvVklJLzE4OQAAACcAVABhAHkAbABvAHIAIABKAC4ASAAuADsAIABNAGEAbgBjAGgAZQBzAHQAZQByACAAUgAuAE4ALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2RlAAAAEwAxADkAOQAzAEEAcABKAFMALgAuAC4AOAA4AC4ALgA1ADIAOQBUf8AAAAAAAAVyYWRpbwAABD1odHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE4OS90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9WSUkvMTg5L3RhYmxlMT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcAAAAb1pdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4AAABpXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAAD5c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkAAAAHWl2bzovL25hc2EuaGVhc2FyYy9hdG5mcHVsc2FyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAABEFUTkYAAAATAEEAVABOAEYAIABQAHUAbABzAGEAcgAgAEMAYQB0AGEAbABvAGcAAAAIcmVzZWFyY2gAAAnTAFQAaABlACAAQQB1AHMAdAByAGEAbABpAGEAIABUAGUAbABlAHMAYwBvAHAAZQAgAE4AYQB0AGkAbwBuAGEAbAAgAEYAYQBjAGkAbABpAHQAeQAgACgAQQBUAE4ARgApACAAUAB1AGwAcwBhAHIAIABDAGEAdABhAGwAbwBnACAAaQBzACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgBzACAAYwBvAG0AcABpAGwAZQBkACAAYgB5ACAAUgAuAE4ALgAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgAGEAbgBkACAAaQBzACAAZABlAHMAYwBlAG4AZABlAGQAIABmAHIAbwBtACAAcAB1AGwAcwBhAHIAIABkAGEAdABhAGIAYQBzAGUAIAB1AHMAZQBkACAAZgBvAHIAIAB0AGgAZQAgAHAAYQBwAGUAcgAgACYAcQB1AG8AdAA7AEMAYQB0AGEAbABvAGcAIABvAGYAIAA1ADUAOAAgAFAAdQBsAHMAYQByAHMAJgBxAHUAbwB0ADsAIABiAHkAIABKAC4ASAAuACAAVABhAHkAbABvAHIALAAgAFIALgBOAC4AIABNAGEAbgBjAGgAZQBzAHQAZQByACAAYQBuAGQAIABBAC4ARwAuACAATAB5AG4AZQAgADEAOQA5ADMALAAgAEEAcABKAFMALAAgADgAOAAsACAANQAyADkALQA1ADYAOAAuACAAVABoAGUAIABjAHUAcgByAGUAbgB0ACAAYwBhAHQAYQBsAG8AZwAgAGgAYQBzACAAYgBlAGUAbgAgAHMAdQBwAHAAbABlAG0AZQBuAHQAZQBkACAAYgB5ACAAaQBuAGMAbAB1AHMAaQBvAG4AIABvAGYAIABwAHUAYgBsAGkAcwBoAGUAZAAgAGQAYQB0AGEAIABmAHIAbwBtACAAbQBvAHIAZQAgAHIAZQBjAGUAbgB0ACAAcgBhAGQAaQBvACAAcwB1AHIAdgBlAHkAcwAsACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdABoAGUAIABQAGEAcgBrAGUAcwAgAE0AdQBsAHQAaQBiAGUAYQBtACAAKABQAE0AKQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADgALAAgADEANwAtADMANQApACAAWwBhAHYAYQBpAGwAYQBiAGwAZQAgAGEAdAAgAHQAaABlACAASABFAEEAUwBBAFIAQwAgAGEAcwAgAHQAaABlACAAUABNAFAAVQBMAFMAQQBSACAAdABhAGIAbABlAF0AIABhAG4AZAAgAHQAaABlACAAUwB3AGkAbgBiAHUAcgBuAGUAIABJAG4AdABlAHIAbQBlAGQAaQBhAHQAZQAgAEwAYQB0AGkAdAB1AGQAZQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAEUAZAB3AGEAcgBkAHMAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADYALAAgADMANQA4AC0AMwA3ADQAKQAsACAAYgBvAHQAaAAgAG0AYQBkAGUAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEEAVABOAEYAIABQAGEAcgBrAGUAcwAgADYANAAtAG0AIAByAGEAZABpAG8AIAB0AGUAbABlAHMAYwBvAHAAZQAuACAAQgBpAG4AYQByAHkAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIABrAG4AbwB3AG4AIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGEAbABzAG8AIABpAG4AYwBsAHUAZABlAGQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAYQBsAGwAIABhAHYAYQBpAGwAYQBiAGwAZQAgAGEAcwB0AHIAbwBtAGUAdAByAGkAYwAgAGEAbgBkACAAcwBwAGkAbgAgAHAAYQByAGEAbQBlAHQAZQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAZgBvAHIAIABhAGwAbAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwAgAGkAbgBjAGwAdQBkAGUAcwAgAGEAbABsACAAcAB1AGIAbABpAHMAaABlAGQAIAByAG8AdABhAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAuACAAVAB3AG8AIABzAGUAcABhAHIAYQB0AGUAIABzAG0AYQBsAGwAIABzAHUAYgBzAGUAdABzACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGQAZQB0AGUAYwB0AGUAZAAgAG8AbgBsAHkAIABhAHQAIABoAGkAZwBoACAAZQBuAGUAcgBnAGkAZQBzACAAYQByAGUAIABhAGwAcwBvACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGUAIABjAHUAcgByAGUAbgB0ACAAdABhAGIAbABlADoAIAB0AGgAZQAgAGYAaQByAHMAdAAgAGcAcgBvAHUAcAAgAGMAbwBtAHAAcgBpAHMAZQBzACAAWAAtAHIAYQB5ACAAYQBuAGQAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAdQBsAHMAYQByAHMAIAB3AGgAaQBjAGgAIABhAHIAZQAgAGEAcABwAGEAcgBlAG4AdABsAHkAIABwAG8AdwBlAHIAZQBkACAAYgB5ACAAcwBwAGkAbgAtAGQAbwB3AG4AIABlAG4AZQByAGcAeQAsACAAYgB1AHQAIAB3AGgAaQBjAGgAIABoAGEAdgBlACAAbgBvAHQAIABiAGUAZQBuACAAZABlAHQAZQBjAHQAZQBkACAAYQB0ACAAcgBhAGQAaQBvACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAHMAZQBjAG8AbgBkACAAZwByAG8AdQBwACAAYwBvAG4AdABhAGkAbgBzACAAYQBuAG8AbQBhAGwAbwB1AHMAIABYAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAKABBAFgAUABzACkAIABhAG4AZAAgAHMAbwBmAHQALQBnAGEAbQBtAGEALQByAGEAeQAgAHIAZQBwAGUAYQB0AGUAcgBzACAAKABTAEcAUgBzACkAIABmAG8AcgAgAHcAaABpAGMAaAAgAGMAbwBoAGUAcgBlAG4AdAAgAHAAdQBsAHMAYQB0AGkAbwBuAHMAIABoAGEAdgBlACAAYgBlAGUAbgAgAGQAZQB0AGUAYwB0AGUAZAAuACAAQQBjAGMAcgBlAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBjAGgAIABhAHMAIABIAGUAcgAgAFgALQAxACAAYQBuAGQAIAB0AGgAZQAgAHIAZQBjAGUAbgB0AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABYAC0AcgBhAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAcwB1AGMAaAAgAGEAcwAgAFMAQQBYACAASgAxADgAMAA4AC4ANAAtADMANgA1ADgAIABhAHIAZQAgAG4AbwB0ACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGkAcwAgAHQAYQBiAGwAZQAsACAAaABvAHcAZQB2AGUAcgAuACAATQBhAG4AeQAgAHAAZQBvAHAAbABlACAAaABhAHYAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAAYwBvAG0AcABpAGwAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABkAGEAdABhACAAYwBvAG4AdABhAGkAbgBlAGQAIABpAG4AIAB0AGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAGEAbgBkACAAdABoAGUAIABkAGEAdABhAGIAYQBzAGUAIAB0AGgAYQB0ACAAaQB0ACAAdwBhAHMAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAuACAAVABoAGUAIABhAHUAdABoAG8AcgBzACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIAB0AGgAYQBuAGsAIABBAG4AZAByAGUAdwAgAEwAeQBuAGUAIABvAGYAIAB0AGgAZQAgAFUAbgBpAHYAZQByAHMAaQB0AHkAIABvAGYAIABNAGEAbgBjAGgAZQBzAHQAZQByACwAIABKAG8AZAByAGUAbABsACAAQgBhAG4AawAgAE8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAARABhAHYAaQBkACAATgBpAGMAZQAgAG8AZgAgAFAAcgBpAG4AYwBlAHQAbwBuACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAsACAAYQBuAGQAIABSAHUAcwBzAGUAbABsACAARQBkAHcAYQByAGQAcwAsACAAdABoAGUAbgAgAGEAdAAgAFMAdwBpAG4AYgB1AHIAbgBlACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAgAG8AZgAgAFQAZQBjAGgAbgBvAGwAbwBnAHkALgAgAFQAaABlACAAYQBsAHMAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAFcAYQByAHcAaQBjAGsAIABVAG4AaQB2AGUAcgBzAGkAdAB5ACAAcwB0AHUAZABlAG4AdABzACAAQQBkAGEAbQAgAEcAbwBvAGQAZQAgAGEAbgBkACAAUwB0AGUAdgBlAG4AIABUAGgAbwBtAGEAcwAgAHcAaABvACAAYwBvAG0AcABpAGwAZQBkACAAYQBuAGQAIABjAGgAZQBjAGsAZQBkACAAYQAgAHIAZQBjAGUAbgB0ACAAdgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlAC4AIABUAGgAZQAgAG8AcgBpAGcAaQBuAGEAbAAgACgAcwB1AG0AbQBlAHIAIAAyADAAMAAzACkAIABkAGEAdABhAGIAYQBzAGUAIABhAHQAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgBzAGkAdABlACAAdwBhAHMAIABjAG8AbQBwAGkAbABlAGQAIAB3AGkAdABoACAAdABoAGUAIABpAG4AdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAaQBzAHQAYQBuAGMAZQAgAG8AZgAgAE0AYQByAHkAYQBtACAASABvAGIAYgBzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgAgAGkAbgB0AGUAcgBmAGEAYwBlACAAdwBhAHMAIABkAGUAcwBpAGcAbgBlAGQAIABhAG4AZAAgAGMAbwBuAHMAdAByAHUAYwB0AGUAZAAgAGIAeQAgAEEAbABiAGUAcgB0ACAAVABlAG8AaAAsACAAYQAgAFMAdQBtAG0AZQByACAAVgBhAGMAYQB0AGkAbwBuACAAUwBjAGgAbwBsAGEAcgAgAGEAdAAgAHQAaABlACAAQQBUAE4ARgAgAGkAbgAgADIAMAAwADIALwAyADAAMAAzAC4AIABUAGgAZQAgAGEAdQB0AGgAbwByAHMAIAB3AG8AdQBsAGQAIABhAHAAcAByAGUAYwBpAGEAdABlACAAaQBmACAAYQBuAHkAbwBuAGUAIABtAGEAawBpAG4AZwAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAGMAYQB0AGEAbABvAGcAIABpAG4AIABhACAAcAB1AGIAbABpAGMAYQB0AGkAbwBuACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlAHMAIAB0AGgAZQAgAHMAbwB1AHIAYwBlACAAbwBmACAAdABoAGUAaQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAYgB5ACAAcQB1AG8AdABpAG4AZwAgAHQAaABlACAAQQBUAE4ARgAgAFAAdQBsAHMAYQByACAAQwBhAHQAYQBsAG8AZwAgAHcAZQBiAHMAaQB0AGUAIABhAGQAZAByAGUAcwBzACAAbwBmACAAJgBsAHQAOwBhACAAaAByAGUAZgA9ACIAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAdABuAGYALgBjAHMAaQByAG8ALgBhAHUALwByAGUAcwBlAGEAcgBjAGgALwBwAHUAbABzAGEAcgAvAHAAcwByAGMAYQB0AC8AIgAmAGcAdAA7AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAHQAbgBmAC4AYwBzAGkAcgBvAC4AYQB1AC8AcgBlAHMAZQBhAHIAYwBoAC8AcAB1AGwAcwBhAHIALwBwAHMAcgBjAGEAdAAvACYAbAB0ADsALwBhACYAZwB0ADsAAAA6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvVzNCcm93c2UvYWxsL2F0bmZwdWxzYXIuaHRtbAAAABIATQBhAG4AYwBoAGUAcwB0AGUAcgAsACAAVABhAHkAbABvAHIAAAAHY2F0YWxvZwAAAAAAAAATADIAMAAwADUAQQBKAC4ALgAuAC4AMQAyADkALgAxADkAOQAzAE1/wAAAAAAABXJhZGlvAAABfWh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L2NnaS1iaW4vVzNCcm93c2UvZ2V0dm90YWJsZS5wbD9uYW1lPWF0bmZwdWxzYXI6OjpweSBWTyBzZXA6OjpodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi94YW1pbi92by9jb25lP3Nob3dvZmZzZXRzJnRhYmxlPWF0bmZwdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS93M3F1ZXJ5LnBsP3RhYmxlaGVhZD1uYW1lPWhlYXNhcmNfYXRuZnB1bHNhciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MQAAAGQ6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6AAAAXnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAAzOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAHWl2bzovL25hc2EuaGVhc2FyYy9mZXJtaWwycHNyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAACkZFUk1JTDJQU1IAAAAzAEYAZQByAG0AaQAgAEwAQQBUACAAUwBlAGMAbwBuAGQAIABDAGEAdABhAGwAbwBnACAAbwBmACAARwBhAG0AbQBhAC0AUgBhAHkAIABQAHUAbABzAGEAcgBzACAAKAAyAFAAQwApAAAACHJlc2VhcmNoAAAC0QBUAGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAHMAdQBtAG0AYQByAGkAegBlAHMAIAAwAC4AMQAgAEcAZQBWACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgAgAGQAZQB0AGUAYwB0AGkAbwBuAHMAIAB1AHMAaQBuAGcAIABkAGEAdABhACAAYQBjAHEAdQBpAHIAZQBkACAAYgB5ACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAHMAYQB0AGUAbABsAGkAdABlAC4AIABUAGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAYQByAGUAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHUAcwBpAG4AZwAgAEwAQQBUACAAZABhAHQAYQAgAHQAaAByAG8AdQBnAGgAIABwAGUAcgBpAG8AZABpAGMAaQB0AHkAIABzAGUAYQByAGMAaABlAHMAIABpAG4AIABnAGEAbQBtAGEALQByAGEAeQAgAGEAbgBkACAAcgBhAGQAaQBvACAAZABhAHQAYQAgAGEAcgBvAHUAbgBkACAATABBAFQAIAB1AG4AYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAbwB1AHIAYwBlACAAcABvAHMAaQB0AGkAbwBuAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwB1AGUAZAAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAaQB2AGkAZABlAGQAIABpAG4AdABvACAAdABoAHIAZQBlACAAZwByAG8AdQBwAHMAOgAgAG0AaQBsAGwAaQBzAGUAYwBvAG4AZAAgAHAAdQBsAHMAYQByAHMALAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAGwAbwB1AGQAIABwAHUAbABzAGEAcgBzACwAIABhAG4AZAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAHEAdQBpAGUAdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABpAHMAIABjAGEAdABhAGwAbwBnACAAcwB1AG0AbQBhAHIAaQB6AGUAcwAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIAB0AGgAZQAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHAAdQBsAHMAZQAgAHAAcgBvAGYAaQBsAGUAcwAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIABzAHAAZQBjAHQAcgBhACwAIABhAG4AZAAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHQAaABlACAAbwBmAGYALQBwAGUAYQBrACAAcABoAGEAcwBlACAAaQBuAHQAZQByAHYAYQBsAHMALAAgAGEA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IAB5AG8AdQBuAGcAIABhAG4AZAAvAG8AcgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkAC4AIABUAGgAaQBzACAAcwB1AHIAdgBlAHkAIABpAHMAIABhACAAZgBhAGMAdABvAHIAIABvAGYAIAA3ACAAdABpAG0AZQBzACAAbQBvAHIAZQAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAeQBvAHUAbgBnACAAYQBuAGQAIABkAGkAcwB0AGEAbgB0ACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAG4AIAB0AGgAYQB0ACAAbwBmACAASgBvAGgAbgBzAHQAbwBuACAAZQB0ACAAYQBsAC4AIAAoADEAOQA5ADIALAAgAE0ATgBSAEEAUwAsACAAMgA1ADUALAAgADQAMAAxACkAIAB3AGgAaQBjAGgAIABkAGUAdABlAGMAdABlAGQAIAAxADAAMAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAcAByAGUAcwBlAG4AdAAgAHMAbwB1AHIAYwBlACAAbABpAHMAdAAgAGMAbwBuAHQAYQBpAG4AcwAgAHAAdQBsAHMAYQByAHMAIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAZQBlAG4AIABuAGUAdwBsAHkAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAaQBuACAAdABoAGUAIABjAG8AdQByAHMAZQAgAG8AZgAgAHQAaABpAHMAIABzAHUAcgB2AGUAeQAuACAAVABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQAgAGkAcwAgAHMAcABlAGMAaQBmAGkAYwBhAGwAbAB5ACAAdABhAHIAZwBlAHQAZQBkACAAZgBvAHIAIAAoAGkAKQAgAG8AYgBzAGMAdQByAGUAZAAgAHIAZQBnAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAsACAAKABpAGkAKQAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMALABhAG4AZAAgACgAaQBpAGkAKQAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABtAGEAcwBzAGkAdgBlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAAQQBzACAAbwBmACAAQQB1AGcAdQBzAHQAIAAxADkAOQA5ACwAIABhAG4AYQBsAHkAcwBpAHMAIABvAGYAIABhAGIAbwB1AHQAIAA1ADAAJQAgAG8AZgAgAHQAaABlACAAdABvAHQAYQBsACAAZQB4AHAAZQBjAHQAZQBkACAAZABhAHQAYQAgAHQAbwAgAGIAZQAgAGMAbwBsAGwAZQBjAHQAZQBkACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGMAbwBuAGYAaQByAG0AZQBkACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABvAHYAZQByACAANAAwADAAIABuAGUAdwAgAHAAdQBsAHMAYQByAHMAIAAoAGEAbgAgAGkAbgBjAHIAZQBhAHMAZQAgAG8AZgAgAG0AbwByAGUAIAB0AGgAYQBuACAANQAwACUAIABvAGYAIAB0AGgAZQAgAGsAbgBvAHcAbgAgAHAAbwBwAHUAbABhAHQAaQBvAG4AKQAuACAASABlAHIAZQAgAGEAcgBlACAAcwBvAG0AZQAgAG8AZgAgAHQAaABlACAAZgBlAGEAdAB1AHIAZQBzACAAbwBmACAAdABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQA6ACAAJgBsAHQAOwBwAHIAZQAmAGcAdAA7ACAAUwB1AHIAdgBlAHkAIABBAHIAZQBhADoAIAAtADIANgAwACAAJgBsAHQAOwAgAGwAIAAmAGwAdAA7ACAANQAwACAAZABlAGcAIAAsACAALQA1ACAAJgBsAHQAOwAgAGIAIAAmAGwAdAA7ACAANQAgAGQAZQBnACAAQwBlAG4AdABlAHIAIABGAHIAZQBxAHUAZQBuAGMAeQA6ACAAMQAzADcANAAgAE0ASAB6ACAAQgBhAG4AZAB3AGkAZAB0AGgAOgAgADIAOAA4ACAATQBIAHoAIAAoADkANgAgAGMAaABhAG4AbgBlAGwAcwAgAHgAIAAzACAATQBIAHoAIABwAGUAcgAgAGMAaABhAG4AbgBlAGwAIAB4ACAAMgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuAHMAKQAgAFMAYQBtAHAAbABpAG4AZwAgAFIAYQB0AGUAOgAgADAALgAyADUAIABtAHMAIAB4ACAAMQAgAGIAaQB0ACAA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
\ No newline at end of file diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index cfc631327..3204bb623 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -1,17 +1,27 @@ #!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ -Tests for pyvo.dal.query +Tests for pyvo.registry.regtap """ + +import io +import re from functools import partial from urllib.parse import parse_qsl + import pytest +from pyvo.registry import regtap +from pyvo.registry import rtcons +from pyvo.registry.regtap import REGISTRY_BASEURL from pyvo.registry import search as regsearch from pyvo.dal import query as dalq +from pyvo.dal import tap from astropy.utils.data import get_pkg_data_contents +from .commonfixtures import messenger_vocabulary + get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') @@ -23,35 +33,48 @@ def callback(request, context): return get_pkg_data_contents('data/capabilities.xml') with mocker.register_uri( - 'GET', 'http://dc.g-vo.org/tap/capabilities', content=callback + 'GET', REGISTRY_BASEURL+'/capabilities', content=callback ) as matcher: yield matcher +# to update this, run +# import requests +# from pyvo.registry import regtap +# +# with open("data/regtap.xml", "wb") as f: +# f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { +# "LANG": "ADQL", +# "QUERY": regtap.get_RegTAP_query( +# keywords="pulsar", ucd=["pos.distance"])}).content) + + +@pytest.fixture() +def regtap_pulsar_distance_response(mocker): + with mocker.register_uri( + 'POST', REGISTRY_BASEURL+'/sync', + content=get_pkg_data_contents('data/regtap.xml')) as matcher: + yield matcher + + @pytest.fixture() def keywords_fixture(mocker): def keywordstest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] - assert "WHERE isub0.res_subject ILIKE '%vizier%'" in query - assert "WHERE 1=ivo_hasword(ires0.res_description, 'vizier')" in query - assert "OR 1=ivo_hasword(ires0.res_title, 'vizier')" in query + assert "res_subject ILIKE '%vizier%'" in query + assert "ivo_hasword(res_description, 'vizier')" in query + assert "1=ivo_hasword(res_title, 'vizier')" in query - assert "WHERE isub1.res_subject ILIKE '%pulsar%'" in query - assert "WHERE 1=ivo_hasword(ires1.res_description, 'pulsar')" in query - assert "OR 1=ivo_hasword(ires1.res_title, 'pulsar')" in query - - assert "'ivo://ivoa.net/std/conesearch'" in query - assert "'ivo://ivoa.net/std/sia'" in query - assert "'ivo://ivoa.net/std/ssa'" in query - assert "'ivo://ivoa.net/std/slap'" in query - assert "'ivo://ivoa.net/std/tap'" in query + assert " res_subject ILIKE '%pulsar%'" in query + assert "1=ivo_hasword(res_description, 'pulsar')" in query + assert "1=ivo_hasword(res_title, 'pulsar')" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=keywordstest_callback ) as matcher: yield matcher @@ -63,20 +86,14 @@ def keywordstest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] - assert "WHERE isub0.res_subject ILIKE '%single%'" in query - assert "WHERE 1=ivo_hasword(ires0.res_description, 'single')" in query - assert "OR 1=ivo_hasword(ires0.res_title, 'single')" in query - - assert "'ivo://ivoa.net/std/conesearch'" in query - assert "'ivo://ivoa.net/std/sia'" in query - assert "'ivo://ivoa.net/std/ssa'" in query - assert "'ivo://ivoa.net/std/slap'" in query - assert "'ivo://ivoa.net/std/tap'" in query + assert "WHERE res_subject ILIKE '%single%'" in query + assert "WHERE 1=ivo_hasword(res_description, 'single') UNION" in query + assert "1=ivo_hasword(res_title, 'single')" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=keywordstest_callback ) as matcher: yield matcher @@ -97,7 +114,7 @@ def servicetypetest_callback(request, context): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=servicetypetest_callback ) as matcher: yield matcher @@ -114,7 +131,7 @@ def wavebandtest_callback(request, content): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=wavebandtest_callback ) as matcher: yield matcher @@ -127,14 +144,16 @@ def datamodeltest_callback(request, content): query = data['QUERY'] assert ( - "WHERE idet.detail_xpath = '/capability/dataModel/@ivo-id" in query - ) - assert "idet.detail_value, 'ivo://ivoa.net/std/tap%')" in query + "(detail_xpath = '/capability/dataModel/@ivo-id'" in query) + + assert ( + "ivo_nocasematch(detail_value, 'ivo://ivoa.net/std/obscore%'))" + in query) return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=datamodeltest_callback ) as matcher: yield matcher @@ -151,12 +170,96 @@ def auxtest_callback(request, context): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', - content=auxtest_callback + 'POST', REGISTRY_BASEURL+'/sync', + content=auxtest_callback, ) as matcher: yield matcher +@pytest.fixture() +def multi_interface_fixture(mocker): +# to update this, run +# import requests +# from pyvo.registry import regtap +# +# with open("data/multi-interface.xml", "wb") as f: +# f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { +# "LANG": "ADQL", +# "QUERY": regtap.get_RegTAP_query( +# ivoid="ivo://org.gavo.dc/flashheros/q/ssa")}).content) + with mocker.register_uri( + 'POST', REGISTRY_BASEURL+'/sync', + content=get_pkg_data_contents('data/multi-interface.xml') + ) as matcher: + yield matcher + + +@pytest.fixture() +def flash_service(multi_interface_fixture): + return regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa")[0] + + +class TestInterfaceClass: + def test_basic(self): + intf = regtap.Interface("http://example.org", "", "", "") + assert intf.access_url == "http://example.org" + assert intf.standard_id is None + assert intf.type is None + assert intf.role is None + assert intf.is_standard == False + assert not intf.is_vosi + + def test_repr(self): + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + "vs:paramhttp", "std") + assert (repr(intf) == "Interface('http://example.org'," + " 'ivo://gavo/std/a', 'vs:paramhttp', 'std')") + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + None, None) + assert repr(intf) == ("Interface('http://example.org'," + " 'ivo://gavo/std/a', None, None)") + + def test_unknown_standard(self): + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + "vs:paramhttp", "std") + assert intf.is_standard + with pytest.raises(ValueError) as excinfo: + intf.to_service() + + assert str(excinfo.value) == ( + "PyVO has no support for interfaces with standard" + " id ivo://gavo/std/a.") + + def test_known_standard(self): + intf = regtap.Interface("http://example.org", + "ivo://ivoa.net/std/tap#aux", "vs:paramhttp", "std") + assert isinstance(intf.to_service(), tap.TAPService) + assert not intf.is_vosi + + def test_secondary_interface(self): + intf = regtap.Interface("http://example.org", + "ivo://ivoa.net/std/tap#aux", + "vs:webbrowser", "web") + + with pytest.raises(ValueError) as excinfo: + intf.to_service() + + assert str(excinfo.value) == ( + "This is not a standard interface. PyVO cannot speak to it.") + + def test_VOSI(self): + intf = regtap.Interface("http://example.org", + "ivo://ivoa.net/std/vosi#capabilities", + "vs:ParamHTTP", "std") + assert intf.is_vosi + + +# The following tests have their assertions in the fixtures. +# It would certainly not hurt to refactor this so they are +# in the tests (we could also just rely on the rtcons tests +# that exercise about the same thing). + @pytest.mark.usefixtures('keywords_fixture', 'capabilities') def test_keywords(): regsearch(keywords=['vizier', 'pulsar']) @@ -173,14 +276,17 @@ def test_servicetype(): regsearch(servicetype='table') -@pytest.mark.usefixtures('waveband_fixture', 'capabilities') +@pytest.mark.usefixtures( + 'waveband_fixture', + 'capabilities', + 'messenger_vocabulary') def test_waveband(): regsearch(waveband='optical') @pytest.mark.usefixtures('datamodel_fixture', 'capabilities') def test_datamodel(): - regsearch(datamodel='tap') + regsearch(datamodel='ObsCore') @pytest.mark.usefixtures('aux_fixture', 'capabilities') @@ -188,12 +294,362 @@ def test_servicetype_aux(): regsearch(servicetype='table', includeaux=True) -@pytest.mark.usefixtures('aux_fixture', 'capabilities') -def test_keyword_aux(): - regsearch(keywords=['pulsar'], includeaux=True) - - @pytest.mark.usefixtures('aux_fixture', 'capabilities') def test_bad_servicetype_aux(): with pytest.raises(dalq.DALQueryError): regsearch(servicetype='bad_servicetype', includeaux=True) + + +def test_spatial(): + assert (rtcons.keywords_to_constraints({ + "spatial": (23, -40)})[0].get_search_condition() + == "1 = CONTAINS(MOC(6, POINT(23, -40)), coverage)") + + +def test_spectral(): + assert (rtcons.keywords_to_constraints({ + "spectral": (1e-17, 2e-17)})[0].get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end, 1e-17, 2e-17)") + + +def test_to_table(multi_interface_fixture, capabilities): + t = regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa").get_summary() + assert (set(t.columns.keys()) + == {'index', 'short_name', 'title', 'description', 'interfaces'}) + assert t["index"][0] == 0 + assert t["title"][0] == 'Flash/Heros SSAP' + assert (t["description"][0][:40] + == 'Spectra from the Flash and Heros Echelle') + assert (t["interfaces"][0] + == 'datalink#links-1.0, soda#sync-1.0, ssa, tap#aux, web') + + +@pytest.fixture() +def rt_pulsar_distance(regtap_pulsar_distance_response, capabilities): + return regsearch(keywords="pulsar", ucd=["pos.distance"]) + + +def test_record_fields(rt_pulsar_distance): + rec = rt_pulsar_distance["VII/156"] + assert rec.ivoid=="ivo://cds.vizier/vii/156" + assert rec.res_type=="vs:catalogservice" + assert rec.short_name=="VII/156" + assert rec.res_title=="Catalog of 558 Pulsars" + assert rec.content_levels==['research'] + assert rec.res_description[:20]=="The catalogue is an up-to-date"[:20] + assert rec.reference_url=="http://cdsarc.unistra.fr/cgi-bin/cat/VII/156" + assert rec.creators==['Taylor J.H.', ' Manchester R.N.', ' Lyne A.G.'] + assert rec.content_types==['catalog'] + assert rec.source_format=="bibcode" + assert rec.source_value=="1993ApJS...88..529T" + assert rec.waveband==['radio'] + # access URL, standard_id and friends exercised in TestInterfaceSelection + + +class TestResultIndexing: + def test_get_with_index(self, rt_pulsar_distance): + # this is expecte to break when the fixture is updated + assert (rt_pulsar_distance[0].res_title + == 'Pulsar Timing for Fermi Gamma-ray Space Telescope') + + def test_get_with_short_name(self, rt_pulsar_distance): + assert (rt_pulsar_distance["ATNF"].res_title + == 'ATNF Pulsar Catalog') + + def test_get_with_ivoid(self, rt_pulsar_distance): + assert (rt_pulsar_distance["ivo://nasa.heasarc/atnfpulsar" + ].res_title == 'ATNF Pulsar Catalog') + + def test_out_of_range(self, rt_pulsar_distance): + with pytest.raises(IndexError) as excinfo: + rt_pulsar_distance[40320] + assert (str(excinfo.value) + == "index 40320 is out of bounds for axis 0 with size 23") + + def test_bad_key(self, rt_pulsar_distance): + with pytest.raises(KeyError) as excinfo: + rt_pulsar_distance["hunkatunka"] + assert (str(excinfo.value) == "'hunkatunka'") + + def test_not_indexable(self, rt_pulsar_distance): + with pytest.raises(IndexError) as excinfo: + rt_pulsar_distance[None] + assert (str(excinfo.value) + == "No resource matching None") + + +@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', + 'flash_service') +class TestInterfaceSelection: + """ + tests for the selection and generation of services within + RegistryResource. + """ + def test_exactly_one_result(self): + results = regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa") + assert len(results) == 1 + + def test_access_modes(self, flash_service): + assert set(flash_service.access_modes()) == { + 'datalink#links-1.0', 'soda#sync-1.0', 'ssa', 'tap#aux', + 'web'} + + def test_standard_id_multi(self, flash_service): + with pytest.raises(dalq.DALQueryError) as excinfo: + _ = flash_service.standard_id + + assert str(excinfo.value) == ("This resource supports several" + " standards (datalink#links-1.0, soda#sync-1.0, ssa," + " tap#aux, web). Use get_service or restrict your query" + " using Servicetype.") + + def test_get_web_interface(self, flash_service): + svc = flash_service.get_service("web") + assert isinstance(svc, + regtap._BrowserService) + assert (svc.access_url + == "http://dc.zah.uni-heidelberg.de/flashheros/q/web/form") + + def test_get_aux_interface(self, flash_service): + svc = flash_service.get_service("tap#aux") + assert (svc._baseurl + == "http://dc.zah.uni-heidelberg.de/tap") + + def test_get_aux_as_main(self, flash_service): + assert (flash_service.get_service("tap")._baseurl + == "http://dc.zah.uni-heidelberg.de/tap") + + def test_get__main_from_aux(self, flash_service): + assert (flash_service.get_service("tap")._baseurl + == "http://dc.zah.uni-heidelberg.de/tap") + + def test_get_by_alias(self, flash_service): + assert (flash_service.get_service("spectrum")._baseurl + == "http://dc.zah.uni-heidelberg.de/fhssa?") + + def test_get_unsupported_standard(self, flash_service): + with pytest.raises(ValueError) as excinfo: + flash_service.get_service("soda#sync-1.0") + + assert str(excinfo.value) == ( + "PyVO has no support for interfaces with standard id" + " ivo://ivoa.net/std/soda#sync-1.0.") + + def test_get_nonexisting_standard(self, flash_service): + with pytest.raises(ValueError) as excinfo: + flash_service.get_service("http://nonsense#fancy") + + assert str(excinfo.value) == ( + "No matching interface.") + + def test_unconstrained(self, flash_service): + with pytest.raises(ValueError) as excinfo: + flash_service.get_service(lax=False) + + assert str(excinfo.value) == ( + "Multiple matching interfaces found. Perhaps pass in" + " service_type or use a Servicetype constrain in the" + " registry.search? Or use lax=True?") + + +class _FakeResult: + """A fake class just sufficient for giving dal.query.Record enough + to pull in the dict this is constructed. + + As an extra service, list values are stringified with + regtap.TOKEN_SEP -- this is how they ought to come in from + RegTAP services. + """ + def __init__(self, d): + self.fieldnames = list(d.keys()) + vals = [regtap.TOKEN_SEP.join(v) if isinstance(v, list) else v + for v in d.values()] + + class _: + class array: + data = [vals] + + self.resultstable = _ + + +def _makeRegistryRecord(overrides): + """returns a minimal RegistryResource instance, overriding + some built-in defaults with the dict overrides. + """ + defaults = { + "access_urls": "", + "standard_ids": "", + "intf_types": "", + "intf_roles": "", + } + defaults.update(overrides) + return regtap.RegistryResource(_FakeResult(defaults), 0) + + +class TestInterfaceRejection: + """tests for various artificial corner cases where interface selection + should fail (or just not fail). + """ + def test_nonunique(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["ivo://ivoa.net/std/tap"]*2, + "intf_types": ["vs:paramhttp"]*2, + "intf_roles": ["std"]*2, + }) + with pytest.raises(ValueError) as excinfo: + rsc.get_service("tap", lax=False) + + assert str(excinfo.value) == ( + "Multiple matching interfaces found. Perhaps pass in" + " service_type or use a Servicetype constrain in the" + " registry.search? Or use lax=True?") + + def test_nonunique_lax(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["ivo://ivoa.net/std/tap"]*2, + "intf_types": ["vs:paramhttp"]*2, + "intf_roles": ["std"]*2, + }) + + assert (rsc.get_service("tap")._baseurl + == "http://a") + + def test_nonstd_ignored(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["ivo://ivoa.net/std/tap"]*2, + "intf_types": ["vs:paramhttp"]*2, + "intf_roles": ["std", ""] + }) + + assert (rsc.get_service("tap", lax=False)._baseurl + == "http://a") + + def test_select_single_matching_service(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["", "ivo://ivoa.net/std/tap"], + "intf_types": ["vs:webbrowser", "vs:paramhttp"], + "intf_roles": ["", "std"] + }) + + assert (rsc.service._baseurl == "http://b") + + def test_capless(self): + rsc = _makeRegistryRecord({}) + + with pytest.raises(ValueError) as excinfo: + rsc.service._baseurl + + assert str(excinfo.value) == ( + "No matching interface.") + + +@pytest.mark.remote_data +def test_get_contact(): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/flashheros/q/ssa"}) + assert (rsc.get_contact() + == "GAVO Data Center Team (++49 6221 54 1837)" + " ") + + +@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', + 'flash_service') +class TestExtraResourceMethods: + """ + tests for methods of RegistryResource containing some non-trivial + logic (except service selection, which is in TestInterfaceSelection, + and get_tables, which is in TestGetTables). + """ + + def test_unique_standard_id(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a"], + "standard_ids": ["ivo://ivoa.net/std/tap"], + "intf_types": ["vs:paramhttp"], + "intf_roles": ["std"] + }) + assert rsc.standard_id == "ivo://ivoa.net/std/tap" + + def test_describe_multi(self, flash_service): + out = io.StringIO() + flash_service.describe(verbose=True, file=out) + output = out.getvalue() + + assert "Flash/Heros SSAP" in output + assert ("Access modes: datalink#links-1.0, soda#sync-1.0," + " ssa, tap#aux, web" in output) + + assert "More info: http://dc.zah" in output + + +# TODO: While I suppose the contact test should keep requiring network, +# I think we should can the network responses involved in the following; +# the stuff might change upstream any time and then break our unit tests. +@pytest.mark.remote_data +@pytest.fixture() +def flash_tables(): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/flashheros/q/ssa"}) + return rsc.get_tables() + + +@pytest.mark.usefixtures("flash_tables") +class TestGetTables: + @pytest.mark.remote_data + def test_get_tables_limit_enforced(self): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/tap"}) + with pytest.raises(dalq.DALQueryError) as excinfo: + rsc.get_tables() + + assert re.match(r"Resource ivo://org.gavo.dc/tap reports \d+ tables." + " Pass a higher table_limit to see them all.", str(excinfo.value)) + + @pytest.mark.remote_data + def test_get_tables_names(self, flash_tables): + assert (list(sorted(flash_tables.keys())) + == ["flashheros.data", "ivoa.obscore"]) + + @pytest.mark.remote_data + def test_get_tables_table_instance(self, flash_tables): + assert (flash_tables["ivoa.obscore"].name + == "ivoa.obscore") + assert (flash_tables["ivoa.obscore"].description + == "This data collection is queriable in GAVO Data" + " Center's obscore table.") + assert (flash_tables["flashheros.data"].title + == "Flash/Heros SSA table") + + assert (flash_tables["flashheros.data"].origin.ivoid + == "ivo://org.gavo.dc/flashheros/q/ssa") + + @pytest.mark.remote_data + def test_get_tables_column_meta(self, flash_tables): + def getflashcol(name): + for col in flash_tables["flashheros.data"].columns: + if name==col.name: + return col + raise KeyError(name) + + assert getflashcol("accref").datatype.content == "char" + assert getflashcol("accref").datatype.arraysize == "*" + +# TODO: upstream bug: the following needs to fixed in DaCHS before +# the assertion passes + # assert getflashcol("ssa_region").datatype._extendedtype == "point" + + assert getflashcol("mime").ucd == 'meta.code.mime' + + assert getflashcol("ssa_specend").unit == "m" + + assert (getflashcol("ssa_specend").utype + == "ssa:char.spectralaxis.coverage.bounds.stop") + + assert (getflashcol("ssa_fluxcalib").description + == "Type of flux calibration") diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py new file mode 100644 index 000000000..fea4f33c6 --- /dev/null +++ b/pyvo/registry/tests/test_rtcons.py @@ -0,0 +1,388 @@ +#!/usr/bin/env python +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Tests for pyvo.registry.rtcons, i.e. RegTAP constraints and query building. +""" + +import datetime + +from astropy import time +from astropy import units +from astropy.coordinates import SkyCoord +import numpy +import pytest + +from pyvo import registry +from pyvo.registry import rtcons +from pyvo.dal import query as dalq + +from .commonfixtures import messenger_vocabulary + + +class TestAbstractConstraint: + def test_no_search_condition(self): + with pytest.raises(NotImplementedError): + rtcons.Constraint().get_search_condition() + + +class TestSQLLiterals: + @pytest.fixture(scope="class", autouse=True) + def literals(self): + class _WithFillers(rtcons.Constraint): + _fillers = { + "aString": "some harmless stuff", + "nastyString": "that's not nasty", + "bytes": b"keep this ascii for now", + "anInt": 210, + "aFloat": 5e7, + "numpyStuff": numpy.float64(23.7), + "timestamp": datetime.datetime(2021, 6, 30, 9, 1),} + + return _WithFillers()._get_sql_literals() + + def test_strings(self, literals): + assert literals["aString"] == "'some harmless stuff'" + assert literals["nastyString"] == "'that''s not nasty'" + + def test_bytes(self, literals): + assert literals["bytes"] == "'keep this ascii for now'" + + def test_int(self, literals): + assert literals["anInt"] == "210" + + def test_float(self, literals): + assert literals["aFloat"] == "50000000.0" + + def test_numpy(self, literals): + assert float(literals["numpyStuff"])-23.7<1e-10 + + def test_timestamp(self, literals): + assert literals["timestamp"] == "'2021-06-30T09:01:00'" + + def test_odd_type_rejected(self): + with pytest.raises(ValueError) as excinfo: + rtcons.make_sql_literal({}) + assert str(excinfo.value) == "Cannot format {} as a SQL literal" + + +class TestFreetextConstraint: + def test_basic(self): + assert (rtcons.Freetext("star").get_search_condition() + == "ivoid IN (SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_description, 'star') UNION SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_title, 'star') UNION SELECT ivoid FROM rr.res_subject WHERE res_subject ILIKE '%star%')") + + def test_interesting_literal(self): + assert (rtcons.Freetext("α Cen's planets").get_search_condition() + == "ivoid IN (SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_description, 'α Cen''s planets') UNION SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_title, 'α Cen''s planets') UNION SELECT ivoid FROM rr.res_subject WHERE res_subject ILIKE '%α Cen''s planets%')") + + +class TestAuthorConstraint: + def test_basic(self): + assert (rtcons.Author("%Hubble%").get_search_condition() + == "role_name LIKE '%Hubble%' AND base_role='creator'") + + +class TestServicetypeConstraint: + def test_standardmap(self): + assert (rtcons.Servicetype("scs").get_search_condition() + == "standard_id IN ('ivo://ivoa.net/std/conesearch')") + + def test_fulluri(self): + assert (rtcons.Servicetype("http://extstandards/invention" + ).get_search_condition() + == "standard_id IN ('http://extstandards/invention')") + + def test_multi(self): + assert (rtcons.Servicetype("http://extstandards/invention", "image" + ).get_search_condition() + == "standard_id IN ('http://extstandards/invention'," + " 'ivo://ivoa.net/std/sia')") + + def test_includeaux(self): + assert (rtcons.Servicetype("http://extstandards/invention", "image" + ).include_auxiliary_services().get_search_condition() + == "standard_id IN ('http://extstandards/invention'," + " 'http://extstandards/invention#aux'," + " 'ivo://ivoa.net/std/sia'," + " 'ivo://ivoa.net/std/sia#aux')") + + def test_junk_rejected(self): + with pytest.raises(dalq.DALQueryError) as excinfo: + rtcons.Servicetype("junk") + assert str(excinfo.value) == ("Service type junk is neither" + " a full standard URI nor one of the bespoke identifiers" + " image, sia, spectrum, ssap, ssa, scs, conesearch, line, slap," + " table, tap") + + def test_legacy_term(self): + assert (rtcons.Servicetype("conesearch").get_search_condition() + == "standard_id IN ('ivo://ivoa.net/std/conesearch')") + + +@pytest.mark.usefixtures('messenger_vocabulary') +class TestWavebandConstraint: + def test_basic(self): + assert (rtcons.Waveband("Infrared", "EUV").get_search_condition() + == "1 = ivo_hashlist_has(rr.resource.waveband, 'infrared')" + " OR 1 = ivo_hashlist_has(rr.resource.waveband, 'euv')") + + def test_junk_rejected(self): + with pytest.raises(dalq.DALQueryError) as excinfo: + rtcons.Waveband("junk") + assert str(excinfo.value) == ("Waveband junk is not in the IVOA messenger vocabulary http://www.ivoa.net/rdf/messenger.") + + def test_normalisation(self): + assert (rtcons.Waveband("oPtIcAl").get_search_condition() + == "1 = ivo_hashlist_has(rr.resource.waveband, 'optical')") + + +class TestDatamodelConstraint: + def test_junk_rejected(self): + with pytest.raises(dalq.DALQueryError) as excinfo: + rtcons.Datamodel("junk") + assert str(excinfo.value) == ( + "Unknown data model id junk. Known are: epntap, obscore, regtap.") + + def test_obscore(self): + cons = rtcons.Datamodel("ObsCore") + assert (cons.get_search_condition() + == "detail_xpath = '/capability/dataModel/@ivo-id'" + " AND 1 = ivo_nocasematch(detail_value," + " 'ivo://ivoa.net/std/obscore%')") + assert(cons._extra_tables==["rr.res_detail"]) + + def test_epntap(self): + cons = rtcons.Datamodel("epntap") + assert (cons.get_search_condition() + == "table_utype LIKE ivo://vopdc.obspm/std/epncore#schema-2.%'" + " OR table_utype LIKE ivo://ivoa.net/std/epntap#table-2.%'") + assert(cons._extra_tables==["rr.res_table"]) + + def test_regtap(self): + cons = rtcons.Datamodel("regtap") + assert (cons.get_search_condition() + == "detail_xpath = '/capability/dataModel/@ivo-id'" + " AND 1 = ivo_nocasematch(detail_value," + " 'ivo://ivoa.net/std/RegTAP#1.%')") + assert(cons._extra_tables==["rr.res_detail"]) + + +class TestIvoidConstraint: + def test_basic(self): + cons = rtcons.Ivoid("ivo://example/some_path") + assert (cons.get_search_condition() == + "ivoid = 'ivo://example/some_path'") + + +class TestUCDConstraint: + def test_basic(self): + cons = rtcons.UCD("phot.mag;em.opt.%", "phot.mag;em.ir.%") + assert (cons.get_search_condition() == + "ucd LIKE 'phot.mag;em.opt.%' OR ucd LIKE 'phot.mag;em.ir.%'") + + +class TestSpatialConstraint: + def test_point(self): + cons = registry.Spatial([23, -40]) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, POINT(23, -40)), coverage)") + assert(cons._extra_tables==["rr.stc_spatial"]) + + def test_circle_and_order(self): + cons = registry.Spatial([23, -40, 0.25], order=7) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(7, CIRCLE(23, -40, 0.25)), coverage)") + + def test_polygon(self): + cons = registry.Spatial([23, -40, 26, -39, 25, -43]) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, POLYGON(23, -40, 26, -39, 25, -43))," + " coverage)") + + def test_moc(self): + cons = registry.Spatial("0/1-3 3/") + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC('0/1-3 3/'), coverage)") + + def test_SkyCoord(self): + cons = registry.Spatial(SkyCoord(3*units.deg, -30*units.deg)) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, POINT(3.0, -30.0)), coverage)") + assert(cons._extra_tables==["rr.stc_spatial"]) + + def test_SkyCoord_Circle(self): + cons = registry.Spatial((SkyCoord(3*units.deg, -30*units.deg), 3)) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, CIRCLE(3.0, -30.0, 3)), coverage)") + assert(cons._extra_tables==["rr.stc_spatial"]) + + +class TestSpectralConstraint: + # These tests might need some float literal fuzziness. I'm just + # too lazy at this point to see if pytest has something on board + # that would be useful there. + def test_energy_float(self): + cons = registry.Spectral(1e-19) + assert (cons.get_search_condition() == + "1e-19 BETWEEN spectral_start AND spectral_end") + + def test_energy_eV(self): + cons = registry.Spectral(5*units.eV) + assert (cons.get_search_condition() == + "8.01088317e-19 BETWEEN spectral_start AND spectral_end") + + def test_energy_interval(self): + cons = registry.Spectral((1e-10*units.erg, 2e-10*units.erg)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end," + " 1e-17, 2e-17)") + + def test_wavelength(self): + cons = registry.Spectral(5000*units.Angstrom) + assert (cons.get_search_condition() == + "3.9728917142978567e-19 BETWEEN spectral_start AND spectral_end") + + def test_wavelength_interval(self): + cons = registry.Spectral((20*units.cm, 22*units.cm)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end," + " 9.932229285744642e-25, 9.029299350676949e-25)") + + def test_frequency(self): + cons = registry.Spectral(2*units.GHz) + assert (cons.get_search_condition() == + "1.32521403e-24 BETWEEN spectral_start AND spectral_end") + + def test_frequency_interval(self): + cons = registry.Spectral((88*units.MHz, 102*units.MHz)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end," + " 5.830941732e-26, 6.758591553e-26)") + + +class TestTemporalConstraint: + def test_plain_float(self): + cons = registry.Temporal((54130, 54200)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(time_start, time_end," + " 54130, 54200)") + + def test_single_time(self): + cons = registry.Temporal(time.Time('2022-01-10')) + assert (cons.get_search_condition() == + "59589.0 BETWEEN time_start AND time_end") + + def test_time_interval(self): + cons = registry.Temporal((time.Time(2459000, format='jd'), + time.Time(59002, format='mjd'))) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(time_start, time_end, 58999.5, 59002.0)") + + def test_multi_times_rejected(self): + with pytest.raises(ValueError) as excinfo: + cons = registry.Temporal(time.Time(['1999-01-01', '2010-01-01'])) + assert (str(excinfo.value) == "RegTAP time constraints must" + " be made from single time instants.") + + +class TestWhereClauseBuilding: + @staticmethod + def where_clause_for(*args, **kwargs): + cons = list(args)+rtcons.keywords_to_constraints(kwargs) + return rtcons.build_regtap_query(cons + ).split("\nWHERE\n", 1)[1].split("\nGROUP BY\n")[0] + + @pytest.mark.usefixtures('messenger_vocabulary') + def test_from_constraints(self): + assert self.where_clause_for( + rtcons.Waveband("EUV"), + rtcons.Author("%Hubble%") + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" + " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + + @pytest.mark.usefixtures('messenger_vocabulary') + def test_from_keywords(self): + assert self.where_clause_for( + waveband="EUV", + author="%Hubble%" + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" + " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + + @pytest.mark.usefixtures('messenger_vocabulary') + def test_mixed(self): + assert self.where_clause_for( + rtcons.Waveband("EUV"), + author="%Hubble%" + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" + " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + + def test_bad_keyword(self): + with pytest.raises(TypeError) as excinfo: + rtcons.build_regtap_query( + *rtcons.keywords_to_constraints({"foo": "bar"})) + # the following assertion will fail when new constraints are + # defined (or old ones vanish). I'd say that's a convenient + # way to track changes; so, let's update the assertion as we + # go. + assert str(excinfo.value) == ("foo is not a valid registry" + " constraint keyword. Use one of" + " author, datamodel, ivoid, keywords, servicetype," + " spatial, spectral, temporal, ucd, waveband.") + + def test_with_legacy_keyword(self): + assert self.where_clause_for( + "plain", "string" + ) == ( + '(ivoid IN (SELECT ivoid FROM rr.resource WHERE ' + "1=ivo_hasword(res_description, 'plain') UNION SELECT ivoid FROM rr.resource " + "WHERE 1=ivo_hasword(res_title, 'plain') UNION SELECT ivoid FROM " + "rr.res_subject WHERE res_subject ILIKE '%plain%'))\n" + ' AND (ivoid IN (SELECT ivoid FROM rr.resource WHERE ' + "1=ivo_hasword(res_description, 'string') UNION SELECT ivoid FROM rr.resource " + "WHERE 1=ivo_hasword(res_title, 'string') UNION SELECT ivoid FROM " + "rr.res_subject WHERE res_subject ILIKE '%string%'))") + + +class TestSelectClause: + def test_expected_columns(self): + # This will break as regtap.RegistryResource.expected_columns + # is changed. Just update the assertion then. + assert rtcons.build_regtap_query( + rtcons.keywords_to_constraints({"author": "%Hubble%"}) + ).split("\nFROM\nrr.resource\n")[0] == ( + "SELECT\n" + "ivoid, " + "res_type, " + "short_name, " + "res_title, " + "content_level, " + "res_description, " + "reference_url, " + "creator_seq, " + "content_type, " + "source_format, " + "source_value, " + "region_of_regard, " + "waveband, " + "\n ivo_string_agg(COALESCE(access_url, ''), ':::py VO sep:::') AS access_urls, " + "\n ivo_string_agg(COALESCE(standard_id, ''), ':::py VO sep:::') AS standard_ids, " + "\n ivo_string_agg(COALESCE(intf_type, ''), ':::py VO sep:::') AS intf_types, " + "\n ivo_string_agg(COALESCE(intf_role, ''), ':::py VO sep:::') AS intf_roles") + + def test_group_by_columns(self): + # Again, this will break as regtap.RegistryResource.expected_columns + # is changed. Just update the assertion then. + assert rtcons.build_regtap_query([rtcons.Author("%Hubble%")] + ).split("\nGROUP BY\n")[-1] == ( + "ivoid, " + "res_type, " + "short_name, " + "res_title, " + "content_level, " + "res_description, " + "reference_url, " + "creator_seq, " + "content_type, " + "source_format, " + "source_value, " + "region_of_regard, " + "waveband") diff --git a/setup.cfg b/setup.cfg index 986abe191..733e9ee26 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,7 +42,7 @@ packages = find: zip_safe = False setup_requires = setuptools_scm install_requires = - astropy>=4.0 + astropy>=4.1 requests python_requires = >=3.8 diff --git a/tox.ini b/tox.ini index c48bf92e8..bc71fe1f0 100644 --- a/tox.ini +++ b/tox.ini @@ -36,12 +36,12 @@ commands = # description = run tests - oldestdeps: with astropy 4.0.* + oldestdeps: with astropy 4.1.* devastropy: with astropy latest deps = devastropy: git+https://github.com/astropy/astropy.git#egg=astropy - oldestdeps: astropy==4.0 + oldestdeps: astropy==4.1 # We set a suitably old numpy along with an old astropy, no need to pick up # deprecations and errors due to their unmatching versions oldestdeps: numpy==1.16