Your application was succesfully submitted:

5c7ba9e6ef779562381cd489

29/07/2024 6:25 AM

Passport

Contact information

Welcome to this NGI SEARCH Open Call

We strongly recommend to carefully read the Guide for Applicants (GfA) and Frequently Asked Questions (FAQ) documents before starting to fill out this form.

More importantly, please follow the Signup & Application Instructions here for a seamless Open Call Management platform signup process and application form completion. They include crucial elements to take into account!

Hannah Bast

+491637683183

bast@informatik.uni-freiburg.de

Germany

Project

Established

Search and discovery features for existing digital common projects Natural language processing

Make the QLever graph database fully compliant with the SPARQL 1.1 standard by the W3C, while maintaining its high scalability and efficiency advantage over other graph databases.

QLever is a graph database with several unique features. Above all, it is extremely efficient and can handle RDF datasets of hundreds of billions of triples on a standard PC. It also shines on smaller datasets, where it can process queries much faster than other engines. QLever is already well known and used. The main road block for a wider usage is its full compliance to the SPARQL 1.1 standard. This is harder for QLever than for other databases because every feature we implement must not only be correct, but also macht our efficiency requirements. The goal of this project is to make QLever fully compliant with the SPARQL 1.1 standard, while maintaining its extremely high efficiency.

https://qlever.cs.uni-freiburg.de

More and more initiatives make their data publicly available as RDF. Prominent examples are: Wikidata (20 billion triples), PubChem (19 billion triples), OpenStreetMap (70 billion triples), and UniProt (160 billion triples). RDF is an elegant data model, standardized by the W3C since 2004, which has interoperability at its core. It does not only allow concise semantic searches of the individual datasets, but also federated search over arbitrary combinations of datasets.

Many graph databases exist, but most are slow for complex queries and cannot handle large datasets (like the above) at all. Until recently there has only been single open-source software (by a company, OpenLink Virtuoso) that can handle tens of billions of triples, however, with various limitations and an old codebase written in C. QLever’s mission is to close this gap, with a fully open-source project that is written in modern C++, and that can handle even the largest datasets efficiently on a standard machine.

Minimum Quality Criteria (MQC)

NOTE: As indicated in the Guide for Applicants, applications will be rejected if your project does not meet the basic MQC requirements.

https://github.com/ad-freiburg/qlever

QLever is fully open-source and all development happens in full daylight, progressing via pull requests of a well-digestible size (not too small and not too large). All code is reviewed. The test coverage is very high and all new code should aim at a test coverage close to 100%. There is extensive continuous integration, in particular: support for a variety of compilers and platforms, automatic testing, and automatic static analysis of the code.

The code (as well the individual pull requests and commits) is thoroughly documented, which cannot be said of many other graph databases. This is important for the onboarding of new contributors. So far, QLever has attracted 26 contributors, including several from outside the original core group.

The project has a very lively issue tracker, discussion forum, and Wiki. Besides documentation of the code, there is also documentation of the overall architectures and of the main design principles.

https://qlever.cs.uni-freiburg.de

The website https://qlever.cs.uni-freiburg.de provides SPARQL endpoints, based on QLever, for many of the most important publicly available RDF datasets, including: Wikidata, PubChem, OpenStreetMap, and UniProt. Beyond a standardized API, the website also provides a powerful user interface, which allows the incremental construction of SPARQL queries using interactive suggestions obtained after each keystroke. These suggestions are realized themselves via SPARQL queries and are unique to QLever because they only work with a sufficiently efficient query engine.

The DBLP bibliography for computer science has set up its own endpoint based on QLever: https://sparql.dblp.org . The DBLP website alone gets over 10 million page impressions every month.

All endpoints, including the one for DBLP, can also be set up by users themselves, on their own machine, using a tool available under https://github.com/ad-freiburg/qlever-control .

For the impact, these services have on the community, see B.2.

https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/WDQS_backend_update/WDQS_backend_alternatives

There is a large community behind each of the aforementioned datasets. QLever has already begun to impact each of them, and we expect more impact in the future. We give two examples:

1. Wikidata is struggling for years with its growing dataset and its current graph database is already stretched beyond its limits. QLever is currently on the shortlist and the most promising candidate, see https://www.wikidata.org/wiki/Wikidata:SPARQLqueryservice/WDQSbackendupdate/WDQSbackendalternatives . The main obstacle is that QLever is not yet fully compliant to the SPARQL 1.1 standard.

2. OpenStreetMap so far has its own tailor-made tool (“Overpass”) for querying its huge data. However, the query language is not standardized and there is no interoperability with other datasets, like Wikidata. QLever enables that and the community has already started to adopt it: https://wiki.openstreetmap.org/wiki/QLever . In particular, our endpoint is used to find errors and inconsistencies in the data.

Excellence

Excellence description

Ambition: Applicants have to demonstrate to what extent the proposed project is beyond the State of the Art and describe the innovative approach behind it (e.g. ground-breaking objectives, novel concepts and approaches, new organisational models).

Innovation: Applicants should provide information about the level of innovation within their market and about the degree of differentiation that this project will bring.

QLever is already well known and used, see the descriptions in the fields above. The focus of our development so far has been on the core features, in particular, on the central data structures and algorithms for query planning and query processing and their careful and extensible implementation in modern C++. That is what makes QLever so fast and sets it apart from other graph databases.

The main road block for wider employment is full compliance to the SPARQL 1.1 standard by the W3C. In particular, this has been explicitly (and independently) formulated by the following three projects: Wikidata, UniProt, and OpenStreetMap. In particular, a full implementation of SPARQL 1.1 Update is needed (dynamic changes of the dataset).

It is the goal of this project to achieve this full SPARQL 1.1 compliance. This is more challenging than for other graph databases because of the strong efficiency requirements of QLever, see explanations for the the next field (“Ambition”).

We use this field to describe what sets QLever apart from other graph databases.

1. Most graph databases use standard algorithms for their core components. For QLever, the first question we ask for every core component is: What is the best algorithm for this task. Our extensive experience in algorithms research obviously helps.

2. It is not enough to choose the theoretically best algorithm. It also has to be implemented carefully and perform well in practice. This is an art known as algorithm engineering. Hannah Bast has been practicing and teaching this for over 20 years.

3. The choice of programming language is important. None of the graph databases written in Java can handle large datasets efficiently (or at all). The only other engine that comes close to QLever’s efficiency is Virtuoso, but its codebase is old, poorly documented, and written in C, which is a major road block for further development. QLever is written in modern C++ and very well documented.

Any project that provides their data as RDF benefits from an efficient graph database in multiple ways:

1. The ability to carry out complex queries. Many existing graph databases are too slow for this, even on medium-sized datasets.

2. The ability to compute and download large results. Existing graph databases have problems with this or cannot do it at all. QLever is explicitly designed to handle this.

3. Statistics queries and queries that identify errors in the dataset. These are often among the most compute-intensive queries and many existing graph databases cannot handle them, QLever can.

4. QLever provides context-sensitive auto-completion that lets users construct SPARQL queries incrementally, requiring only a basic understanding of SPARQL and no particular knowledge of the dataset. This is a unique feature of QLever.

5. QLever allows complex spatial queries and the interactive display of very large numbers of geometric objects on a map. No other spatial database has this feature.

Already now, QLever is the fastest graph database on the market, by a wide margin. As described above, this is thanks to its sophisticated and carefully designed core algorithms and data structures, the very careful algorithm engineering, and the use of modern C++.

As mentioned above, and elaborated more in the Section on “Implementation” below, we have extensive experience in all these fields (algorithm design, algorithm engineering, C++, system building).

Continuing along these lines, we have no doubts that we can make QLever fully compliant with the SPARQL 1.1 standard of the W3C, while maintaining the extraordinary high efficiency.

Impact

Impact Description

At least 2 out of the 3 impacts listed below need to be addressed (see explanation text for each one of the following 3 criteria)

  • I Market opportunity
  • II Open-Source based Commercial Strategy and Scalability
  • III Environmental and social impact

Market potential: The market for graph databases is booming; the recent survey https://arxiv.org/abs/2102.13027 from 2021 lists over one hundred graph databases. According to a recent Gartner report, “Semantic Data Integration & Knowledge Graphs” is one of the top-10 trends in Data Integration and Engineering: https://www.linkedin.com/posts/juansequeda_add-semantic-data-integration-knowledge-activity-7196105766615801856-FOIk/

Degree of competition: We keep a close eye on the other graph databases. According to a recent performance evaluation, QLever is by far the most efficient: https://github.com/ad-freiburg/qlever/wiki/QLever-performance-evaluation-and-comparison-to-other-SPARQL-engines

End users needs: As described above, users from various communities (Wikidata, OpenStreetMap, UniProt, …) are currently experiencing significant limitations with current tools because of long query times and limited query capabilities. Qlever can overcome all of these limitations.

Interoperability of datasets is one of the most important topics of our time. An area, where this is particularly evident, is health care. The current situation is still bleak: different hospitals (and often even different departments in the same hospital) use different (often proprietary) systems to store their data, which makes an exchange very difficult.

The HL7 FHIR standard has been a big step forward in this respect in that it creates a common (non-proprietary) exchange format. One of its base standards is RDF, which is the basis for interoperability.

Once large amounts of health-care data become available as FHIR-RDF, efficient graph databases will be key for storing and querying them, just like they are key already now for bis projects like Wikidata, UniProt, or OpenStreetMap. We expect this to happen soon. Then an efficient graph database like QLever has the potential to be a game changer.

We already mentioned how other projects (Wikidata, OpenStreetMap, …) each have their own community with own specific use cases: complex queries, downloading of parts of the dataset, statistics queries, explorative queries, and queries that aim at finding errors or inconsistencies in the dataset.

All these projects suffer from efficiency issues with their current systems. The main road block for using QLever is the missing compliance with the full SPARQL 1.1 standard. Once this compliance is reached, a quick adoption of QLever is very likely, with the corresponding advantages for the users from these communities.

We also reiterate that QLever makes it easy for users to set up services on their own machines. This is harder for other engines not only because the setup is often complicated, but more importantly, because other graph databases require expensive machines or even multiple machines, whereas QLever is designed to function well on a standard PC with moderate resources.

Implementation

Implementation Description

Team: You should see yourself as an NGI Searcher with the ambition of changing the governance of social networks, management and leadership qualities for the better.

Resources: Demonstrate the quality and effectiveness of the resources assigned to complete the proposed milestones.

Hannah Bast has 35 years of experience in algorithms research and building software systems that actually work in practice. In particular, she is known for CompleteSearch, the search technology behind https://dblp.org , the public transit routing on https://www.google.com/maps (designed and implemented during an extended sabbatical at Google), and for https://qlever.cs.uni-freiburg.de .

Johannes Kalmbach has been working on QLever in Hannah Bast’s group since 2018. In a short time, he has become QLever’s chief developer, introducing many important innovations to the code and helping numerous contributors with the onboarding. He is very proficient in modern C++. His commit history speaks for itself:
https://github.com/joka921

Robin Textor-Falconi has been working on QLever in Hannah Bast’s group since 2021. He has implemented live query analysis and is currently working on reducing QLever’s memory footprint during query processing: https://github.com/RobinTF .

We are very enthusiastic about building software systems, based on sophisticated algorithms and data structures, that bring powerful search capabilities to users. Our prime goals are high efficiency, resourcefulness, and making it as easy as possible for users to formulate complex queries with as little expertise as possible. QLever also provides an intuitive query analysis tool, which helps users understand the results and the resource requirements of their queries.

At the same time, we also want to cater to expert users, giving them the possibility to understand what is happening under the hood if they want to. A perfect example for this is our QLever command-line tool at https://github.com/ad-freiburg/qlever-control . Setting up an own SPARQL endpoint is as easy as “qlever setup-config wikidata && qlever get-data && qlever index && qlever start”. On demand, the tool also provides the detailed command lines it uses and is highly configurable.

Hannah Bast

University of Freiburg, Chair for Algorithms and Data Structures

Female

Oversees the complete development of QLever, hiring, documentation, code reviews, coding herself.

https://ad.informatik.uni-freiburg.de/staff/bast/cv

https://ad.informatik.uni-freiburg.de

Team members (Press the yellow (+) button below to add up to 2 other team members)

Johannes Kalmbach

Ph.D. student

Germany

--

--

Robin Textor-Falconi

Prospective Ph.D. student

Germany

--

--
Other Team Information

Please also provide the following additional information about the team.

Johannes Kalmbach and Robin Text Falconi can work on the project full time.
Hannah Bast can spend more than 50% of her time on the project.

N/A

Work Plan and Resources to be committed

We want to complete the following four milestones, each of which requires about six months of if performed by a single person (the third and fourth milestone can be easily split up):

1. Implement SPARQL 1.1 Update. This concerns dynamic updates of the dataset and is a deal-breaker for all of the projects mentioned above (Wikidata, OpenStreetMap, UniProt).

2. Implement SPARQL 1.1 Federated search . QLever already has a basic implementation, but important features like variable SERVICE IRIs are still missing. The implementation is not yet efficient when large results are involved.


3. Implement missing SPARQL 1.1 features. This is a hard requirement by all the projects mentioned above. In particular, support for named graphs is used in many applications and still missing.


4. Implement missing GeoSPARQL features. This is important for projects based on OpenStreetMap data. In particular, dynamic spatial joins and primitives like geof:distance are not yet supported.

150

The money will be used to pay two full-time positions for 9 months each (Johannes Kalmbach and Robin Textor-Falconi, see above), as well two student assistants.

The software development of QLever requires people with a strong background in algorithms, but who are also able to put these ideas into practice, and who are experienced in writing professional C++ code. Johannes Kalmbach and Robin Text-Falconi are ideal candidates for this job, given their track record so far.

The student assistants will help with coding tasks that require less expertise. We have several competent candidates for these jobs.

Statistical Section

Statistical Section Description

We kindly ask you to fill in some statistical questions about how you heard about NGI Search Open Call. Thank you!

Word of mouth

DECLARATION OF HONOUR

Declaration of Honour

Please carefully read the statements below. You will not be able to change the statements after the deadline. By ticking the boxes below, I confirm that:

Moreover, the entity I represent, or persons with power of representation, decision-making or control over the aforementioned legal entity:

PROCESSING OF PERSONAL DATA

Processing of Personal Data Description

You can read the GDPR (processing of personal data) information clause for this open call following this link here.

Yes

Yes

Yes

YES

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb250YWN0X2xlZ2FsX2luZm9ybWF0aW9uIjp7ImNvdW50cnkiOiJHZXJtYW55IiwiZW1haWwiOiJiYXN0QGluZm9ybWF0aWsudW5pLWZyZWlidXJnLmRlIiwicGhvbmVfbnVtYmVyIjoiKzQ5MTYzNzY4MzE4MyIsInRlYW1fbGVhZGVyIjoiSGFubmFoIEJhc3QifSwiZm9ybV9zZWN0aW9uXzIiOnsiYnJpZWZ0X2Rlc2NyaXB0aW9uIjoiUUxldmVyIGlzIGEgZ3JhcGggZGF0YWJhc2Ugd2l0aCBzZXZlcmFsIHVuaXF1ZSBmZWF0dXJlcy4gQWJvdmUgYWxsLCBpdCBpcyBleHRyZW1lbHkgZWZmaWNpZW50IGFuZCBjYW4gaGFuZGxlIFJERiBkYXRhc2V0cyBvZiBodW5kcmVkcyBvZiBiaWxsaW9ucyBvZiB0cmlwbGVzIG9uIGEgc3RhbmRhcmQgUEMuIEl0IGFsc28gc2hpbmVzIG9uIHNtYWxsZXIgZGF0YXNldHMsIHdoZXJlIGl0IGNhbiBwcm9jZXNzIHF1ZXJpZXMgbXVjaCBmYXN0ZXIgdGhhbiBvdGhlciBlbmdpbmVzLiBRTGV2ZXIgaXMgYWxyZWFkeSB3ZWxsIGtub3duIGFuZCB1c2VkLiBUaGUgbWFpbiByb2FkIGJsb2NrIGZvciBhIHdpZGVyIHVzYWdlIGlzIGl0cyBmdWxsIGNvbXBsaWFuY2UgdG8gdGhlIFNQQVJRTCAxLjEgc3RhbmRhcmQuIFRoaXMgaXMgaGFyZGVyIGZvciBRTGV2ZXIgdGhhbiBmb3Igb3RoZXIgZGF0YWJhc2VzIGJlY2F1c2UgZXZlcnkgZmVhdHVyZSB3ZSBpbXBsZW1lbnQgbXVzdCBub3Qgb25seSBiZSBjb3JyZWN0LCBidXQgYWxzbyBtYWNodCBvdXIgZWZmaWNpZW5jeSByZXF1aXJlbWVudHMuIFRoZSBnb2FsIG9mIHRoaXMgcHJvamVjdCBpcyB0byBtYWtlIFFMZXZlciBmdWxseSBjb21wbGlhbnQgd2l0aCB0aGUgU1BBUlFMIDEuMSBzdGFuZGFyZCwgd2hpbGUgbWFpbnRhaW5pbmcgaXRzIGV4dHJlbWVseSBoaWdoIGVmZmljaWVuY3kuIiwiY3JpdGVyaWFfZGVzY3JpcHRpb24iOiJRTGV2ZXIgaXMgZnVsbHkgb3Blbi1zb3VyY2UgYW5kIGFsbCBkZXZlbG9wbWVudCBoYXBwZW5zIGluIGZ1bGwgZGF5bGlnaHQsIHByb2dyZXNzaW5nIHZpYSBwdWxsIHJlcXVlc3RzIG9mIGEgd2VsbC1kaWdlc3RpYmxlIHNpemUgKG5vdCB0b28gc21hbGwgYW5kIG5vdCB0b28gbGFyZ2UpLiBBbGwgY29kZSBpcyByZXZpZXdlZC4gVGhlIHRlc3QgY292ZXJhZ2UgaXMgdmVyeSBoaWdoIGFuZCBhbGwgbmV3IGNvZGUgc2hvdWxkIGFpbSBhdCBhIHRlc3QgY292ZXJhZ2UgY2xvc2UgdG8gMTAwJS4gVGhlcmUgaXMgZXh0ZW5zaXZlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24sIGluIHBhcnRpY3VsYXI6IHN1cHBvcnQgZm9yIGEgdmFyaWV0eSBvZiBjb21waWxlcnMgYW5kIHBsYXRmb3JtcywgYXV0b21hdGljIHRlc3RpbmcsIGFuZCBhdXRvbWF0aWMgc3RhdGljIGFuYWx5c2lzIG9mIHRoZSBjb2RlLlxuXG5UaGUgY29kZSAoYXMgd2VsbCB0aGUgaW5kaXZpZHVhbCBwdWxsIHJlcXVlc3RzIGFuZCBjb21taXRzKSBpcyB0aG9yb3VnaGx5IGRvY3VtZW50ZWQsIHdoaWNoIGNhbm5vdCBiZSBzYWlkIG9mIG1hbnkgb3RoZXIgZ3JhcGggZGF0YWJhc2VzLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIG9uYm9hcmRpbmcgb2YgbmV3IGNvbnRyaWJ1dG9ycy4gU28gZmFyLCBRTGV2ZXIgaGFzIGF0dHJhY3RlZCAyNiBjb250cmlidXRvcnMsIGluY2x1ZGluZyBzZXZlcmFsIGZyb20gb3V0c2lkZSB0aGUgb3JpZ2luYWwgY29yZSBncm91cC5cblxuVGhlIHByb2plY3QgaGFzIGEgdmVyeSBsaXZlbHkgaXNzdWUgdHJhY2tlciwgZGlzY3Vzc2lvbiBmb3J1bSwgYW5kIFdpa2kuIEJlc2lkZXMgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29kZSwgdGhlcmUgaXMgYWxzbyBkb2N1bWVudGF0aW9uIG9mIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9mIHRoZSBtYWluIGRlc2lnbiBwcmluY2lwbGVzLiIsImNyaXRlcmlhX2Rlc2NyaXB0aW9uLTEzIjoiVGhlIHdlYnNpdGUgaHR0cHM6Ly9xbGV2ZXIuY3MudW5pLWZyZWlidXJnLmRlIHByb3ZpZGVzIFNQQVJRTCBlbmRwb2ludHMsIGJhc2VkIG9uIFFMZXZlciwgZm9yIG1hbnkgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHB1YmxpY2x5IGF2YWlsYWJsZSBSREYgZGF0YXNldHMsIGluY2x1ZGluZzogV2lraWRhdGEsIFB1YkNoZW0sIE9wZW5TdHJlZXRNYXAsIGFuZCBVbmlQcm90LiBCZXlvbmQgYSBzdGFuZGFyZGl6ZWQgQVBJLCB0aGUgd2Vic2l0ZSBhbHNvIHByb3ZpZGVzIGEgcG93ZXJmdWwgdXNlciBpbnRlcmZhY2UsIHdoaWNoIGFsbG93cyB0aGUgaW5jcmVtZW50YWwgY29uc3RydWN0aW9uIG9mIFNQQVJRTCBxdWVyaWVzIHVzaW5nIGludGVyYWN0aXZlIHN1Z2dlc3Rpb25zIG9idGFpbmVkIGFmdGVyIGVhY2gga2V5c3Ryb2tlLiBUaGVzZSBzdWdnZXN0aW9ucyBhcmUgcmVhbGl6ZWQgdGhlbXNlbHZlcyB2aWEgU1BBUlFMIHF1ZXJpZXMgYW5kIGFyZSB1bmlxdWUgdG8gUUxldmVyIGJlY2F1c2UgdGhleSBvbmx5IHdvcmsgd2l0aCBhIHN1ZmZpY2llbnRseSBlZmZpY2llbnQgcXVlcnkgZW5naW5lLlxuXG5UaGUgREJMUCBiaWJsaW9ncmFwaHkgZm9yIGNvbXB1dGVyIHNjaWVuY2UgaGFzIHNldCB1cCBpdHMgb3duIGVuZHBvaW50IGJhc2VkIG9uIFFMZXZlcjogaHR0cHM6Ly9zcGFycWwuZGJscC5vcmcgLiBUaGUgREJMUCB3ZWJzaXRlIGFsb25lIGdldHMgb3ZlciAxMCBtaWxsaW9uIHBhZ2UgaW1wcmVzc2lvbnMgZXZlcnkgbW9udGguXG5cbkFsbCBlbmRwb2ludHMsIGluY2x1ZGluZyB0aGUgb25lIGZvciBEQkxQLCBjYW4gYWxzbyBiZSBzZXQgdXAgYnkgdXNlcnMgdGhlbXNlbHZlcywgb24gdGhlaXIgb3duIG1hY2hpbmUsIHVzaW5nIGEgdG9vbCBhdmFpbGFibGUgdW5kZXIgaHR0cHM6Ly9naXRodWIuY29tL2FkLWZyZWlidXJnL3FsZXZlci1jb250cm9sIC4gXG5cbkZvciB0aGUgaW1wYWN0LCB0aGVzZSBzZXJ2aWNlcyBoYXZlIG9uIHRoZSBjb21tdW5pdHksIHNlZSBCLjIuIiwiZGVtbyI6Imh0dHBzOi8vcWxldmVyLmNzLnVuaS1mcmVpYnVyZy5kZSIsImVsaWdpYmxlX21pbmltdW1fcXVhbGl0eV9jcml0ZXJpYV9iMSI6dHJ1ZSwiZW1jX2IyIjp0cnVlLCJvYmxpZ2F0b3J5X2NyaXRlcmlvbiI6dHJ1ZSwicHJvamVjdF9zdGF0dXMiOiJFc3RhYmxpc2hlZCIsInNjb3BlIjoiTW9yZSBhbmQgbW9yZSBpbml0aWF0aXZlcyBtYWtlIHRoZWlyIGRhdGEgcHVibGljbHkgYXZhaWxhYmxlIGFzIFJERi4gUHJvbWluZW50IGV4YW1wbGVzIGFyZTogV2lraWRhdGEgKDIwIGJpbGxpb24gdHJpcGxlcyksIFB1YkNoZW0gKDE5IGJpbGxpb24gdHJpcGxlcyksIE9wZW5TdHJlZXRNYXAgKDcwIGJpbGxpb24gdHJpcGxlcyksIGFuZCBVbmlQcm90ICgxNjAgYmlsbGlvbiB0cmlwbGVzKS4gUkRGIGlzIGFuIGVsZWdhbnQgZGF0YSBtb2RlbCwgc3RhbmRhcmRpemVkIGJ5IHRoZSBXM0Mgc2luY2UgMjAwNCwgd2hpY2ggaGFzIGludGVyb3BlcmFiaWxpdHkgYXQgaXRzIGNvcmUuIEl0IGRvZXMgbm90IG9ubHkgYWxsb3cgY29uY2lzZSBzZW1hbnRpYyBzZWFyY2hlcyBvZiB0aGUgaW5kaXZpZHVhbCBkYXRhc2V0cywgYnV0IGFsc28gZmVkZXJhdGVkIHNlYXJjaCBvdmVyIGFyYml0cmFyeSBjb21iaW5hdGlvbnMgb2YgZGF0YXNldHMuXG5cbk1hbnkgZ3JhcGggZGF0YWJhc2VzIGV4aXN0LCBidXQgbW9zdCBhcmUgc2xvdyBmb3IgY29tcGxleCBxdWVyaWVzIGFuZCBjYW5ub3QgaGFuZGxlIGxhcmdlIGRhdGFzZXRzIChsaWtlIHRoZSBhYm92ZSkgYXQgYWxsLiBVbnRpbCByZWNlbnRseSB0aGVyZSBoYXMgb25seSBiZWVuIHNpbmdsZSBvcGVuLXNvdXJjZSBzb2Z0d2FyZSAoYnkgYSBjb21wYW55LCBPcGVuTGluayBWaXJ0dW9zbykgdGhhdCBjYW4gaGFuZGxlIHRlbnMgb2YgYmlsbGlvbnMgb2YgdHJpcGxlcywgaG93ZXZlciwgd2l0aCB2YXJpb3VzIGxpbWl0YXRpb25zIGFuZCBhbiBvbGQgY29kZWJhc2Ugd3JpdHRlbiBpbiBDLiBRTGV2ZXLigJlzIG1pc3Npb24gaXMgdG8gY2xvc2UgdGhpcyBnYXAsIHdpdGggYSBmdWxseSBvcGVuLXNvdXJjZSBwcm9qZWN0IHRoYXQgaXMgd3JpdHRlbiBpbiBtb2Rlcm4gQysrLCBhbmQgdGhhdCBjYW4gaGFuZGxlIGV2ZW4gdGhlIGxhcmdlc3QgZGF0YXNldHMgZWZmaWNpZW50bHkgb24gYSBzdGFuZGFyZCBtYWNoaW5lLiIsInRhZ2xpbmUiOiJNYWtlIHRoZSBRTGV2ZXIgZ3JhcGggZGF0YWJhc2UgZnVsbHkgY29tcGxpYW50IHdpdGggdGhlIFNQQVJRTCAxLjEgc3RhbmRhcmQgYnkgdGhlIFczQywgd2hpbGUgbWFpbnRhaW5pbmcgaXRzIGhpZ2ggc2NhbGFiaWxpdHkgYW5kIGVmZmljaWVuY3kgYWR2YW50YWdlIG92ZXIgb3RoZXIgZ3JhcGggZGF0YWJhc2VzLiIsInVybF9saW5rIjoiaHR0cHM6Ly9naXRodWIuY29tL2FkLWZyZWlidXJnL3FsZXZlciIsInVybF9saW5rLTEyIjoiaHR0cHM6Ly9xbGV2ZXIuY3MudW5pLWZyZWlidXJnLmRlIiwidXJsX2xpbmstMTUiOiJodHRwczovL3d3dy53aWtpZGF0YS5vcmcvd2lraS9XaWtpZGF0YTpTUEFSUUxfcXVlcnlfc2VydmljZS9XRFFTX2JhY2tlbmRfdXBkYXRlL1dEUVNfYmFja2VuZF9hbHRlcm5hdGl2ZXMiLCJ3b3JrX3Byb2dyYW1tZSI6WyJTZWFyY2ggYW5kIGRpc2NvdmVyeSBmZWF0dXJlcyBmb3IgZXhpc3RpbmcgZGlnaXRhbCBjb21tb24gcHJvamVjdHMiLCJOYXR1cmFsIGxhbmd1YWdlIHByb2Nlc3NpbmciXSwiY3JpdGVyaWFfZGVzY3JpcHRpb24tMTYiOiJUaGVyZSBpcyBhIGxhcmdlIGNvbW11bml0eSBiZWhpbmQgZWFjaCBvZiB0aGUgYWZvcmVtZW50aW9uZWQgZGF0YXNldHMuIFFMZXZlciBoYXMgYWxyZWFkeSBiZWd1biB0byBpbXBhY3QgZWFjaCBvZiB0aGVtLCBhbmQgd2UgZXhwZWN0IG1vcmUgaW1wYWN0IGluIHRoZSBmdXR1cmUuIFdlIGdpdmUgdHdvIGV4YW1wbGVzOlxuXG4xLiBXaWtpZGF0YSBpcyBzdHJ1Z2dsaW5nIGZvciB5ZWFycyB3aXRoIGl0cyBncm93aW5nIGRhdGFzZXQgYW5kIGl0cyBjdXJyZW50IGdyYXBoIGRhdGFiYXNlIGlzIGFscmVhZHkgc3RyZXRjaGVkIGJleW9uZCBpdHMgbGltaXRzLiBRTGV2ZXIgaXMgY3VycmVudGx5IG9uIHRoZSBzaG9ydGxpc3QgYW5kIHRoZSBtb3N0IHByb21pc2luZyBjYW5kaWRhdGUsIHNlZSBodHRwczovL3d3dy53aWtpZGF0YS5vcmcvd2lraS9XaWtpZGF0YTpTUEFSUUxfcXVlcnlfc2VydmljZS9XRFFTX2JhY2tlbmRfdXBkYXRlL1dEUVNfYmFja2VuZF9hbHRlcm5hdGl2ZXMgLiBUaGUgbWFpbiBvYnN0YWNsZSBpcyB0aGF0IFFMZXZlciBpcyBub3QgeWV0IGZ1bGx5IGNvbXBsaWFudCB0byB0aGUgU1BBUlFMIDEuMSBzdGFuZGFyZC5cblxuMi4gT3BlblN0cmVldE1hcCBzbyBmYXIgaGFzIGl0cyBvd24gdGFpbG9yLW1hZGUgdG9vbCAo4oCcT3ZlcnBhc3PigJ0pIGZvciBxdWVyeWluZyBpdHMgaHVnZSBkYXRhLiBIb3dldmVyLCB0aGUgcXVlcnkgbGFuZ3VhZ2UgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgdGhlcmUgaXMgbm8gaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGRhdGFzZXRzLCBsaWtlIFdpa2lkYXRhLiBRTGV2ZXIgZW5hYmxlcyB0aGF0IGFuZCB0aGUgY29tbXVuaXR5IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgdG8gYWRvcHQgaXQ6IGh0dHBzOi8vd2lraS5vcGVuc3RyZWV0bWFwLm9yZy93aWtpL1FMZXZlciAuIEluIHBhcnRpY3VsYXIsIG91ciBlbmRwb2ludCBpcyB1c2VkIHRvIGZpbmQgZXJyb3JzIGFuZCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGRhdGEuIiwic3VwcG9ydGluZ19kb2N1bWVudCI6Imh0dHBzOi8vb25lcGFzcy1maWxlcy5zMy1ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbS9mb3Jtcy9maWxlcy91bml2ZXJzaXR5LW9mLWZyZWlidXJnLWNoYWlyLWZvci1hbGdvcml0aG1zLWFuZC1kYXRhLXN0cnVjdHVyZXMvbmdpLXNlYXJjaC01dGgtb3Blbi1jYWxsL1d0SkZ1QXk5UHAvMjAyNC0wNy0yOV9xbGV2ZXJfX19uZ2lfc2VhcmNoX3Byb3Bvc2FsXzJfaW5fMS5wZGYifSwic3RhdGlzdGljYWxfc2VjdGlvbiI6eyJzdGF0aXN0aWNhbF9xdWVzdGlvbiI6WyJXb3JkIG9mIG1vdXRoIl19LCJkZWNsYXJhdGlvbl9vZl9ob25vdXIiOnsiZG9oX3ExIjp0cnVlLCJkb2hfcTMiOnRydWUsImRvaF9xNCI6dHJ1ZSwiZG9oX3E1Ijp0cnVlLCJkb2hfcTYiOnRydWUsImRvaF9xNi0xMCI6dHJ1ZSwiZG9oX3E2LTExIjp0cnVlLCJkb2hfcTYtMTIiOnRydWUsImRvaF9xNi0xMyI6dHJ1ZSwiZG9oX3E2LTciOnRydWUsImRvaF9xNi04Ijp0cnVlLCJkb2hfcTYtOSI6dHJ1ZSwiZG9oX3E3Ijp0cnVlLCJkb2hfcTgiOnRydWV9LCJwcm9jZXNzaW5nX3BlcnNvbmFsX2RhdGEiOnsicG9wZF9xMSI6IlllcyIsInBvcGRfcTIiOiJZZXMiLCJwb3BkX3EzIjoiWWVzIn0sImltcGxlbWVudGF0aW9uIjp7ImJhY2tncm91bmRfdXJsIjoiaHR0cHM6Ly9hZC5pbmZvcm1hdGlrLnVuaS1mcmVpYnVyZy5kZSIsImN2X2xpbmsiOiJodHRwczovL2FkLmluZm9ybWF0aWsudW5pLWZyZWlidXJnLmRlL3N0YWZmL2Jhc3QvY3YiLCJlbnRpdHlfbmFtZSI6IlVuaXZlcnNpdHkgb2YgRnJlaWJ1cmcsIENoYWlyIGZvciBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMiLCJnZW5kZXIiOiJGZW1hbGUiLCJ0ZWFtX2xlYWRlcl9uYW1lIjoiSGFubmFoIEJhc3QiLCJ0ZWFtX21lbWJlciI6W3siZnVsbF9uYW1lIjoiSm9oYW5uZXMgS2FsbWJhY2giLCJwb3NpdGlvbiI6IlBoLkQuIHN0dWRlbnQiLCJjb3VudHJ5IjoiR2VybWFueSJ9LHsiZnVsbF9uYW1lIjoiUm9iaW4gVGV4dG9yLUZhbGNvbmkiLCJwb3NpdGlvbiI6IlByb3NwZWN0aXZlIFBoLkQuIHN0dWRlbnQiLCJjb3VudHJ5IjoiR2VybWFueSJ9XSwibmV3X3RvX2hvcml6b24iOnRydWUsIm5naV9mdW5kcyI6ZmFsc2UsIm5naV9mdW5kc19wcm9qZWN0IjoiTi9BIiwicHJldmlvdXNfbmdpX2FwcGxpY2FudCI6ZmFsc2UsInByb2plY3RfZGVkaWNhdGlvbiI6IkpvaGFubmVzIEthbG1iYWNoIGFuZCBSb2JpbiBUZXh0IEZhbGNvbmkgY2FuIHdvcmsgb24gdGhlIHByb2plY3QgZnVsbCB0aW1lLlxuSGFubmFoIEJhc3QgY2FuIHNwZW5kIG1vcmUgdGhhbiA1MCUgb2YgaGVyIHRpbWUgb24gdGhlIHByb2plY3QuIiwidGVhbV9nZW5kZXJfYmFsYW5jZSI6dHJ1ZSwidGVhbV9pbnRybyI6Ikhhbm5haCBCYXN0IGhhcyAzNSB5ZWFycyBvZiBleHBlcmllbmNlIGluIGFsZ29yaXRobXMgcmVzZWFyY2ggYW5kIGJ1aWxkaW5nIHNvZnR3YXJlIHN5c3RlbXMgdGhhdCBhY3R1YWxseSB3b3JrIGluIHByYWN0aWNlLiBJbiBwYXJ0aWN1bGFyLCBzaGUgaXMga25vd24gZm9yIENvbXBsZXRlU2VhcmNoLCB0aGUgc2VhcmNoIHRlY2hub2xvZ3kgYmVoaW5kIGh0dHBzOi8vZGJscC5vcmcgLCB0aGUgcHVibGljIHRyYW5zaXQgcm91dGluZyBvbiBodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMgKGRlc2lnbmVkIGFuZCBpbXBsZW1lbnRlZCBkdXJpbmcgYW4gZXh0ZW5kZWQgc2FiYmF0aWNhbCBhdCBHb29nbGUpLCBhbmQgZm9yIGh0dHBzOi8vcWxldmVyLmNzLnVuaS1mcmVpYnVyZy5kZSAuXG5cbkpvaGFubmVzIEthbG1iYWNoIGhhcyBiZWVuIHdvcmtpbmcgb24gUUxldmVyIGluIEhhbm5haCBCYXN04oCZcyBncm91cCBzaW5jZSAyMDE4LiBJbiBhIHNob3J0IHRpbWUsIGhlIGhhcyBiZWNvbWUgUUxldmVy4oCZcyBjaGllZiBkZXZlbG9wZXIsIGludHJvZHVjaW5nIG1hbnkgaW1wb3J0YW50IGlubm92YXRpb25zIHRvIHRoZSBjb2RlIGFuZCBoZWxwaW5nIG51bWVyb3VzIGNvbnRyaWJ1dG9ycyB3aXRoIHRoZSBvbmJvYXJkaW5nLiBIZSBpcyB2ZXJ5IHByb2ZpY2llbnQgaW4gbW9kZXJuIEMrKy4gSGlzIGNvbW1pdCBoaXN0b3J5IHNwZWFrcyBmb3IgaXRzZWxmOlxuaHR0cHM6Ly9naXRodWIuY29tL2pva2E5MjEgXG5cblJvYmluIFRleHRvci1GYWxjb25pIGhhcyBiZWVuIHdvcmtpbmcgb24gUUxldmVyIGluIEhhbm5haCBCYXN04oCZcyBncm91cCBzaW5jZSAyMDIxLiBIZSBoYXMgaW1wbGVtZW50ZWQgbGl2ZSBxdWVyeSBhbmFseXNpcyBhbmQgaXMgY3VycmVudGx5IHdvcmtpbmcgb24gcmVkdWNpbmcgUUxldmVy4oCZcyBtZW1vcnkgZm9vdHByaW50IGR1cmluZyBxdWVyeSBwcm9jZXNzaW5nOiBodHRwczovL2dpdGh1Yi5jb20vUm9iaW5URiAuIiwicm9sZSI6Ik92ZXJzZWVzIHRoZSBjb21wbGV0ZSBkZXZlbG9wbWVudCBvZiBRTGV2ZXIsIGhpcmluZywgZG9jdW1lbnRhdGlvbiwgY29kZSByZXZpZXdzLCBjb2RpbmcgaGVyc2VsZi4iLCJ0ZWFtX21vdGl2YXRpb24iOiJXZSBhcmUgdmVyeSBlbnRodXNpYXN0aWMgYWJvdXQgYnVpbGRpbmcgc29mdHdhcmUgc3lzdGVtcywgYmFzZWQgb24gc29waGlzdGljYXRlZCBhbGdvcml0aG1zIGFuZCBkYXRhIHN0cnVjdHVyZXMsIHRoYXQgYnJpbmcgcG93ZXJmdWwgc2VhcmNoIGNhcGFiaWxpdGllcyB0byB1c2Vycy4gT3VyIHByaW1lIGdvYWxzIGFyZSBoaWdoIGVmZmljaWVuY3ksIHJlc291cmNlZnVsbmVzcywgYW5kIG1ha2luZyBpdCBhcyBlYXN5IGFzIHBvc3NpYmxlIGZvciB1c2VycyB0byBmb3JtdWxhdGUgY29tcGxleCBxdWVyaWVzIHdpdGggYXMgbGl0dGxlIGV4cGVydGlzZSBhcyBwb3NzaWJsZS4gUUxldmVyIGFsc28gcHJvdmlkZXMgYW4gaW50dWl0aXZlIHF1ZXJ5IGFuYWx5c2lzIHRvb2wsIHdoaWNoIGhlbHBzIHVzZXJzIHVuZGVyc3RhbmQgdGhlIHJlc3VsdHMgYW5kIHRoZSByZXNvdXJjZSByZXF1aXJlbWVudHMgb2YgdGhlaXIgcXVlcmllcy5cblxuQXQgdGhlIHNhbWUgdGltZSwgd2UgYWxzbyB3YW50IHRvIGNhdGVyIHRvIGV4cGVydCB1c2VycywgZ2l2aW5nIHRoZW0gdGhlIHBvc3NpYmlsaXR5IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBoYXBwZW5pbmcgdW5kZXIgdGhlIGhvb2QgaWYgdGhleSB3YW50IHRvLiBBIHBlcmZlY3QgZXhhbXBsZSBmb3IgdGhpcyBpcyBvdXIgUUxldmVyIGNvbW1hbmQtbGluZSB0b29sIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hZC1mcmVpYnVyZy9xbGV2ZXItY29udHJvbCAuIFNldHRpbmcgdXAgYW4gb3duIFNQQVJRTCBlbmRwb2ludCBpcyBhcyBlYXN5IGFzIOKAnHFsZXZlciBzZXR1cC1jb25maWcgd2lraWRhdGEgJiYgcWxldmVyIGdldC1kYXRhICYmIHFsZXZlciBpbmRleCAmJiBxbGV2ZXIgc3RhcnTigJ0uIE9uIGRlbWFuZCwgdGhlIHRvb2wgYWxzbyBwcm92aWRlcyB0aGUgZGV0YWlsZWQgY29tbWFuZCBsaW5lcyBpdCB1c2VzIGFuZCBpcyBoaWdobHkgY29uZmlndXJhYmxlLiIsImJ1ZGdldCI6MTUwLCJyZXNvdXJjZXMiOiJUaGUgbW9uZXkgd2lsbCBiZSB1c2VkIHRvIHBheSB0d28gZnVsbC10aW1lIHBvc2l0aW9ucyBmb3IgOSBtb250aHMgZWFjaCAoSm9oYW5uZXMgS2FsbWJhY2ggYW5kIFJvYmluIFRleHRvci1GYWxjb25pLCBzZWUgYWJvdmUpLCBhcyB3ZWxsIHR3byBzdHVkZW50IGFzc2lzdGFudHMuXG5cblRoZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBvZiBRTGV2ZXIgcmVxdWlyZXMgcGVvcGxlIHdpdGggYSBzdHJvbmcgYmFja2dyb3VuZCBpbiBhbGdvcml0aG1zLCBidXQgd2hvIGFyZSBhbHNvIGFibGUgdG8gcHV0IHRoZXNlIGlkZWFzIGludG8gcHJhY3RpY2UsIGFuZCB3aG8gYXJlIGV4cGVyaWVuY2VkIGluIHdyaXRpbmcgcHJvZmVzc2lvbmFsIEMrKyBjb2RlLiBKb2hhbm5lcyBLYWxtYmFjaCBhbmQgUm9iaW4gVGV4dC1GYWxjb25pIGFyZSBpZGVhbCBjYW5kaWRhdGVzIGZvciB0aGlzIGpvYiwgZ2l2ZW4gdGhlaXIgdHJhY2sgcmVjb3JkIHNvIGZhci5cblxuVGhlIHN0dWRlbnQgYXNzaXN0YW50cyB3aWxsIGhlbHAgd2l0aCBjb2RpbmcgdGFza3MgdGhhdCByZXF1aXJlIGxlc3MgZXhwZXJ0aXNlLiBXZSBoYXZlIHNldmVyYWwgY29tcGV0ZW50IGNhbmRpZGF0ZXMgZm9yIHRoZXNlIGpvYnMuIiwid29ya19wbGFuIjoiV2Ugd2FudCB0byBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZvdXIgbWlsZXN0b25lcywgZWFjaCBvZiB3aGljaCByZXF1aXJlcyBhYm91dCBzaXggbW9udGhzIG9mIGlmIHBlcmZvcm1lZCBieSBhIHNpbmdsZSBwZXJzb24gKHRoZSB0aGlyZCBhbmQgZm91cnRoIG1pbGVzdG9uZSBjYW4gYmUgZWFzaWx5IHNwbGl0IHVwKTpcblxuMS4gSW1wbGVtZW50IFNQQVJRTCAxLjEgVXBkYXRlLiBUaGlzIGNvbmNlcm5zIGR5bmFtaWMgdXBkYXRlcyBvZiB0aGUgZGF0YXNldCBhbmQgaXMgYSBkZWFsLWJyZWFrZXIgZm9yIGFsbCBvZiB0aGUgcHJvamVjdHMgbWVudGlvbmVkIGFib3ZlIChXaWtpZGF0YSwgT3BlblN0cmVldE1hcCwgVW5pUHJvdCkuXG5cbjIuIEltcGxlbWVudCBTUEFSUUwgMS4xIEZlZGVyYXRlZCBzZWFyY2ggLiBRTGV2ZXIgYWxyZWFkeSBoYXMgYSBiYXNpYyAgaW1wbGVtZW50YXRpb24sIGJ1dCBpbXBvcnRhbnQgZmVhdHVyZXMgbGlrZSB2YXJpYWJsZSBTRVJWSUNFIElSSXMgYXJlIHN0aWxsIG1pc3NpbmcuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgeWV0IGVmZmljaWVudCB3aGVuIGxhcmdlIHJlc3VsdHMgYXJlIGludm9sdmVkLlxuXG5cbjMuIEltcGxlbWVudCBtaXNzaW5nIFNQQVJRTCAxLjEgZmVhdHVyZXMuIFRoaXMgaXMgYSBoYXJkIHJlcXVpcmVtZW50IGJ5IGFsbCB0aGUgcHJvamVjdHMgbWVudGlvbmVkIGFib3ZlLiBJbiBwYXJ0aWN1bGFyLCBzdXBwb3J0IGZvciBuYW1lZCBncmFwaHMgaXMgdXNlZCBpbiBtYW55IGFwcGxpY2F0aW9ucyBhbmQgc3RpbGwgbWlzc2luZy5cblxuXG40LiBJbXBsZW1lbnQgbWlzc2luZyBHZW9TUEFSUUwgZmVhdHVyZXMuIFRoaXMgaXMgaW1wb3J0YW50IGZvciBwcm9qZWN0cyBiYXNlZCBvbiBPcGVuU3RyZWV0TWFwIGRhdGEuIEluIHBhcnRpY3VsYXIsIGR5bmFtaWMgc3BhdGlhbCBqb2lucyBhbmQgcHJpbWl0aXZlcyBsaWtlIGdlb2Y6ZGlzdGFuY2UgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiJ9LCJleGNlbGxlbmNlIjp7ImFtYml0aW9uIjoiV2UgdXNlIHRoaXMgZmllbGQgdG8gZGVzY3JpYmUgd2hhdCBzZXRzIFFMZXZlciBhcGFydCBmcm9tIG90aGVyIGdyYXBoIGRhdGFiYXNlcy5cblxuMS4gTW9zdCBncmFwaCBkYXRhYmFzZXMgdXNlIHN0YW5kYXJkIGFsZ29yaXRobXMgZm9yIHRoZWlyIGNvcmUgY29tcG9uZW50cy4gRm9yIFFMZXZlciwgdGhlIGZpcnN0IHF1ZXN0aW9uIHdlIGFzayBmb3IgZXZlcnkgY29yZSBjb21wb25lbnQgaXM6IFdoYXQgaXMgdGhlIGJlc3QgYWxnb3JpdGhtIGZvciB0aGlzIHRhc2suIE91ciBleHRlbnNpdmUgZXhwZXJpZW5jZSBpbiBhbGdvcml0aG1zIHJlc2VhcmNoIG9idmlvdXNseSBoZWxwcy5cblxuMi4gSXQgaXMgbm90IGVub3VnaCB0byBjaG9vc2UgdGhlIHRoZW9yZXRpY2FsbHkgYmVzdCBhbGdvcml0aG0uIEl0IGFsc28gaGFzIHRvIGJlIGltcGxlbWVudGVkIGNhcmVmdWxseSBhbmQgcGVyZm9ybSB3ZWxsIGluIHByYWN0aWNlLiBUaGlzIGlzIGFuIGFydCBrbm93biBhcyBhbGdvcml0aG0gZW5naW5lZXJpbmcuIEhhbm5haCBCYXN0IGhhcyBiZWVuIHByYWN0aWNpbmcgYW5kIHRlYWNoaW5nIHRoaXMgZm9yIG92ZXIgMjAgeWVhcnMuXG5cbjMuIFRoZSBjaG9pY2Ugb2YgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaXMgaW1wb3J0YW50LiBOb25lIG9mIHRoZSBncmFwaCBkYXRhYmFzZXMgd3JpdHRlbiBpbiBKYXZhIGNhbiBoYW5kbGUgbGFyZ2UgZGF0YXNldHMgZWZmaWNpZW50bHkgKG9yIGF0IGFsbCkuIFRoZSBvbmx5IG90aGVyIGVuZ2luZSB0aGF0IGNvbWVzIGNsb3NlIHRvIFFMZXZlcuKAmXMgZWZmaWNpZW5jeSBpcyBWaXJ0dW9zbywgYnV0IGl0cyBjb2RlYmFzZSBpcyBvbGQsIHBvb3JseSBkb2N1bWVudGVkLCBhbmQgd3JpdHRlbiBpbiBDLCB3aGljaCBpcyBhIG1ham9yIHJvYWQgYmxvY2sgZm9yIGZ1cnRoZXIgZGV2ZWxvcG1lbnQuIFFMZXZlciBpcyB3cml0dGVuIGluIG1vZGVybiBDKysgYW5kIHZlcnkgd2VsbCBkb2N1bWVudGVkLiIsImlubm92YXRpb24iOiJBbnkgcHJvamVjdCB0aGF0IHByb3ZpZGVzIHRoZWlyIGRhdGEgYXMgUkRGIGJlbmVmaXRzIGZyb20gYW4gZWZmaWNpZW50IGdyYXBoIGRhdGFiYXNlIGluIG11bHRpcGxlIHdheXM6XG5cbjEuIFRoZSBhYmlsaXR5IHRvIGNhcnJ5IG91dCBjb21wbGV4IHF1ZXJpZXMuIE1hbnkgZXhpc3RpbmcgZ3JhcGggZGF0YWJhc2VzIGFyZSB0b28gc2xvdyBmb3IgdGhpcywgZXZlbiBvbiBtZWRpdW0tc2l6ZWQgZGF0YXNldHMuXG5cbjIuIFRoZSBhYmlsaXR5IHRvIGNvbXB1dGUgYW5kIGRvd25sb2FkIGxhcmdlIHJlc3VsdHMuIEV4aXN0aW5nIGdyYXBoIGRhdGFiYXNlcyBoYXZlIHByb2JsZW1zIHdpdGggdGhpcyBvciBjYW5ub3QgZG8gaXQgYXQgYWxsLiBRTGV2ZXIgaXMgZXhwbGljaXRseSBkZXNpZ25lZCB0byBoYW5kbGUgdGhpcy5cblxuMy4gU3RhdGlzdGljcyBxdWVyaWVzIGFuZCBxdWVyaWVzIHRoYXQgaWRlbnRpZnkgZXJyb3JzIGluIHRoZSBkYXRhc2V0LiBUaGVzZSBhcmUgb2Z0ZW4gYW1vbmcgdGhlIG1vc3QgY29tcHV0ZS1pbnRlbnNpdmUgcXVlcmllcyBhbmQgbWFueSBleGlzdGluZyBncmFwaCBkYXRhYmFzZXMgY2Fubm90IGhhbmRsZSB0aGVtLCBRTGV2ZXIgY2FuLlxuXG40LiBRTGV2ZXIgcHJvdmlkZXMgY29udGV4dC1zZW5zaXRpdmUgYXV0by1jb21wbGV0aW9uIHRoYXQgbGV0cyB1c2VycyBjb25zdHJ1Y3QgU1BBUlFMIHF1ZXJpZXMgaW5jcmVtZW50YWxseSwgcmVxdWlyaW5nIG9ubHkgYSBiYXNpYyB1bmRlcnN0YW5kaW5nIG9mIFNQQVJRTCBhbmQgbm8gcGFydGljdWxhciBrbm93bGVkZ2Ugb2YgdGhlIGRhdGFzZXQuIFRoaXMgaXMgYSB1bmlxdWUgZmVhdHVyZSBvZiBRTGV2ZXIuXG5cbjUuIFFMZXZlciBhbGxvd3MgY29tcGxleCBzcGF0aWFsIHF1ZXJpZXMgYW5kIHRoZSBpbnRlcmFjdGl2ZSBkaXNwbGF5IG9mIHZlcnkgbGFyZ2UgbnVtYmVycyBvZiBnZW9tZXRyaWMgb2JqZWN0cyBvbiBhIG1hcC4gTm8gb3RoZXIgc3BhdGlhbCBkYXRhYmFzZSBoYXMgdGhpcyBmZWF0dXJlLiIsImlubm92YXRpb24tNCI6IkFscmVhZHkgbm93LCBRTGV2ZXIgaXMgdGhlIGZhc3Rlc3QgZ3JhcGggZGF0YWJhc2Ugb24gdGhlIG1hcmtldCwgYnkgYSB3aWRlIG1hcmdpbi4gQXMgZGVzY3JpYmVkIGFib3ZlLCB0aGlzIGlzIHRoYW5rcyB0byBpdHMgc29waGlzdGljYXRlZCBhbmQgY2FyZWZ1bGx5IGRlc2lnbmVkIGNvcmUgYWxnb3JpdGhtcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLCB0aGUgdmVyeSBjYXJlZnVsIGFsZ29yaXRobSBlbmdpbmVlcmluZywgYW5kIHRoZSB1c2Ugb2YgbW9kZXJuIEMrKy4gXG5cbkFzIG1lbnRpb25lZCBhYm92ZSwgYW5kIGVsYWJvcmF0ZWQgbW9yZSBpbiB0aGUgU2VjdGlvbiBvbiDigJxJbXBsZW1lbnRhdGlvbuKAnSBiZWxvdywgd2UgaGF2ZSBleHRlbnNpdmUgZXhwZXJpZW5jZSBpbiBhbGwgdGhlc2UgZmllbGRzIChhbGdvcml0aG0gZGVzaWduLCBhbGdvcml0aG0gZW5naW5lZXJpbmcsIEMrKywgc3lzdGVtIGJ1aWxkaW5nKS5cblxuQ29udGludWluZyBhbG9uZyB0aGVzZSBsaW5lcywgd2UgaGF2ZSBubyBkb3VidHMgdGhhdCB3ZSBjYW4gbWFrZSBRTGV2ZXIgZnVsbHkgY29tcGxpYW50IHdpdGggdGhlIFNQQVJRTCAxLjEgc3RhbmRhcmQgb2YgdGhlIFczQywgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGV4dHJhb3JkaW5hcnkgaGlnaCBlZmZpY2llbmN5LiIsInByb2JsZW1fbmVlZCI6IlFMZXZlciBpcyBhbHJlYWR5IHdlbGwga25vd24gYW5kIHVzZWQsIHNlZSB0aGUgZGVzY3JpcHRpb25zIGluIHRoZSBmaWVsZHMgYWJvdmUuIFRoZSBmb2N1cyBvZiBvdXIgZGV2ZWxvcG1lbnQgc28gZmFyIGhhcyBiZWVuIG9uIHRoZSBjb3JlIGZlYXR1cmVzLCBpbiBwYXJ0aWN1bGFyLCBvbiB0aGUgY2VudHJhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIGFsZ29yaXRobXMgZm9yIHF1ZXJ5IHBsYW5uaW5nIGFuZCBxdWVyeSBwcm9jZXNzaW5nIGFuZCB0aGVpciBjYXJlZnVsIGFuZCBleHRlbnNpYmxlIGltcGxlbWVudGF0aW9uIGluIG1vZGVybiBDKysuIFRoYXQgaXMgd2hhdCBtYWtlcyBRTGV2ZXIgc28gZmFzdCBhbmQgc2V0cyBpdCBhcGFydCBmcm9tIG90aGVyIGdyYXBoIGRhdGFiYXNlcy5cblxuVGhlIG1haW4gcm9hZCBibG9jayBmb3Igd2lkZXIgZW1wbG95bWVudCBpcyBmdWxsIGNvbXBsaWFuY2UgdG8gdGhlIFNQQVJRTCAxLjEgc3RhbmRhcmQgYnkgdGhlIFczQy4gSW4gcGFydGljdWxhciwgdGhpcyBoYXMgYmVlbiBleHBsaWNpdGx5IChhbmQgaW5kZXBlbmRlbnRseSkgZm9ybXVsYXRlZCBieSB0aGUgZm9sbG93aW5nIHRocmVlIHByb2plY3RzOiBXaWtpZGF0YSwgVW5pUHJvdCwgYW5kIE9wZW5TdHJlZXRNYXAuIEluIHBhcnRpY3VsYXIsIGEgZnVsbCBpbXBsZW1lbnRhdGlvbiBvZiBTUEFSUUwgMS4xIFVwZGF0ZSBpcyBuZWVkZWQgKGR5bmFtaWMgY2hhbmdlcyBvZiB0aGUgZGF0YXNldCkuXG5cbkl0IGlzIHRoZSBnb2FsIG9mIHRoaXMgcHJvamVjdCB0byBhY2hpZXZlIHRoaXMgZnVsbCBTUEFSUUwgMS4xIGNvbXBsaWFuY2UuIFRoaXMgaXMgbW9yZSBjaGFsbGVuZ2luZyB0aGFuIGZvciBvdGhlciBncmFwaCBkYXRhYmFzZXMgYmVjYXVzZSBvZiB0aGUgc3Ryb25nIGVmZmljaWVuY3kgcmVxdWlyZW1lbnRzIG9mIFFMZXZlciwgc2VlIGV4cGxhbmF0aW9ucyBmb3IgdGhlIHRoZSBuZXh0IGZpZWxkICjigJxBbWJpdGlvbuKAnSkuIn0sImltcGFjdCI6eyJpbXBhY3RfMSI6Ik1hcmtldCBwb3RlbnRpYWw6IFRoZSBtYXJrZXQgZm9yIGdyYXBoIGRhdGFiYXNlcyBpcyBib29taW5nOyB0aGUgcmVjZW50IHN1cnZleSBodHRwczovL2FyeGl2Lm9yZy9hYnMvMjEwMi4xMzAyNyAgZnJvbSAyMDIxIGxpc3RzIG92ZXIgb25lIGh1bmRyZWQgZ3JhcGggZGF0YWJhc2VzLiBBY2NvcmRpbmcgdG8gYSByZWNlbnQgR2FydG5lciByZXBvcnQsIOKAnFNlbWFudGljIERhdGEgSW50ZWdyYXRpb24gJiBLbm93bGVkZ2UgR3JhcGhz4oCdIGlzIG9uZSBvZiB0aGUgdG9wLTEwIHRyZW5kcyBpbiBEYXRhIEludGVncmF0aW9uIGFuZCBFbmdpbmVlcmluZzogaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3Bvc3RzL2p1YW5zZXF1ZWRhX2FkZC1zZW1hbnRpYy1kYXRhLWludGVncmF0aW9uLWtub3dsZWRnZS1hY3Rpdml0eS03MTk2MTA1NzY2NjE1ODAxODU2LUZPSWsvXG5cbkRlZ3JlZSBvZiBjb21wZXRpdGlvbjogV2Uga2VlcCBhIGNsb3NlIGV5ZSBvbiB0aGUgb3RoZXIgZ3JhcGggZGF0YWJhc2VzLiBBY2NvcmRpbmcgdG8gYSByZWNlbnQgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiwgUUxldmVyIGlzIGJ5IGZhciB0aGUgbW9zdCBlZmZpY2llbnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hZC1mcmVpYnVyZy9xbGV2ZXIvd2lraS9RTGV2ZXItcGVyZm9ybWFuY2UtZXZhbHVhdGlvbi1hbmQtY29tcGFyaXNvbi10by1vdGhlci1TUEFSUUwtZW5naW5lcyBcblxuRW5kIHVzZXJzIG5lZWRzOiBBcyBkZXNjcmliZWQgYWJvdmUsIHVzZXJzIGZyb20gdmFyaW91cyBjb21tdW5pdGllcyAoV2lraWRhdGEsIE9wZW5TdHJlZXRNYXAsIFVuaVByb3QsIOKApikgYXJlIGN1cnJlbnRseSBleHBlcmllbmNpbmcgc2lnbmlmaWNhbnQgbGltaXRhdGlvbnMgd2l0aCBjdXJyZW50IHRvb2xzIGJlY2F1c2Ugb2YgbG9uZyBxdWVyeSB0aW1lcyBhbmQgbGltaXRlZCBxdWVyeSBjYXBhYmlsaXRpZXMuIFFsZXZlciBjYW4gb3ZlcmNvbWUgYWxsIG9mIHRoZXNlIGxpbWl0YXRpb25zLiIsImltcGFjdF8yIjoiSW50ZXJvcGVyYWJpbGl0eSBvZiBkYXRhc2V0cyBpcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHRvcGljcyBvZiBvdXIgdGltZS4gQW4gYXJlYSwgd2hlcmUgdGhpcyBpcyBwYXJ0aWN1bGFybHkgZXZpZGVudCwgaXMgaGVhbHRoIGNhcmUuIFRoZSBjdXJyZW50IHNpdHVhdGlvbiBpcyBzdGlsbCBibGVhazogZGlmZmVyZW50IGhvc3BpdGFscyAoYW5kIG9mdGVuIGV2ZW4gZGlmZmVyZW50IGRlcGFydG1lbnRzIGluIHRoZSBzYW1lIGhvc3BpdGFsKSB1c2UgZGlmZmVyZW50IChvZnRlbiBwcm9wcmlldGFyeSkgc3lzdGVtcyB0byBzdG9yZSB0aGVpciBkYXRhLCB3aGljaCBtYWtlcyBhbiBleGNoYW5nZSB2ZXJ5IGRpZmZpY3VsdC5cblxuVGhlIEhMNyBGSElSIHN0YW5kYXJkIGhhcyBiZWVuIGEgYmlnIHN0ZXAgZm9yd2FyZCBpbiB0aGlzIHJlc3BlY3QgaW4gdGhhdCBpdCBjcmVhdGVzIGEgY29tbW9uIChub24tcHJvcHJpZXRhcnkpIGV4Y2hhbmdlIGZvcm1hdC4gT25lIG9mIGl0cyBiYXNlIHN0YW5kYXJkcyBpcyBSREYsIHdoaWNoIGlzIHRoZSBiYXNpcyBmb3IgaW50ZXJvcGVyYWJpbGl0eS5cblxuT25jZSBsYXJnZSBhbW91bnRzIG9mIGhlYWx0aC1jYXJlIGRhdGEgYmVjb21lIGF2YWlsYWJsZSBhcyBGSElSLVJERiwgZWZmaWNpZW50IGdyYXBoIGRhdGFiYXNlcyB3aWxsIGJlIGtleSBmb3Igc3RvcmluZyBhbmQgcXVlcnlpbmcgdGhlbSwganVzdCBsaWtlIHRoZXkgYXJlIGtleSBhbHJlYWR5IG5vdyBmb3IgYmlzIHByb2plY3RzIGxpa2UgV2lraWRhdGEsIFVuaVByb3QsIG9yIE9wZW5TdHJlZXRNYXAuIFdlIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBzb29uLiBUaGVuIGFuIGVmZmljaWVudCBncmFwaCBkYXRhYmFzZSBsaWtlIFFMZXZlciBoYXMgdGhlIHBvdGVudGlhbCB0byBiZSBhIGdhbWUgY2hhbmdlci4iLCJpbXBhY3RfMyI6IldlIGFscmVhZHkgbWVudGlvbmVkIGhvdyBvdGhlciBwcm9qZWN0cyAoV2lraWRhdGEsIE9wZW5TdHJlZXRNYXAsIOKApikgZWFjaCBoYXZlIHRoZWlyIG93biBjb21tdW5pdHkgd2l0aCBvd24gc3BlY2lmaWMgdXNlIGNhc2VzOiBjb21wbGV4IHF1ZXJpZXMsIGRvd25sb2FkaW5nIG9mIHBhcnRzIG9mIHRoZSBkYXRhc2V0LCBzdGF0aXN0aWNzIHF1ZXJpZXMsIGV4cGxvcmF0aXZlIHF1ZXJpZXMsIGFuZCBxdWVyaWVzIHRoYXQgYWltIGF0IGZpbmRpbmcgZXJyb3JzIG9yIGluY29uc2lzdGVuY2llcyBpbiB0aGUgZGF0YXNldC5cblxuQWxsIHRoZXNlIHByb2plY3RzIHN1ZmZlciBmcm9tIGVmZmljaWVuY3kgaXNzdWVzIHdpdGggdGhlaXIgY3VycmVudCBzeXN0ZW1zLiBUaGUgbWFpbiByb2FkIGJsb2NrIGZvciB1c2luZyBRTGV2ZXIgaXMgdGhlIG1pc3NpbmcgY29tcGxpYW5jZSB3aXRoIHRoZSBmdWxsIFNQQVJRTCAxLjEgc3RhbmRhcmQuIE9uY2UgdGhpcyBjb21wbGlhbmNlIGlzIHJlYWNoZWQsIGEgcXVpY2sgYWRvcHRpb24gb2YgUUxldmVyIGlzIHZlcnkgbGlrZWx5LCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGFkdmFudGFnZXMgZm9yIHRoZSB1c2VycyBmcm9tIHRoZXNlIGNvbW11bml0aWVzLlxuXG5XZSBhbHNvIHJlaXRlcmF0ZSB0aGF0IFFMZXZlciBtYWtlcyBpdCBlYXN5IGZvciB1c2VycyB0byBzZXQgdXAgc2VydmljZXMgb24gdGhlaXIgb3duIG1hY2hpbmVzLiBUaGlzIGlzIGhhcmRlciBmb3Igb3RoZXIgZW5naW5lcyBub3Qgb25seSBiZWNhdXNlIHRoZSBzZXR1cCBpcyBvZnRlbiBjb21wbGljYXRlZCwgYnV0IG1vcmUgaW1wb3J0YW50bHksIGJlY2F1c2Ugb3RoZXIgZ3JhcGggZGF0YWJhc2VzIHJlcXVpcmUgZXhwZW5zaXZlIG1hY2hpbmVzIG9yIGV2ZW4gbXVsdGlwbGUgbWFjaGluZXMsIHdoZXJlYXMgUUxldmVyIGlzIGRlc2lnbmVkIHRvIGZ1bmN0aW9uIHdlbGwgb24gYSBzdGFuZGFyZCBQQyB3aXRoIG1vZGVyYXRlIHJlc291cmNlcy4ifSwidHlwZSI6IlN1Ym1pc3Npb25DcmVkZW50aWFsIiwiaWF0IjoxNzIyMjI3MTQ0LCJuYmYiOjE3MjIyMjcxNDQsImV4cCI6MTg3OTkwNzE0NCwiYXVkIjoiaHR0cHM6Ly9nZXRvbmVwYXNzLmV1L29wcG9ydHVuaXR5L25naS1zZWFyY2gtNXRoLW9wZW4tY2FsbCIsImlzcyI6ImRpZDp3ZWI6Z2V0b25lcGFzcy5ldSIsInN1YiI6IjVjN2JhOWU2ZWY3Nzk1NjIzODFjZDQ4OSJ9.L8EoXBPuX_Wp_qqQwFfSyJ-9W0zMNG3shDsJtPeusyueo4y3wKk90NUrkUxdDdHNh32mVzGp6v3qi4BnFc9Ks0U7D65YPpXQ8rX-fcZRK73-zKuFt8cFnx-TADQsFRi-8_tTW7lClEmDmbpUA-IJ5ngxvkrloJg4VBmCFxFG5oaeewOTK8PHB-xbLF_4ON0-JoJANpPWWrK7ZTj8_jLkZ_LugoGXV8P5nMVJbM-bqzPj4LrxYC82PiFOOdXn2AGylpvwFo1DFYiRfMYYwo6hUhJgjCyLI4fg4l2GqNRg725TAD6nkUPP9t7c4hDxCSs5RHda1HWPjyVZn8Ju_rdf6g