1 Introduction

The field of digital epigraphy has seen significant development in recent years: not only are traditional epigraphic corpora increasingly being digitised and made accessible via their websites for anyone to browse and search but several resources are already born digital without any printed edition, e.g. Inscriptions of Greek Cyrenaica (Roueche et al., 2020), Inscriptions of Roman Tripolitania (Roueche, 2022); for more see (Elliott, 2015). Most inscriptions contain references to places, people or events, or contain data related to the place and time of their creation and provide an ideal resource to study past communities as a whole. However, in order to be able to harness their full potential and for example access all inscriptions from a place of interest or of a given type, we need to link the existing datasets together. The concept of Linked Open Data (LOD) provides a means of connecting various digital datasets while enriching the text with, e.g. broader spatio-temporal context or prosopographic data, leading to the creation of new connections between individual inscriptions as well as archaeological sites or potential re-evaluation of historical narratives (Bagnall et al., 2006; Geser, 2016; Tupman, 2021). Although many epigraphic datasets have been using LOD, especially to record the spatial component by using services such as Pleiades or Trismegistos, there is still a considerable gap in the LOD implementation across the discipline and thus in the accessibility of the data.

An individual dataset that is not more widely accessible or interoperable is of considerable value to groups sharing similar interests (e.g. geographic area, chronological period, linguistic environment), but of much more limited value to the epigraphic discipline as a whole. The value of LOD lies in being able to build on the efforts and investment of numerous generations of epigraphers who over many years have produced multiple high-quality editions in first analogue and more recently also digital form. Whether there is one master database connecting all the inscriptions together, or not, once the data is FAIR (Findable, Accessible, Interoperable, Reusable (Wilkinson et al., 2016)) and linked to other LOD, new avenues of research open - either to large scale, comparative studies such as (Assael et al., 2022; Glomb et al., 2022; Heřmánková et al., 2021) or projects working on the same material but with different emphases (Mullen & Bowman, 2021; Willi, 2021). Once the data is linked, there is no need to build one central repository, which is often costly and unsustainable in the long run as documented by the recent experience of the EAGLE Portal (Orlandi, 2021), but instead one can empower individual users and provide them with clear guidelines and skills on how to work with LOD in epigraphy.

The FAIR Epigraphy Project (https://www.csad.ox.ac.uk/fair-epigraphy) aims to fill in the gap between the digitisation of inscriptions and the realisation of being able to use their full potential as a digital resource. The FAIR Epigraphy project has been established as a collaboration between Johannes Gutenberg University in Mainz (Prof. Marietta Horster) and the University of Oxford (Prof. Jonathan Prag), funded by the Arts and Humanities Research Council (AHRC) and Deutsche Forschungemeinschaft (DFG) and will run for 36 months, from 2022 to 2025. FAIR Epigraphy aims to create an interactive platform for all epigraphic projects, aligning their digital needs with the principles of FAIR science. The overall desirability of FAIR - Findable, Accessible, Interoperable, Reusable (Wilkinson et al., 2016) - data is fundamental for advancing research into the epigraphic, linguistic, and material culture of the ancient world.

“The principles emphasise machine-actionability (i.e. the capacity of computational systems to find, access, interoperate, and reuse data with none or minimal human intervention) because humans increasingly rely on computational support to deal with data as a result of the increase in volume, complexity, and creation speed of data.” (FAIR Principles website, https://www.go-fair.org/fair-principles/)

With the increase in Linked Open Data and novel interface technologies and standards, the FAIR Epigraphy Project will be able to create the tools and the community needed to transform epigraphic research in the digital age. However, FAIR Epigraphy does not wish to replicate any current efforts, but rather to align existing initiatives and bring them together to create a hub of high-quality tools and FAIR compliant standards and resources for the modern epigraphic discipline. Our internationally collaborative approach will enable and support innovative research across epigraphic data and the wider linked web of data (especially archaeological data), such that all epigraphic data is increasingly FAIR for both the research community and the wider public. To this end, we aim to:

  1. consolidate community-wide standards (vocabularies and ontology);
  2. host and make fully accessible the resulting linked open data published by individual projects (RDF/XML data publication);
  3. develop the tools for community implementation of those standards (vocabulary and ontology hosting and publication);
  4. provide support to members of the community in implementing the standards within existing and new projects.

In order to map the existing field of digital epigraphy including current practices and standards, as well as to clarify the (digital) needs of the discipline, we circulated two scoping surveys between February and April 2022 (FAIR Epigraphy: Scoping survey for partners and collaborators and Digital epigraphy in 2022: scoping survey for all digital epigraphy projects). The results of the surveys presented in the current report will be used to plan the activities and efficiently allocate the resources of the FAIR Epigraphy Project in the following three years. The report contains only the answers where participants gave consent to publish the anonymised responses. In cases where the consent was not given, the data is used to inform the FAIR Epigraphy decision but is excluded from the report.

The survey answers are anonymised so that individual projects cannot be identified on the basis of their replies and the data is stored as a TSV (tab-separated value) file within the project’s GitHub repository (https://github.com/FAIR-epigraphy/scoping_survey_report/) as a supplement to the text of this report and can be accessed under the CC-BY-SA 4.0 International License. The report is produced in two formats: a traditional PDF (available at https://github.com/FAIR-epigraphy/scoping_survey_report/blob/main/scripts/01_FAIR_epi_report.pdf) and an interactive HTML page where the reader can browse through the responses (available at https://fair-epigraphy.github.io/scoping_survey_report/scripts/01_FAIR_epi_report.html). If you are viewing this report in the HTML format, to browse the data click on the arrow in the top right corner of the data tables in each section (where the arrow is available).

Disclaimer: The views and opinions expressed within the survey (presented in tables) do not necessarily reflect the views or positions of the FAIR Epigraphy Project itself.

2 FAIR Epigraphy partner projects

This section summarises the results of the online survey FAIR Epigraphy: Scoping survey for partners and collaborators aimed at those established digital projects which are already official partners and collaborators of the FAIR Epigraphy Project. We sent the survey to 14 partner projects. We received 13 responses to the survey, a response rate of 93% with some participants responding on behalf of two projects combined into one response (and thus skewing the response rate). 100% of participating partner projects gave consent to publish their anonymised responses as part of this report.

The partner projects represent successful projects with the average duration of a project being 6 years. The shortest participating project reported their duration as 3 years and the longest as 207 years.5

2.1 Language coverage

Question: What is the predominant language of epigraphic data in your project (for mixed collections or collections where other languages are predominant provide details in Other)6

Commentary: The language coverage of the participating projects consists predominantly of Latin and Greek either alone or in combination (representing 53% of the answers). 8 participating projects record inscriptions in one language only, while 5 contain inscriptions in two or more languages (7 being the maximum number of listed languages in one project.)

The Other (i.e. other than Greek and Latin) category encompassed a substantial part of the surveyed projects (47%), documenting the need to expand beyond the traditional Latin and Greek focus of the classical epigraphic discipline. The languages listed as Other consisted of Other, Ancient Celtic, Elymian, Etruscan, Gaulish, Oscan, other epichoric languages from the west provinces of Rome (excl. Africa), Phoenician-Punic, Punic, Raetic, Sikel. It is, however, worth noting that the majority of participating projects record languages from the wider Mediterranean/European linguistic space.

Unique combinations of languages as retrieved from the survey:


2.2 IT infrastructure

Question: Does the project have a website?

Commentary: All of the participating projects currently maintain an online presence (as of February-April 2022).


Question: Does your project have an IT specialist(s)?

Commentary: The majority of the digital partner projects have an IT specialist, yet only 2 projects have an equivalent of 1.0 FTE or more at their disposal. 54 % of projects have access to part-time IT support for their projects, which in some instances may be only a few hours per week per project. 4 projects reported no availability of IT support, even on a part-time basis (representing 31% of participating partner projects).


Question: Does your project store epigraphic data in the following formats…?

Commentary: The majority of projects use Epidoc XML as their main output data format (77% of participating projects), either in combination with other formats or as the sole data format. Other data formats are represented less frequently: JSON (15%), RDF (15%), SQL (31%) and CSV (15%). 31% of projects use only one type of data format, while 46% use two or more data format types within their project.

2.3 Data sharing

Question: Do you share your data outside of your project?

Commentary: All partner projects reported their willingness to share the data, even if they are not currently doing so, or if they provide the data only on demand. 54% of partner projects share the data under a Creative Commons license (https://creativecommons.org/), which is the preferred mode according to the FAIR data principles. The majority of partners which are currently not using Creative Commons licenses are considering their use in the future.


Question: How do you share your data with users outside your project?

Commentary: All partner projects provide at least one way of sharing the data (whether it is currently accessible to the public or not, or it is intended to be accessible in the future). The average (median) number of sharing methods per project is 2.

Figure showing the popularity of individual sharing methods and formats across partner projects.

Figure showing the popularity of individual sharing methods and formats across partner projects.

As seen in Figure 1, direct download of the Epidoc XML is by far the most popular format for data sharing (implemented by 6 projects), however other Open Science services are starting to make their way into established digital epigraphy projects, such as sharing via a public repository, implemented by 4 (GitHub) and 4 (Zenodo) projects respectively, as well as providing raw data in the CSV (comma-separated value) format (4 projects), or as JSON (JavaScript Object Notation) files (2 projects). A minority of participating partner projects shares the data on an on-demand basis or have a non-public API access point to their data.

2.4 Institutional policies

Question: Does your institution or funding body require your project to comply with any data policies (e.g. FAIR principles, data storage, data sharing, Open Science)?

Commentary: The majority of projects (represented by 54%) are required to comply with data-related policy introduced either by their institution or a funding body. 47% of partner projects are not required to follow any data policy, but some follow one on a voluntary basis.


Question: If you have answered YES in the previous question, please specify what are the policies, or provide a link.

Commentary: Several of the partner projects follow the ERC data and open access policies. More information on ERC Open Research Data and Data Management Plans can be found at https://erc.europa.eu/sites/default/files/document/file/ERC_info_document-Open_Research_Data_and_Data_Management_Plans.pdf or at ERC Open Science policies page https://erc.europa.eu/managing-your-project/open-science.

2.5 Open Science practice

Question: Standardized terminologies: The project uses the following systems:

Commentary: Internal authority lists are the most widely used method to record epigraphic terminologies (62 % of projects). The vocabularies for the epigraphic discipline created by the EAGLE project (https://www.eagle-network.eu/resources/vocabularies/) are used either in their original form (38% of participating projects) or in a form modified for the individual needs of the project (54% of participating projects). The use of non-standardized internal authority lists and the need for modifications suggests that the EAGLE vocabularies do not in fact offer sufficiently a community-wide standard and need to be improved before becoming one. This process has been already started by the Epigraphy.info Vocabularies working group of which Hermankova, Horster, and Prag are all members. For more details see https://epigraphy.info/vocabularies_wg/. If you would like to join the working group, please get in touch with the authors.


Question: Standardized terminologies: data on combination of vocabularies systems

Commentary: The majority of projects (46%) use only one method to record their standard terminologies, while 54% of projects use a combination of two or more methods. Internal authority lists are used in combination with the EAGLE vocabularies both in their original and modified form. Sharing or publication of internal authority lists would therefore be highly beneficial for improving the existing EAGLE vocabularies.


Question: Linked Open Datasets: The project uses the following systems:

Commentary: From the listed Linked Open Datasets (LOD), Trismegistos and Pleiades are by far the most popular, being used in 77% and in 69% of all participating projects. The EAGLE vocabularies are used in 54% of all participating projects.

The group of LOD resources focusing on geographic data (e.g. Pleiades, Adriatlas, Cartapulia, Trismegistos) seems to be strongly represented amongst participating projects (92 % use at least one of them), suggesting that geographic LOD are well established for the study of the ancient world.

Prosopographic data, as represented by EDH People, PIR, and LGPN are used by 46% of all participating projects. The survey responses suggest there is a great space for improvement and potentially great benefit in creating and further improving prosopographic LOD.

3 Non-partnered epigraphy projects

This section summarises the results of the online survey Digital epigraphy in 2022: scoping survey targeted at digital projects currently listed under Digital Epigraphy Projects on the Digital Classicist Wiki page (https://wiki.digitalclassicist.org/Category:Projects) and which was possible to trace in February 2022. The survey was sent to 83 projects and the link circulated until mid-April 2022. We have received 27 responses to the survey, a response rate of 31%. Some participants contributed on behalf of multiple projects in one response, which we were unable to disentangle and thus the response rate is slightly skewed. 96% (26) of non-partnered projects gave consent to publish their anonymised responses as part of the current report. The remaining responses are excluded from the report but will be used to inform the FAIR Epigraphy planning and decision making.

The respondents represent a wide range of projects from well established projects to short-term PhD projects, with the average duration of a project being 5.5 years. The shortest participating project reported their duration as 1 year and the longest 117 years.

Question: Is the project still active?

Commentary: 73% of responding projects are still active, while 12% of projects are permanently closed and do not consider restarting in the future. 15% of projects are currently not active, but might be reactivated in the future.

3.1 Language coverage

Question: What is the predominant language of epigraphic data in your project (for mixed collections or collections where other languages are predominant provide details in Other)

Commentary: The language coverage of the participating projects consisted predominantly of Latin and Greek projects, representing 64% of projects combined. Greek is the most frequent language, either as the sole/predominant language (11 projects) or in combination with other languages (5 projects). Latin is the sole/predominant language in 6 projects or in combination with other languages (5 projects). 18 participating projects record inscriptions in one language only, while 8 contain inscriptions in two or more languages (5 being the maximum number of listed languages.).

The languages listed as Other consisted of languages such as Phoenician, Akkadian, Ancient Languages of the Mediterranean area, Arabic, Aramaic, Hattian u.a., Hittite, Hurrian, Luwian, Neopunic, Other, Palaeo-European, Palaeo-Hispanic, Punic. All languages come from the wider Mediterranean/European linguistic space.

Unique combinations of languages as retrieved from the survey:

3.2 IT infrastructure

Question: Does the project have a website?

Commentary: Almost all participating projects maintain an online presence (as of February-April 2022).


Question: Does your project have an IT specialist(s)?

Commentary: Only 8% of projects have an equivalent of 1.0 FTE or more IT support at their disposal. 35% of digital projects have an IT specialist available for at least several hours per week or share them with other digital projects within their institution. Several projects report difficulty with finding financial resources to support further development and long-term sustainability of the project or even day-to-day support. 23% of the participating projects report that they currently do not have any access to IT support. An additional 27% of projects did not indicate whether they have access to IT support because they are no longer active. In order to understand the precise significance of this data, it would be necessary in future surveys to clarify the current funding status of individual projects. However, the general trend of limited access to IT support amongst non-partnered project stands out.


Question: Does your project store epigraphic data in the following formats…?

Commentary: The majority of projects use Epidoc XML as their main output data format (42% of participating projects), either in combination with other formats or as the sole data format. SQL and similar database formats are relatively common, in 31% of projects. Other data formats are represented less frequently by a small number of projects and mostly as complementary data formats to more popular formats such as Epidoc XML or SQL: JSON (8%), RDF (8%), and CSV (12%). 4% of projects indicated the use of a combination of analogue data and 3D data format. 4% of projects indicated using their own version of Epidoc XML, adapted to their specific needs.

19% of projects use only one type of data format, while 23% use two or more data format types. The data format of the projects that are no longer active is recorded in the following Data sharing section, under Closed Projects.

3.3 Data sharing

3.3.1 Active projects

This section summarised only the ‘active’ projects. For ‘closed/non-active’ projects, see the section below.

Question: Do you share your data outside of your project?

Commentary: As of February 2022, 19 projects participated in the survey as active projects. The majority of active projects are willing to share their data, representing 82% of participating projects. 57% of active projects share data under a Creative Commons license, which is the preferred mode according to the FAIR data principles. 10% of active projects share data without any specific license, while 5% provide data only on demand.


Question: How do you share your data with users outside your project?

Commentary: As of February 2022, all but one of the active projects provide at least one way of sharing data (whether it is currently accessible to the public or not, or it is intended to be accessible in the future). The average (median) number of sharing methods per project is 2, while the maximum number is 6.

There is no discipline-wide standard data repository as is common in other disciplines (e.g. TDAR, https://core.tdar.org/, or AriadnePlus, https://ariadne-infrastructure.eu/ for archaeological data). Thus all projects use either their institutional or national resources that may or may not be ideal for epigraphic data. Among those who share data, the Epidoc XML format is the most popular format for data sharing (14 projects), alongside providing data output upon search on the project’s website (in whichever format). Open Science practices do not seem to be a popular choice in digital epigraphy, such as sharing via public repository, e.g. GitHub (2 projects) or Zenodo (2 projects), as well as providing raw data in the CSV (comma-separated value) format, or as JSON (JavaScript Object Notation) files. Computer-automated access to data is rare and manual human interaction, such as manual selection and/or manual download of files prevails, potentially hindering any quantitative and reproducible studies, or the linking of datasets via automated processes. For example, an API access point is currently available only for a very limited number of projects.


3.3.2 Closed projects

This section summarised only the ‘closed/non-active’ projects. For ‘active’ projects, see the section above.

Question: Is the data created by your project accessible?

Commentary: As of February 2022, 7 of the participating projects are closed. 71% of them provide access to their data under a Creative Commons license even though the project is no longer active, 14% of closed projects provide access without any license and 14% do not currently provide access to the data they have created during the live phase of their project, but they are considering making the data available.


Question: Is the data created by your project accessible?

Commentary: As of February 2022, 7 of the participating projects are closed. Out of these closed projects, 57% provide their data in the Epidoc XML format on their website, 43% provide their data via public repository on GitHub, 29% via other publicly accessible repositories. 14% of closed projects dot currently share data outside the project (=1 project).

The fact that even the closed projects share their data in some form even after the project is no longer active/does not have funding for further development or maintenance is positive. However, most of the data sit on private or institutional websites that can easily disappear, along with access to the data. The best practice for the longevity of these created datasets would be archiving them to a publicly accessible repository, such as GitHub, Zenodo, HAL, Open Science Framework or any similar archival infrastructure.


3.4 Institutional policies

Question: Does your institution or funding body require your project to comply with any data policies (e.g. FAIR principles, data storage, data sharing, Open Science)?

Commentary: 58% of projects do not explicitly have to follow any policy. 16% of projects are required to comply with data related policies, while an additional 20% of projects are encouraged to comply with FAIR data principles but no rules are enforced.

However, some of the projects are already closed and may have been closed for some time. Data policy requirements have undergone major changes in the last 5 years, and it is more than likely that such policies were not previously required, which may be reflected in the relatively low compliance with FAIR and Open Science data policies.


Question: If you have answered YES in the previous question, please specify what are the policies, or provide a link.

Commentary: Data policies in the field of digital epigraphy are still being implemented and so are not yet reflected in past and current projects. There is a variation between national policies amongst our responses, with France and Norway providing examples in the implementation of Open Science in digital epigraphy.

Additional investigation:

The main factor influencing the need to comply with institutional principles seems to be the age of the project - for projects created in recent years (e.g. since 2015), we would expect FAIR data policies to be one of conditions for securing funding. In order to verify this hypothesis, we collected additional information manually from project websites and published materials, such as the official project start-date, the country of origin of a given project, indications of existing funding and primary focus of a given project (text publication or metadata collection). The anonymised data is saved as a TSV in the same GitHub repository as /data/02_scoping_survey_anonymised_PostSurvey.tsv.

The chart shows the existence of institutional data policy of non-partnered projects and its development over time.

The chart shows the existence of institutional data policy of non-partnered projects and its development over time.

Our expectations on data policies being progressively implemented over the last seven years were confirmed only partially. As Figure 1 above demonstrates, the number of projects that indicated an existing institutional data policy grows steadily from 2015 (indicated by brown dashed vertical line). On the contrary, the number of projects that indicated no existing data policy decreases, but only relatively slowly. The projects responded N/A are those which consider themselves in February 2022 as closed.

The chart shows the requirement of institutional data policy of non-partnered projects by country.

The chart shows the requirement of institutional data policy of non-partnered projects by country.

Figure 2 above shows clear geographic differences in implementation of data policies based on the main country where the project is based. France, Germany, and Italy are listed as countries where data policies are required, yet some projects in Germany and Italy answered that no data policies are required. Thus the practical implementation of data policies may depend on the particular funding agency or institution, rather than on nation-wide policies. We are well aware that data policies might be different for projects funded from other sources than national or European research council schemes, where such requirements may not be compulsory. Our results are only preliminary and based on a very small sample and need to be confirmed by further and more detailed investigation.

3.5 Open Science Practice

Question: Are you familiar with the FAIR data principles?

Commentary: The majority of projects (73%) is familiar with FAIR data policy, however, 23% of participating projects are only vaguely familiar and would benefit from clear guidelines customised for the epigraphic community. Only 4% of projects are not familiar with FAIR data principles.


Question: Standardized terminologies: The project uses the following systems:

Commentary: 9% of projects do not use any standardized lists or vocabularies. Those projects are most likely those who focus on 3D visualisation of inscriptions or publication of metadata, rather than publication of text editions. 37% of projects use their own internal authority lists. EAGLE vocabularies in their original form are used by 20% of projects, and in an edited version by 17% of projects. Several projects that focus on languages other than Greek and Latin have created their own systems, sometimes working from existing vocabularies, but also building thesauri, e.g. the creation of a thesaurus such as the OpenTheso tool (EpiVoc) https://thesaurus.mom.fr/opentheso/?idt=th61 aligned with existing vocabularies or using terms of the community.


Question: Are you willing to share the standardized terminologies used in your project with us (e.g. type of inscription vocabularies, type of material etc.)

Commentary: The vast majority of participating projects (88%) is willing to share any standardized terminologies used in their project, such as terminologies covering the type of inscription, the type of material etc.


Question: Linked Open Datasets: The project uses the following systems:

Commentary: Pleiades is the most popular LOD dataset, being used in 50% of all participating projects, alongside Trismegistos also in 50%. EAGLE vocabularies are represented in 35% of participating projects, while combined prosopographic datasets (LGPN+PIR) feature in 39% of projects. Only 12% of participating projects do not use any LOD.

The group of LOD resources focusing on geographic data (e.g. Pleiades, iDai Gazetteer, Geonames, Trismegistos) seems to be strongly represented amongst participating non-partnered projects (77 % use at least one of them), suggesting that geographic LOD are well established for the study of the ancient world.

Prosopographic data, represented by LGPN, PIR, and PLRE are used by 35% of all participating non-partnered projects.

Chronological data, represented by Period.O and GODOT are used by 8 % of all participating non-partnered projects.

It is worth noting that not every category listed amongst the responses is a true linked open dataset. The survey responses suggest there is a considerable room for improvement and potentially great benefit in creating and further improving LOD for the study of the ancient world.

4 Future needs of digital epigraphy

This section covers the wishes of all participating digital epigraphy projects. The responses were anonymised so no individual or project can be identified but are otherwise presented as submitted in the survey.

4.1 Partner projects

Question: Our project would like to be able to use within the next three years:

Commentary: The most popular is the option Bibliographical references to all epigraphic publications with stable URI (e.g. Zenon), representing the wishes of 85% of all partner projects.

The great interest in prosopographic LOD for epigraphy is supported by 77% of partner projects for the Roman world and 54% of projects for the Greek world respectively.

The improved EAGLE vocabularies are wished for by 77% of partner projects.

The domain-specific repository for epigraphic data (discussed also under Other responses) or the open and accessible RDF Triplestore do not seem to be the highest priority of participating projects, but are still relatively popular as 38% of respondants wishes for one of the two. One participating project wishes specifically for the following: Other: standardised terminologies for instrumentum domesticum and palaeography.


Question: Potential ideas that our project would benefit from:

Commentary: 92% of all projects consider that they would benefit from A set of guidelines for FAIR and Linked Open Data in epigraphy. There is a general interest in practical examples and workshop(s) on how to use LOD and FAIR Principles in epigraphy, as well as resources for quantitative analysis of data in epigraphy.


Question: Additional digital needs

## [1] "Further development of a single research portal to interrogate multiple
epigraphic databases; development of a specific API to use the standardized common
vocabularies"
## [2] "- Further collaboration and development of concepts for vocabularies. - Getty
vocabularies crosswalks where they apply - In doing all this work, we hope that FAIR
Epigraphy will use as many different applications of the EpiDoc schema as possible, so as
to accommodate the ways different projects mark up documents and metadata."
## [3] "Sustainable common platform of all digital epigraphic editions (a Vision)"
## [4] "Advisory Board for new Digital Epigraphy projects, guidelines for FAIR epigraphy"
## [5] "Standards for palaeography, prosopography, bibliograpy, instrumentum domesticum
and linguistic analysis"
## [6] "1) Provide us support in switching to Epidoc XML encoding 2) Help us clarify how
our data are accessible to the public (CC-BY 4.0) 3) Promote the sustainability of
projects whose funds have ended 4) Foster interoperability between digital resources 5)
Improve the standardization of projects in digital epigraphy"

Commentary: This section covers the additional needs of partner projects. Partner projects would like to see a platform linking epigraphic data from multiple sources, including a stable reference point or an API for improved epigraphic vocabularies (in other words, the sort of resource which agreed vocabularies and an RDF triplestore might facilitate). Partner projects would also like to be able to use guidelines for FAIR practices in epigraphy, which currently do not exist.

4.2 Non-partnered projects

Question: Our project would like to be able to use within the next three years:

Commentary: The most popular is the option Bibliographical references to all epigraphic publications with stable URI (e.g. Zenon) representing the wishes of 65% of all participating projects. The great interest in onomastic and prosopographic LOD for both the Greek and Roman world is supported by 92% of non-partnered projects. The improved EAGLE vocabularies are wished for by 65% of non-partnered projects. The domain-specific repository for epigraphic data (23%) or the open and accessible RDF Triplestore (42%) do not seem to be the highest priority of participating projects, but still a relatively popular response. One participating project wishes specifically for the following: Other: Geolocation of inscriptions and searches related to geography, which other existing projects, such as Pleiades or Trismegistos, might be better equipped to provide. The differences between the wishes and answers of the non-partnered projects is inter alia related to the fact that several partner projects come from a world beyond Greek and Latin epigraphy.


Question: Potential ideas that our project would benefit from:

Commentary: 85% of all non-partnered projects consider that they would benefit from A set of guidelines for FAIR and Linked Open Data in epigraphy. There is a general interest in practical examples (65%) and workshop(s) on how to use LOD in epigraphy (62%), as well as resources for quantitative analysis of data in epigraphy (42%).


Question: Additional digital needs

## [1] "Digitalization of Roman Inscriptions for dissemination and research"
## [2] "A workshop on integrating Mycenaean data into epigraphy?"
## [3] "Data retrieval also on spatial base: for example: from maps of the single
archaeological sites and single complexes (as plans or 3d scans of catacombs and
churches...). Links with the existing geographical and georeferenced resources.
Controlled and shared vocabulary about palaeographical features; Storage, search and
analysis of the 'aberrant forms' (not to be 'corrected') for Late Latin and
Late/Byzantine Greek words (and names)."
## [4] "The most important for me would be 1/ to have a more complete view of real FAIR
epigraphic projects and 2/a sustainable \"common place\" where to find resources + tools
and help + let's call it an improved EAGLE + and more \"international\""
## [5] "It would be very nice (but I might be a bit biased!) if FAIR Epigrahy would like
to help develop EFES (EpiDoc Front-End Services). For example by helping to make the
existing RDF data export functionality really usable even by less experienced people."
## [6] "I would love to see it revitalized and improved with FAIR and Linked Open Data
guidelines and other resources."
## [7] "Unicode for Punic"
## [8] "help to act in a shared dedicated academical environment and help in spreading
our results"
## [9] "FAIR Epigraphy's team can help us by providing advice on specifical topics"
## [10] "It would be useful to have an Open Access database of images of inscriptions
that are free from Copyright limits."

Commentary: This section covers additional needs of participating digital projects. Some of the wishes might be beyond the scope of the FAIR Epigraphy project but the responses provide valuable guidance and hint at some of the challenges the epigraphic discipline will be facing in the near future. The responses may inspire other projects with similar needs to join forces and potentially develop solutions together. The FAIR Epigraphy project may offer one channel to explore and collaborate on the meeting of these needs in future.

5 Summary

The present report demonstrates a great variation in the epigraphic discipline in 2022. We received answers from 13 partner projects and 27 non-partnered projects. Although it may seem that a relatively small number of projects participated in the survey, nontheless, we consider that responses provide a representative sample of the current state of the discipline. The response rate of non-partnered projects was lower than the response rate of partner projects (100 % vs 31 %). This may reflect the overall lower rate of compliance with FAIR principles, or the fact that non-partnered projects may have ceased active operation before FAIR principles were established and implemented by their institutions and funding bodies.

The responses represent a diverse selection of projects, based mostly in Europe and the USA. The majority of projects focus predominantly on publication of textual editions of inscriptions (where Epidoc XML is the main data format), while some focus on publication of related metadata without producing new editions of text (and thus use different data formats than Epidoc XML).

Although the majority of participating projects record inscriptions in Latin and Greek, we see a diverse array of projects expanding beyond the traditional focus of the discipline the way as it was established in the 19th century. The projects participating in the survey include well-established projects that have existed over several decades, regional or thematic corpora, and more specialised, short-term PhD projects. We have observed a clear distinction between, on the one hand, projects with a long tradition and most importantly with relatively stable institutional support, which have access to institutional repositories, policies and at least basic IT services; and on the other, small-scale projects with limited support and access to resources and training, typified by short-term projects on a specific topic that may lack access to long-term institutional support. One of the missions of the FAIR Epigraphy Project is to support projects with limited access to resources, as well as established projects, by providing accessible and comprehensible training and guidelines for FAIR and Linked Open Data principles in epigraphy.

The established projects mostly follow the FAIR principles, although to a variable extent. The majority of established projects share their data under a Creative Commons license in one or more widely accepted formats (with Epidoc XML being the most popular format for all types of projects irrespective of their status and longevity). In general, the more established projects provide more access points to their data as well as more data formats than the projects with less institutional support. The use of standardized terminologies is still limited and project-specific, mostly due to the lack of uniformly accepted standards. On contrary, the adoption of Linked Open Datasets (LOD) and creation of links within the epigraphic datasets with stable identifiers to those LOD sources seems to be fairly advanced, especially in the case of well-established LOD domains such as Pleiades or Trismegistos for Graeco-Roman projects, and to a lesser extent the EAGLE vocabularies.

The non-partnered projects follow the FAIR principles, but to a lesser degree than the established projects. There are, however, some short-term projects that fulfill or exceed the requirements for Open Science, but as a general rule the compliance is lower than in the case of established projects. The reason for lower compliance in some projects is most likely a combination of short-term institutional support, limited access to IT support and poor accessibility of guidelines and discipline-specific training.

As to the current and future needs of digital epigraphy, there is a clear demand for more and better LOD. The requests concerned especially bibliographical references to standard epigraphic corpora, standardisation of discipline-specific vocabularies, and prosopographic LOD for the ancient world. In addition, there is a wish for support by training and the provision of accessible resources and guidelines for FAIR and Open epigraphy.

In the near future, we plan to undertake several in-depth interviews with our partners to confirm some of our assumptions and to draft a concrete plan for the following three years. However, it is clear from the survey responses, that we should direct our attention to three main tasks:

  1. implementing and hosting standards for epigraphic vocabularies (e.g. inscription type, material, object etc.)
  2. implementing and hosting standards for bibliographical records (e.g. stable and unique records for all major epigraphic editions)
  3. building a platform for FAIR and Open Epigraphy on the infrastructure provided by the University of Oxford (CSAD), that will function as an information hub, providing not only training and good practice examples, but also hosting the resources and tools.

We hope to run a similar survey annually to track any progress within the discipline and closely monitor changing needs of individual projects in digital epigraphy.

6 Bibliography

Assael Y., Sommerschield T., Shillingford B., Bordbar M., Pavlopoulos J., Chatzipanagiotou M., Androutsopoulos I., Prag J. & Freitas N. de (2022). Restoring and attributing ancient texts using deep neural networks. Nature 603 (7900): 280–283. https://doi.org/10.1038/s41586-022-04448-z.
Bagnall R., Talbert R.J.A., Bond S., Becker J., Elliott T., Gillies S., Horne R., McCormick M., Rabinowitz A., Turner B. & Twele R. (2006). Pleiades: A community-built gazetteer and graph of ancient places. http://pleiades.stoa.org.
Elliott T. (2015). Epigraphy and Digital Resources. Vol. 1. Oxford University Press. https://doi.org/10.1093/oxfordhb/9780195336467.013.005.
Geser G. (2016). WP15 Study: Towards a Web of Archaeological Linked Open Data. Ariadne. http://legacy.ariadne-infrastructure.eu/wp-content/uploads/2019/01/ARIADNE_archaeological_LOD_study_10-2016.pdf.
Glomb T., Kaše V. & Heřmánková P. (2022). Popularity of the cult of Asclepius in the times of the Antonine Plague: Temporal modeling of epigraphic evidence. Journal of Archaeological Science: Reports 43: 103466. https://doi.org/doi.org/10.1016/j.jasrep.2022.103466.
Heřmánková P., Kaše V. & Sobotkova A. (2021). Inscriptions as data: Digital epigraphy in macro-historical perspective. Journal of Digital History 1. https://journalofdigitalhistory.org/en/issue/jdh001.
Mullen A. & Bowman A.K. (2021). Manual of Roman everyday writing Volume 1 Volume 1. https://latinnow.files.wordpress.com/2021/11/latinnow-mullen-and-bowman-2021-mrew-scripts-and-texts-1.pdf.
Orlandi S. (2021). Digital Projects in Epigraphy: Research Needs, Technical Possibilities, and Funding Problems. In: Velasquéz Soriano I. & Espinosa Espinosa D. (eds.). Epigraphy in the Digital Age : Opportunities and challenges in the Recording, Analysis and Dissemination of Inscriptions. Archaeopress, Oxford, p. 1–8.
Roueche C. (2022). Inscriptions of Roman Tripolitania 2021. The Society for Libyan Studies.
Roueche C., Reynolds J. & Bodard G. (2020). Inscriptions of Roman Cyrenaica (2020). The Society for Libyan Studies.
Tupman C. (2021). Where Can Our Inscriptions Take Us? Harnessing the Potential of Linked Open Data for Epigraphy. In: Velasquéz Soriano I. & Espinosa Espinosa D. (eds.). Epigraphy in the Digital Age : Opportunities and Challenges in the Recording, Analysis and Dissemination of Inscriptions. Archaeopress, Oxford, p. 115–128.
Wilkinson M.D., Dumontier M., Aalbersberg Ij.J., Appleton G., Axton M., Baak A., Blomberg N., Boiten J.-W., Silva Santos L.B. da, Bourne P.E., Bouwman J., Brookes A.J., Clark T., Crosas M., Dillo I., Dumon O., Edmunds S., Evelo C.T., Finkers R., Gonzalez-Beltran A., Gray A.J.G., Groth P., Goble C., Grethe J.S., Heringa J., Hoen P.A.C. ’t, Hooft R., Kuhn T., Kok R., Kok J., Lusher S.J., Martone M.E., Mons A., Packer A.L., Persson B., Rocca-Serra P., Roos M., Schaik R. van, Sansone S.-A., Schultes E., Sengstag T., Slater T., Strawn G., Swertz M.A., Thompson M., Lei J. van der, Mulligen E. van, Velterop J., Waagmeester A., Wittenburg P., Wolstencroft K., Zhao J. & Mons B. (2016). The FAIR Guiding Principles for scientific data management and stewardship. Scientific Data 3 (1): 160018. https://doi.org/10.1038/sdata.2016.18.
Willi A. (2021). Manual of Roman everyday writing Volume 2 Volume 2. https://latinnow.files.wordpress.com/2021/06/willi-2021-writing-equipment-latinnow.pdf.

  1. Johannes Gutenberg University in Mainz, , https://orcid.org/0000-0002-6349-0540↩︎

  2. Johannes Gutenberg University in Mainz, Corpus Inscriptionum Latinarum/BBAW, , https://orcid.org/0000-0003-1434-224X↩︎

  3. University of Oxford, , https://orcid.org/0000-0003-3819-8537↩︎

  4. This work was supported by the Arts and Humanities Research Council (AHRC) [grant number AH/W010682/1]; and the Deutsche Forschungsgemeinschaft (DFG) [grant number 468455971]. The report is published via Zenodo, https://doi.org/10.5281/zenodo.6610696↩︎

  5. Obviously not digital for the whole of that period.↩︎

  6. If you are viewing this report in the HTML format, you can click on the arrow in the top right corner of the table to see more data (where available). This functionality is not available in the PDF format.↩︎

LS0tCnRpdGxlOiB8CiAgIVtdKC4uL2Fzc2V0cy9iYW5uZXIucG5nKXt3aWR0aD0zaW59ICAKICBEaWdpdGFsIEVwaWdyYXBoeSBpbiAyMDIyXltUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgQXJ0cyBhbmQgSHVtYW5pdGllcyBSZXNlYXJjaCBDb3VuY2lsIChBSFJDKSBbZ3JhbnQgbnVtYmVyIEFIL1cwMTA2ODIvMV07IGFuZCB0aGUgRGV1dHNjaGUgRm9yc2NodW5nc2dlbWVpbnNjaGFmdCAoREZHKSBbZ3JhbnQgbnVtYmVyIDQ2ODQ1NTk3MV0uIFRoZSByZXBvcnQgaXMgcHVibGlzaGVkIHZpYSBaZW5vZG8sIGh0dHBzOi8vZG9pLm9yZy8xMC41MjgxL3plbm9kby42NjEwNjk2XSAKc3VidGl0bGU6ICdBIFJlcG9ydCBmcm9tIHRoZSBTY29waW5nIFN1cnZleSBvZiB0aGUgRkFJUiBFcGlncmFwaHkgUHJvamVjdCcKYXV0aG9yOgotIFBldHJhIEhlxZltw6Fua292w6FeW0pvaGFubmVzIEd1dGVuYmVyZyBVbml2ZXJzaXR5IGluIE1haW56LCBwZXRyYS5oZXJtYW5rb3ZhQHVuaS5tYWluei5kZSwgaHR0cHM6Ly9vcmNpZC5vcmcvMDAwMC0wMDAyLTYzNDktMDU0MF0KLSBNYXJpZXR0YSBIb3JzdGVyXltKb2hhbm5lcyBHdXRlbmJlcmcgVW5pdmVyc2l0eSBpbiBNYWlueiwgQ29ycHVzIEluc2NyaXB0aW9udW0gTGF0aW5hcnVtL0JCQVcsIGhvcnN0ZXJAdW5pLm1haW56LmRlLCBodHRwczovL29yY2lkLm9yZy8wMDAwLTAwMDMtMTQzNC0yMjRYXQotIEpvbmF0aGFuIFByYWdeW1VuaXZlcnNpdHkgb2YgT3hmb3JkLCBqb25hdGhhbi5wcmFnQG1lcnRvbi5veC5hYy51aywgaHR0cHM6Ly9vcmNpZC5vcmcvMDAwMC0wMDAzLTM4MTktODUzN10KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNzczogLi4vInN0eWxlLmNzcyIKICAgIGRmX3ByaW50OiBwYWdlZAogICAgI2ZvbnRzaXplOiAxMnB0CiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgZmlnX2NhcHRpb246IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMycKICAgIGRmX3ByaW50OiBrYWJsZQogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF90ZXg6IHRydWUKICAgICNsYXRleF9lbmdpbmU6IHBkZmxhdGV4CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6ICIuLi9wcmVhbWJsZS50ZXgiCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc0Jwpjc2w6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jaXRhdGlvbi1zdHlsZS1sYW5ndWFnZS9zdHlsZXMvbWFzdGVyL3Jlc2VhcmNoLWluc3RpdHV0ZS1mb3ItbmF0dXJlLWFuZC1mb3Jlc3QuY3NsCmxpbmstY2l0YXRpb25zOiB5ZXMKem90ZXJvOiB5ZXMKYmlibGlvZ3JhcGh5OiAuLi9kYXRhL2JpYmxpb2dyYXBoeS5iaWIKZGVzY3JpcHRpb246IG51bGwKZm9udHNpemU6IDEycHQKdXJsY29sb3I6IGJsdWUKY2l0ZWNvbG9yOiBjeWFuCmRvY3VtZW50Y2xhc3M6IHNjcnJlcHJ0Cmdlb21ldHJ5OiBtYXJnaW49MWluCiN0aGFua3M6ICJUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgQXJ0cyBhbmQgSHVtYW5pdGllcyBSZXNlYXJjaCBDb3VuY2lsIChBSFJDKSBbZ3JhbnQgbnVtYmVyIEFIL1cwMTA2ODIvMV07IGFuZCB0aGUgRGV1dHNjaGUgRm9yc2NodW5nc2dlbWVpbnNjaGFmdCAoREZHKSBbZ3JhbnQgbnVtYmVyIDQ2ODQ1NTk3MV0uIgphYnN0cmFjdDogIlRoaXMgZG9jdW1lbnQgbWFwcyB0aGUgc3RhdGUgb2YgZGlnaXRhbCBlcGlncmFwaHkgaW4gMjAyMiwgd2l0aCBhIGZvY3VzIG9uIE9wZW4gU2NpZW5jZSBwcmFjdGljZXMgYW5kIGFjY2Vzc2liaWxpdHkgb2YgcmVzb3VyY2VzLiBUaGUgcmVwb3J0IGlzIGJhc2VkIG9uIGFub255bWlzZWQgcmVzcG9uc2VzIHJlY2VpdmVkIGR1cmluZyB0aGUgZGlnaXRhbCBzdXJ2ZXkgY2lyY3VsYXRpbmcgYmV0d2VlbiBGZWJydWFyeSBhbmQgQXByaWwgMjAyMiwgb3JnYW5pc2VkIGJ5IHRoZSBGQUlSIEVwaWdyYXBoeSBQcm9qZWN0LiBUaGUgcmVzcG9uc2VzIGNvdmVyIGEgYnJvYWQgc3BlY3RydW0gb2YgcHJvamVjdHMgZnJvbSBFdXJvcGUgYW5kIHRoZSBVU0EsIHJhbmdpbmcgZnJvbSB3ZWxsIGVzdGFibGlzaGVkIHByb2plY3RzIHdpdGggIHJlbGF0aXZlbHkgc3RhYmxlIGluc3RpdHV0aW9uYWwgc3VwcG9ydCB0byBzaG9ydC10ZXJtIHByb2plY3RzIHdpdGggbW9yZSBuYXJyb3cgZm9jdXMgYW5kIGxpbWl0ZWQgYWNjZXNzIHRvIElUIHN1cHBvcnQgYW5kIGZ1bmRpbmcuIFRoZSByZXN1bHRzIG9mIHRoZSBzdXJ2ZXkgd2lsbCBiZSB1c2VkIHRvIGluZm9ybSB0aGUgcGxhbm5pbmcgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IHByb2plY3QgaW4gdGhlIGZvbGxvd2luZyB0aHJlZSB5ZWFycy4gVGhlIHJlcG9ydCBpcyBmdWxseSByZXByb2R1Y2libGUgKHdyaXR0ZW4gaW4gUiBwcm9ncmFtbWluZyBsYW5ndWFnZSkgYW5kIGFsb25nIHdpdGggdGhlIGFub255bWlzZWQgZGF0YSBpcyBhY2Nlc3NpYmxlIHZpYSBpdHMgb3duIEdpdEh1YiByZXBvc2l0b3J5IChodHRwczovL2dpdGh1Yi5jb20vRkFJUi1lcGlncmFwaHkvc2NvcGluZ19zdXJ2ZXlfcmVwb3J0KSwgYW5kIHB1Ymxpc2hlZCB0aHJvdWdoIFplbm9kbyAoaHR0cHM6Ly9kb2kub3JnLzEwLjUyODEvemVub2RvLjY2MTA2OTYpLiIKa2V5d29yZHM6ICJpbnNjcmlwdGlvbnMsIGRpZ2l0YWwtZXBpZ3JhcGh5LCBGQUlSIGRhdGEgcHJpbmNpcGxlcywgTGlua2VkIE9wZW4gRGF0YSwgc3VydmV5IgotLS0KCmBgYHtjc3Mgc3R5bGUgc2V0dGluZ3MsIGVjaG8gPSBGQUxTRX0KYmxvY2txdW90ZSB7CiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7CiAgICBtYXJnaW46IDAgMCAyMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZWVlOwp9CmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlPUZBTFNFLCB0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9NjApLCB0aWR5PVRSVUUpIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKCmhvb2tfb3V0cHV0ID0ga25pdF9ob29rcyRnZXQoJ291dHB1dCcpCmtuaXRfaG9va3Mkc2V0KG91dHB1dCA9IGZ1bmN0aW9uKHgsIG9wdGlvbnMpIHsKICAjIHRoaXMgaG9vayBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgbGluZXdpZHRoIG9wdGlvbiBpcyBub3QgTlVMTAogIGlmICghaXMubnVsbChuIDwtIG9wdGlvbnMkbGluZXdpZHRoKSkgewogICAgeCA9IGtuaXRyOjo6c3BsaXRfbGluZXMoeCkKICAgICMgYW55IGxpbmVzIHdpZGVyIHRoYW4gbiBzaG91bGQgYmUgd3JhcHBlZAogICAgaWYgKGFueShuY2hhcih4KSA+IG4pKSB4ID0gc3Ryd3JhcCh4LCB3aWR0aCA9IG4pCiAgICB4ID0gcGFzdGUoeCwgY29sbGFwc2UgPSAnXG4nKQogIH0KICBob29rX291dHB1dCh4LCBvcHRpb25zKQp9KQoKZGVmLmNodW5rLmhvb2sgIDwtIGtuaXRyOjprbml0X2hvb2tzJGdldCgiY2h1bmsiKQprbml0cjo6a25pdF9ob29rcyRzZXQoY2h1bmsgPSBmdW5jdGlvbih4LCBvcHRpb25zKSB7CiAgeCA8LSBkZWYuY2h1bmsuaG9vayh4LCBvcHRpb25zKQogIHBhc3RlMCgiXG4gXFwiLCAiZm9vdG5vdGVzaXplIiwiXG5cbiIsIHgsICJcblxuIFxcbm9ybWFsc2l6ZSIpCn0pCgpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGUgZmllbGQgb2YgZGlnaXRhbCBlcGlncmFwaHkgaGFzIHNlZW4gc2lnbmlmaWNhbnQgZGV2ZWxvcG1lbnQgaW4gcmVjZW50IHllYXJzOiBub3Qgb25seSBhcmUgdHJhZGl0aW9uYWwgZXBpZ3JhcGhpYyBjb3Jwb3JhIGluY3JlYXNpbmdseSBiZWluZyBkaWdpdGlzZWQgYW5kIG1hZGUgYWNjZXNzaWJsZSB2aWEgdGhlaXIgd2Vic2l0ZXMgZm9yIGFueW9uZSB0byBicm93c2UgYW5kIHNlYXJjaCBidXQgc2V2ZXJhbCByZXNvdXJjZXMgYXJlIGFscmVhZHkgYm9ybiBkaWdpdGFsIHdpdGhvdXQgYW55IHByaW50ZWQgZWRpdGlvbiwgZS5nLiAqSW5zY3JpcHRpb25zIG9mIEdyZWVrIEN5cmVuYWljYSogW0Byb3VlY2hlX2luc2NyaXB0aW9uc18yMDIwXSwgKkluc2NyaXB0aW9ucyBvZiBSb21hbiBUcmlwb2xpdGFuaWEqIFtAcm91ZWNoZV9pbnNjcmlwdGlvbnNfMjAyMl07IGZvciBtb3JlIHNlZSBbQGJydXVuX2VwaWdyYXBoeV8yMDE1XS4gTW9zdCBpbnNjcmlwdGlvbnMgY29udGFpbiByZWZlcmVuY2VzIHRvIHBsYWNlcywgcGVvcGxlIG9yIGV2ZW50cywgb3IgY29udGFpbiBkYXRhIHJlbGF0ZWQgdG8gdGhlIHBsYWNlIGFuZCB0aW1lIG9mIHRoZWlyIGNyZWF0aW9uIGFuZCBwcm92aWRlIGFuIGlkZWFsIHJlc291cmNlIHRvIHN0dWR5IHBhc3QgY29tbXVuaXRpZXMgYXMgYSB3aG9sZS4gSG93ZXZlciwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBoYXJuZXNzIHRoZWlyIGZ1bGwgcG90ZW50aWFsIGFuZCBmb3IgZXhhbXBsZSBhY2Nlc3MgKmFsbCogaW5zY3JpcHRpb25zIGZyb20gYSBwbGFjZSBvZiBpbnRlcmVzdCBvciBvZiBhIGdpdmVuIHR5cGUsIHdlIG5lZWQgdG8gbGluayB0aGUgZXhpc3RpbmcgZGF0YXNldHMgdG9nZXRoZXIuIFRoZSBjb25jZXB0IG9mICpMaW5rZWQgT3BlbiBEYXRhKiAoTE9EKSBwcm92aWRlcyBhIG1lYW5zIG9mIGNvbm5lY3RpbmcgdmFyaW91cyBkaWdpdGFsIGRhdGFzZXRzIHdoaWxlIGVucmljaGluZyB0aGUgdGV4dCB3aXRoLCBlLmcuIGJyb2FkZXIgc3BhdGlvLXRlbXBvcmFsIGNvbnRleHQgb3IgcHJvc29wb2dyYXBoaWMgZGF0YSwgbGVhZGluZyB0byB0aGUgY3JlYXRpb24gb2YgbmV3IGNvbm5lY3Rpb25zIGJldHdlZW4gaW5kaXZpZHVhbCBpbnNjcmlwdGlvbnMgYXMgd2VsbCBhcyBhcmNoYWVvbG9naWNhbCBzaXRlcyBvciBwb3RlbnRpYWwgcmUtZXZhbHVhdGlvbiBvZiBoaXN0b3JpY2FsIG5hcnJhdGl2ZXMgW0BiYWduYWxsX3BsZWlhZGVzXzIwMDY7IEB0dXBtYW5fd2hlcmVfMjAyMTsgQGdlc2VyX3dwMTVfMjAxNl0uIEFsdGhvdWdoIG1hbnkgZXBpZ3JhcGhpYyBkYXRhc2V0cyBoYXZlIGJlZW4gdXNpbmcgTE9ELCBlc3BlY2lhbGx5IHRvIHJlY29yZCB0aGUgc3BhdGlhbCBjb21wb25lbnQgYnkgdXNpbmcgc2VydmljZXMgc3VjaCBhcyBQbGVpYWRlcyBvciBUcmlzbWVnaXN0b3MsIHRoZXJlIGlzIHN0aWxsIGEgY29uc2lkZXJhYmxlIGdhcCBpbiB0aGUgTE9EIGltcGxlbWVudGF0aW9uIGFjcm9zcyB0aGUgZGlzY2lwbGluZSBhbmQgdGh1cyBpbiB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgZGF0YS4KCkFuIGluZGl2aWR1YWwgZGF0YXNldCB0aGF0IGlzIG5vdCBtb3JlIHdpZGVseSBhY2Nlc3NpYmxlIG9yIGludGVyb3BlcmFibGUgaXMgb2YgY29uc2lkZXJhYmxlIHZhbHVlIHRvIGdyb3VwcyBzaGFyaW5nIHNpbWlsYXIgaW50ZXJlc3RzIChlLmcuIGdlb2dyYXBoaWMgYXJlYSwgY2hyb25vbG9naWNhbCBwZXJpb2QsIGxpbmd1aXN0aWMgZW52aXJvbm1lbnQpLCBidXQgb2YgbXVjaCBtb3JlIGxpbWl0ZWQgdmFsdWUgdG8gdGhlIGVwaWdyYXBoaWMgZGlzY2lwbGluZSBhcyBhIHdob2xlLiBUaGUgdmFsdWUgb2YgTE9EIGxpZXMgaW4gYmVpbmcgYWJsZSB0byBidWlsZCBvbiB0aGUgZWZmb3J0cyBhbmQgaW52ZXN0bWVudCBvZiBudW1lcm91cyBnZW5lcmF0aW9ucyBvZiBlcGlncmFwaGVycyB3aG8gb3ZlciBtYW55IHllYXJzIGhhdmUgcHJvZHVjZWQgbXVsdGlwbGUgaGlnaC1xdWFsaXR5IGVkaXRpb25zIGluIGZpcnN0IGFuYWxvZ3VlIGFuZCBtb3JlIHJlY2VudGx5IGFsc28gZGlnaXRhbCBmb3JtLiBXaGV0aGVyIHRoZXJlIGlzIG9uZSBtYXN0ZXIgZGF0YWJhc2UgY29ubmVjdGluZyBhbGwgdGhlIGluc2NyaXB0aW9ucyB0b2dldGhlciwgb3Igbm90LCBvbmNlIHRoZSBkYXRhIGlzICoqRkFJUioqICgqRmluZGFibGUqLCAqQWNjZXNzaWJsZSosICpJbnRlcm9wZXJhYmxlKiwgKlJldXNhYmxlKiBbQHdpbGtpbnNvbl9mYWlyXzIwMTZdKSBhbmQgbGlua2VkIHRvIG90aGVyIExPRCwgbmV3IGF2ZW51ZXMgb2YgcmVzZWFyY2ggb3BlbiAtIGVpdGhlciB0byBsYXJnZSBzY2FsZSwgY29tcGFyYXRpdmUgc3R1ZGllcyBzdWNoIGFzIFtAaGVybWFua292YV9pbnNjcmlwdGlvbnNfMjAyMTsgQGFzc2FlbF9yZXN0b3JpbmdfMjAyMjsgQGdsb21iX3BvcHVsYXJpdHlfMjAyMl0gb3IgcHJvamVjdHMgd29ya2luZyBvbiB0aGUgc2FtZSBtYXRlcmlhbCBidXQgd2l0aCBkaWZmZXJlbnQgZW1waGFzZXMgW0B3aWxsaV9tYW51YWxfMjAyMTsgQG11bGxlbl9tYW51YWxfMjAyMV0uIE9uY2UgdGhlIGRhdGEgaXMgbGlua2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIG9uZSBjZW50cmFsIHJlcG9zaXRvcnksIHdoaWNoIGlzIG9mdGVuIGNvc3RseSBhbmQgdW5zdXN0YWluYWJsZSBpbiB0aGUgbG9uZyBydW4gYXMgZG9jdW1lbnRlZCBieSB0aGUgcmVjZW50IGV4cGVyaWVuY2Ugb2YgdGhlIEVBR0xFIFBvcnRhbCBbQG9ybGFuZGlfZGlnaXRhbF8yMDIxXSwgYnV0IGluc3RlYWQgb25lIGNhbiBlbXBvd2VyIGluZGl2aWR1YWwgdXNlcnMgYW5kIHByb3ZpZGUgdGhlbSB3aXRoIGNsZWFyIGd1aWRlbGluZXMgYW5kIHNraWxscyBvbiBob3cgdG8gd29yayB3aXRoIExPRCBpbiBlcGlncmFwaHkuCgpUaGUgKipGQUlSIEVwaWdyYXBoeSoqIFByb2plY3QgKDxodHRwczovL3d3dy5jc2FkLm94LmFjLnVrL2ZhaXItZXBpZ3JhcGh5PikgYWltcyB0byBmaWxsIGluIHRoZSBnYXAgYmV0d2VlbiB0aGUgZGlnaXRpc2F0aW9uIG9mIGluc2NyaXB0aW9ucyBhbmQgdGhlIHJlYWxpc2F0aW9uIG9mIGJlaW5nIGFibGUgdG8gdXNlIHRoZWlyIGZ1bGwgcG90ZW50aWFsIGFzIGEgZGlnaXRhbCByZXNvdXJjZS4gVGhlIEZBSVIgRXBpZ3JhcGh5IHByb2plY3QgaGFzIGJlZW4gZXN0YWJsaXNoZWQgYXMgYSBjb2xsYWJvcmF0aW9uIGJldHdlZW4gSm9oYW5uZXMgR3V0ZW5iZXJnIFVuaXZlcnNpdHkgaW4gTWFpbnogKFByb2YuIE1hcmlldHRhIEhvcnN0ZXIpIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBPeGZvcmQgKFByb2YuIEpvbmF0aGFuIFByYWcpLCBmdW5kZWQgYnkgdGhlIEFydHMgYW5kIEh1bWFuaXRpZXMgUmVzZWFyY2ggQ291bmNpbCAoQUhSQykgYW5kIERldXRzY2hlIEZvcnNjaHVuZ2VtZWluc2NoYWZ0IChERkcpIGFuZCB3aWxsIHJ1biBmb3IgMzYgbW9udGhzLCBmcm9tIDIwMjIgdG8gMjAyNS4gKipGQUlSIEVwaWdyYXBoeSoqIGFpbXMgdG8gY3JlYXRlIGFuIGludGVyYWN0aXZlIHBsYXRmb3JtIGZvciBhbGwgZXBpZ3JhcGhpYyBwcm9qZWN0cywgYWxpZ25pbmcgdGhlaXIgZGlnaXRhbCBuZWVkcyB3aXRoIHRoZSBwcmluY2lwbGVzIG9mIEZBSVIgc2NpZW5jZS4gVGhlIG92ZXJhbGwgZGVzaXJhYmlsaXR5IG9mICoqRkFJUioqIC0gKkZpbmRhYmxlKiwgKkFjY2Vzc2libGUqLCAqSW50ZXJvcGVyYWJsZSosICpSZXVzYWJsZSogW0B3aWxraW5zb25fZmFpcl8yMDE2XSAtIGRhdGEgaXMgZnVuZGFtZW50YWwgZm9yIGFkdmFuY2luZyByZXNlYXJjaCBpbnRvIHRoZSBlcGlncmFwaGljLCBsaW5ndWlzdGljLCBhbmQgbWF0ZXJpYWwgY3VsdHVyZSBvZiB0aGUgYW5jaWVudCB3b3JsZC4KCj4gKiJUaGUgcHJpbmNpcGxlcyBlbXBoYXNpc2UgbWFjaGluZS1hY3Rpb25hYmlsaXR5IChpLmUuIHRoZSBjYXBhY2l0eSBvZiBjb21wdXRhdGlvbmFsIHN5c3RlbXMgdG8gZmluZCwgYWNjZXNzLCBpbnRlcm9wZXJhdGUsIGFuZCByZXVzZSBkYXRhIHdpdGggbm9uZSBvciBtaW5pbWFsIGh1bWFuIGludGVydmVudGlvbikgYmVjYXVzZSBodW1hbnMgaW5jcmVhc2luZ2x5IHJlbHkgb24gY29tcHV0YXRpb25hbCBzdXBwb3J0IHRvIGRlYWwgd2l0aCBkYXRhIGFzIGEgcmVzdWx0IG9mIHRoZSBpbmNyZWFzZSBpbiB2b2x1bWUsIGNvbXBsZXhpdHksIGFuZCBjcmVhdGlvbiBzcGVlZCBvZiBkYXRhLiIqIChGQUlSIFByaW5jaXBsZXMgd2Vic2l0ZSwgPGh0dHBzOi8vd3d3LmdvLWZhaXIub3JnL2ZhaXItcHJpbmNpcGxlcy8+KQoKV2l0aCB0aGUgaW5jcmVhc2UgaW4gTGlua2VkIE9wZW4gRGF0YSBhbmQgbm92ZWwgaW50ZXJmYWNlIHRlY2hub2xvZ2llcyBhbmQgc3RhbmRhcmRzLCB0aGUgRkFJUiBFcGlncmFwaHkgUHJvamVjdCB3aWxsIGJlIGFibGUgdG8gY3JlYXRlIHRoZSB0b29scyBhbmQgdGhlIGNvbW11bml0eSBuZWVkZWQgdG8gdHJhbnNmb3JtIGVwaWdyYXBoaWMgcmVzZWFyY2ggaW4gdGhlIGRpZ2l0YWwgYWdlLiBIb3dldmVyLCBGQUlSIEVwaWdyYXBoeSBkb2VzIG5vdCB3aXNoIHRvIHJlcGxpY2F0ZSBhbnkgY3VycmVudCBlZmZvcnRzLCBidXQgcmF0aGVyIHRvIGFsaWduIGV4aXN0aW5nIGluaXRpYXRpdmVzIGFuZCBicmluZyB0aGVtIHRvZ2V0aGVyIHRvIGNyZWF0ZSBhIGh1YiBvZiBoaWdoLXF1YWxpdHkgdG9vbHMgYW5kIEZBSVIgY29tcGxpYW50IHN0YW5kYXJkcyBhbmQgcmVzb3VyY2VzIGZvciB0aGUgbW9kZXJuIGVwaWdyYXBoaWMgZGlzY2lwbGluZS4gT3VyIGludGVybmF0aW9uYWxseSBjb2xsYWJvcmF0aXZlIGFwcHJvYWNoIHdpbGwgZW5hYmxlIGFuZCBzdXBwb3J0IGlubm92YXRpdmUgcmVzZWFyY2ggYWNyb3NzIGVwaWdyYXBoaWMgZGF0YSBhbmQgdGhlIHdpZGVyIGxpbmtlZCB3ZWIgb2YgZGF0YSAoZXNwZWNpYWxseSBhcmNoYWVvbG9naWNhbCBkYXRhKSwgc3VjaCB0aGF0IGFsbCBlcGlncmFwaGljIGRhdGEgaXMgaW5jcmVhc2luZ2x5IEZBSVIgZm9yIGJvdGggdGhlIHJlc2VhcmNoIGNvbW11bml0eSBhbmQgdGhlIHdpZGVyIHB1YmxpYy4gVG8gdGhpcyBlbmQsIHdlIGFpbSB0bzoKCjEuICBjb25zb2xpZGF0ZSBjb21tdW5pdHktd2lkZSBzdGFuZGFyZHMgKHZvY2FidWxhcmllcyBhbmQgb250b2xvZ3kpOwoyLiAgaG9zdCBhbmQgbWFrZSBmdWxseSBhY2Nlc3NpYmxlIHRoZSByZXN1bHRpbmcgbGlua2VkIG9wZW4gZGF0YSBwdWJsaXNoZWQgYnkgaW5kaXZpZHVhbCBwcm9qZWN0cyAoUkRGL1hNTCBkYXRhIHB1YmxpY2F0aW9uKTsKMy4gIGRldmVsb3AgdGhlIHRvb2xzIGZvciBjb21tdW5pdHkgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugc3RhbmRhcmRzICh2b2NhYnVsYXJ5IGFuZCBvbnRvbG9neSBob3N0aW5nIGFuZCBwdWJsaWNhdGlvbik7CjQuICBwcm92aWRlIHN1cHBvcnQgdG8gbWVtYmVycyBvZiB0aGUgY29tbXVuaXR5IGluIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmRzIHdpdGhpbiBleGlzdGluZyBhbmQgbmV3IHByb2plY3RzLgoKSW4gb3JkZXIgdG8gbWFwIHRoZSBleGlzdGluZyBmaWVsZCBvZiBkaWdpdGFsIGVwaWdyYXBoeSBpbmNsdWRpbmcgY3VycmVudCBwcmFjdGljZXMgYW5kIHN0YW5kYXJkcywgYXMgd2VsbCBhcyB0byBjbGFyaWZ5IHRoZSAoZGlnaXRhbCkgbmVlZHMgb2YgdGhlIGRpc2NpcGxpbmUsIHdlIGNpcmN1bGF0ZWQgdHdvIHNjb3Bpbmcgc3VydmV5cyBiZXR3ZWVuIEZlYnJ1YXJ5IGFuZCBBcHJpbCAyMDIyIChbKipGQUlSIEVwaWdyYXBoeTogU2NvcGluZyBzdXJ2ZXkgZm9yIHBhcnRuZXJzIGFuZCBjb2xsYWJvcmF0b3JzKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9GQUlSLWVwaWdyYXBoeS9zY29waW5nX3N1cnZleV9yZXBvcnQvZGF0YS8wMV9TdXJ2ZXlfcGFydG5lcnNfcXVlc3Rpb25zLnBkZikgYW5kIFsqKkRpZ2l0YWwgZXBpZ3JhcGh5IGluIDIwMjI6IHNjb3Bpbmcgc3VydmV5KipdKGh0dHBzOi8vZ2l0aHViLmNvbS9GQUlSLWVwaWdyYXBoeS9zY29waW5nX3N1cnZleV9yZXBvcnQvZGF0YS8wMl9TdXJ2ZXlfcHJvamVjdHNfcXVlc3Rpb25zLnBkZikgZm9yIGFsbCBkaWdpdGFsIGVwaWdyYXBoeSBwcm9qZWN0cykuIFRoZSByZXN1bHRzIG9mIHRoZSBzdXJ2ZXlzIHByZXNlbnRlZCBpbiB0aGUgY3VycmVudCByZXBvcnQgd2lsbCBiZSB1c2VkIHRvIHBsYW4gdGhlIGFjdGl2aXRpZXMgYW5kIGVmZmljaWVudGx5IGFsbG9jYXRlIHRoZSByZXNvdXJjZXMgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IFByb2plY3QgaW4gdGhlIGZvbGxvd2luZyB0aHJlZSB5ZWFycy4gVGhlIHJlcG9ydCBjb250YWlucyBvbmx5IHRoZSBhbnN3ZXJzIHdoZXJlIHBhcnRpY2lwYW50cyBnYXZlIGNvbnNlbnQgdG8gcHVibGlzaCB0aGUgYW5vbnltaXNlZCByZXNwb25zZXMuIEluIGNhc2VzIHdoZXJlIHRoZSBjb25zZW50IHdhcyBub3QgZ2l2ZW4sIHRoZSBkYXRhIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBGQUlSIEVwaWdyYXBoeSBkZWNpc2lvbiBidXQgaXMgZXhjbHVkZWQgZnJvbSB0aGUgcmVwb3J0LgoKVGhlIHN1cnZleSBhbnN3ZXJzIGFyZSBhbm9ueW1pc2VkIHNvIHRoYXQgaW5kaXZpZHVhbCBwcm9qZWN0cyBjYW5ub3QgYmUgaWRlbnRpZmllZCBvbiB0aGUgYmFzaXMgb2YgdGhlaXIgcmVwbGllcyBhbmQgdGhlIGRhdGEgaXMgc3RvcmVkIGFzIGEgVFNWICh0YWItc2VwYXJhdGVkIHZhbHVlKSBmaWxlIHdpdGhpbiB0aGUgcHJvamVjdCdzIEdpdEh1YiByZXBvc2l0b3J5ICg8aHR0cHM6Ly9naXRodWIuY29tL0ZBSVItZXBpZ3JhcGh5L3Njb3Bpbmdfc3VydmV5X3JlcG9ydC8+KSBhcyBhIHN1cHBsZW1lbnQgdG8gdGhlIHRleHQgb2YgdGhpcyByZXBvcnQgYW5kIGNhbiBiZSBhY2Nlc3NlZCB1bmRlciB0aGUgQ0MtQlktU0EgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVGhlIHJlcG9ydCBpcyBwcm9kdWNlZCBpbiB0d28gZm9ybWF0czogYSB0cmFkaXRpb25hbCBQREYgKGF2YWlsYWJsZSBhdCA8aHR0cHM6Ly9naXRodWIuY29tL0ZBSVItZXBpZ3JhcGh5L3Njb3Bpbmdfc3VydmV5X3JlcG9ydC9ibG9iL21haW4vc2NyaXB0cy8wMV9GQUlSX2VwaV9yZXBvcnQucGRmPikgYW5kIGFuIGludGVyYWN0aXZlIEhUTUwgcGFnZSB3aGVyZSB0aGUgcmVhZGVyIGNhbiBicm93c2UgdGhyb3VnaCB0aGUgcmVzcG9uc2VzIChhdmFpbGFibGUgYXQgPGh0dHBzOi8vZmFpci1lcGlncmFwaHkuZ2l0aHViLmlvL3Njb3Bpbmdfc3VydmV5X3JlcG9ydC9zY3JpcHRzLzAxX0ZBSVJfZXBpX3JlcG9ydC5odG1sPikuICpJZiB5b3UgYXJlIHZpZXdpbmcgdGhpcyByZXBvcnQgaW4gdGhlIEhUTUwgZm9ybWF0LCB0byBicm93c2UgdGhlIGRhdGEgY2xpY2sgb24gdGhlIGFycm93IGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBkYXRhIHRhYmxlcyBpbiBlYWNoIHNlY3Rpb24gKHdoZXJlIHRoZSBhcnJvdyBpcyBhdmFpbGFibGUpLioKCioqRGlzY2xhaW1lcioqOiBUaGUgdmlld3MgYW5kIG9waW5pb25zIGV4cHJlc3NlZCB3aXRoaW4gdGhlIHN1cnZleSAocHJlc2VudGVkIGluIHRhYmxlcykgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHZpZXdzIG9yIHBvc2l0aW9ucyBvZiB0aGUgRkFJUiBFcGlncmFwaHkgUHJvamVjdCBpdHNlbGYuCgojIEZBSVIgRXBpZ3JhcGh5IHBhcnRuZXIgcHJvamVjdHMKCmBgYHtyIGRhdGFfcGFydG5lcnMsIGluY2x1ZGU9RkFMU0V9CiMgbG9hZGluZyBkYXRhIGZyb20gVFNWIGZpbGUKcGFydG5lcnNfYWxsPC0gcmVhZF90c3YoIi4uL2RhdGEvMDFfc2NvcGluZ19zdXJ2ZXlfYW5vbnltaXNlZC50c3YiKQpgYGAKCmBgYHtyLCBpbmx1ZGU9RkFMU0V9CiNmaWx0ZXJpbmcgb3V0IHBhcnRuZXJzIHdobyBkaWQgbm90IGdpdmUgY29uc2VudCB0byBwdWJsaXNoIHRoZSBhbm9ueW1pc2VkIGRhdGEKCnBhcnRuZXJzIDwtIHBhcnRuZXJzX2FsbCAlPiUgCiAgZmlsdGVyKGBEbyB5b3UgY29uc2VudCBvbiBwdWJsaXNoaW5nIHRoZSBhbm9ueW1pc2VkIGRhdGEgaW4gdGhlIGZvcm0gb2Ygd3JpdHRlbiBzaG9ydCByZXBvcnQgb3BlbiB0byBwdWJsaWMgYW5kIGFjY2Vzc2libGUgdmlhIHRoZSBGQUlSIEVwaWdyYXBoeSBpbmZyYXN0cnVjdHVyZSAod2Vic2l0ZSwgR2l0SHViLCBUd2l0dGVyKT8gWW91IGNhbiBhbHdheXMgcmV2b2tlIHlvdXIgY29uc2VudCBieSBzZW5kaW5nIGFuIGVtYWlsIHRvIHBldHJhLmhlcm1hbmtvdmFAdW5pLW1haW56LmRlYCA9PSAiWWVzLCBJIGdpdmUgbXkgY29uc2VudCIgfCBgRG8geW91IGNvbnNlbnQgb24gcHVibGlzaGluZyB0aGUgYW5vbnltaXNlZCBkYXRhIGluIHRoZSBmb3JtIG9mIHdyaXR0ZW4gc2hvcnQgcmVwb3J0IG9wZW4gdG8gcHVibGljIGFuZCBhY2Nlc3NpYmxlIHZpYSB0aGUgRkFJUiBFcGlncmFwaHkgaW5mcmFzdHJ1Y3R1cmUgKHdlYnNpdGUsIEdpdEh1YiwgVHdpdHRlcik/IFlvdSBjYW4gYWx3YXlzIHJldm9rZSB5b3VyIGNvbnNlbnQgYnkgc2VuZGluZyBhbiBlbWFpbCB0byBwZXRyYS5oZXJtYW5rb3ZhQHVuaS1tYWluei5kZWAgPT0gIlllcywgSSBnaXZlIG15IGNvbnNlbnQ7IE5vIHB1Ymxpc2hpbmcgb24gc29jaWFsIG1lZGlhIikKYGBgCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlcyB0aGUgcmVzdWx0cyBvZiB0aGUgb25saW5lIHN1cnZleSBbKkZBSVIgRXBpZ3JhcGh5OiBTY29waW5nIHN1cnZleSBmb3IgcGFydG5lcnMgYW5kIGNvbGxhYm9yYXRvcnMqXShodHRwczovL2dpdGh1Yi5jb20vRkFJUi1lcGlncmFwaHkvc2NvcGluZ19zdXJ2ZXlfcmVwb3J0L2RhdGEvMDFfU3VydmV5X3BhcnRuZXJzX3F1ZXN0aW9ucy5wZGYpIGFpbWVkIGF0IHRob3NlIGVzdGFibGlzaGVkIGRpZ2l0YWwgcHJvamVjdHMgd2hpY2ggYXJlIGFscmVhZHkgb2ZmaWNpYWwgcGFydG5lcnMgYW5kIGNvbGxhYm9yYXRvcnMgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IFByb2plY3QuIFdlIHNlbnQgdGhlIHN1cnZleSB0byAxNCBwYXJ0bmVyIHByb2plY3RzLiBXZSByZWNlaXZlZCBgciBucm93KHBhcnRuZXJzX2FsbClgIHJlc3BvbnNlcyB0byB0aGUgc3VydmV5LCBhIHJlc3BvbnNlIHJhdGUgb2YgYHIgcm91bmQoKG5yb3cocGFydG5lcnMpKS8wLjE0KWAlIHdpdGggc29tZSBwYXJ0aWNpcGFudHMgcmVzcG9uZGluZyBvbiBiZWhhbGYgb2YgdHdvIHByb2plY3RzIGNvbWJpbmVkIGludG8gb25lIHJlc3BvbnNlIChhbmQgdGh1cyBza2V3aW5nIHRoZSByZXNwb25zZSByYXRlKS4gYHIgcm91bmQobnJvdyhwYXJ0bmVycykvKG5yb3cocGFydG5lcnNfYWxsKS8xMDApKWAlIG9mIHBhcnRpY2lwYXRpbmcgcGFydG5lciBwcm9qZWN0cyBnYXZlIGNvbnNlbnQgdG8gcHVibGlzaCB0aGVpciBhbm9ueW1pc2VkIHJlc3BvbnNlcyBhcyBwYXJ0IG9mIHRoaXMgcmVwb3J0LgoKVGhlIHBhcnRuZXIgcHJvamVjdHMgcmVwcmVzZW50IHN1Y2Nlc3NmdWwgcHJvamVjdHMgd2l0aCB0aGUgYXZlcmFnZSBkdXJhdGlvbiBvZiBhIHByb2plY3QgYmVpbmcgYHIgbWVkaWFuKGFzLm51bWVyaWMocGFydG5lcnMkTGVuZ3RoX251bWVyaWNfeWVhcnMpKWAgeWVhcnMuIFRoZSBzaG9ydGVzdCBwYXJ0aWNpcGF0aW5nIHByb2plY3QgcmVwb3J0ZWQgdGhlaXIgZHVyYXRpb24gYXMgYHIgbWluKGFzLm51bWVyaWMocGFydG5lcnMkTGVuZ3RoX251bWVyaWNfeWVhcnMpKWAgeWVhcnMgYW5kIHRoZSBsb25nZXN0IGFzIGByIG1heChhcy5udW1lcmljKHBhcnRuZXJzJExlbmd0aF9udW1lcmljX3llYXJzKSlgIHllYXJzLl5bT2J2aW91c2x5IG5vdCBkaWdpdGFsIGZvciB0aGUgd2hvbGUgb2YgdGhhdCBwZXJpb2QuXQoKIyMgTGFuZ3VhZ2UgY292ZXJhZ2UKCioqUXVlc3Rpb246KiogKldoYXQgaXMgdGhlIHByZWRvbWluYW50IGxhbmd1YWdlIG9mIGVwaWdyYXBoaWMgZGF0YSBpbiB5b3VyIHByb2plY3QgKGZvciBtaXhlZCBjb2xsZWN0aW9ucyBvciBjb2xsZWN0aW9ucyB3aGVyZSBvdGhlciBsYW5ndWFnZXMgYXJlIHByZWRvbWluYW50IHByb3ZpZGUgZGV0YWlscyBpbiBPdGhlcikqW14xXQoKW14xXTogSWYgeW91IGFyZSB2aWV3aW5nIHRoaXMgcmVwb3J0IGluIHRoZSBIVE1MIGZvcm1hdCwgeW91IGNhbiBjbGljayBvbiB0aGUgYXJyb3cgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHRhYmxlIHRvIHNlZSBtb3JlIGRhdGEgKHdoZXJlIGF2YWlsYWJsZSkuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBQREYgZm9ybWF0LgoKYGBge3J9CnBhcnRuZXJzX2xhbmd1YWdlIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHN0cl9zcGxpdChwYXJ0bmVycyRMYW5ndWFnZV9jbGVhbiwgIjsgIikpKQpjb2xuYW1lcyhwYXJ0bmVyc19sYW5ndWFnZSkgPC0gYygibGFuZ3VhZ2UiKQoKcGFydG5lcnNfbGFuZ3VhZ2VfcmF0aW8gPC0gcGFydG5lcnNfbGFuZ3VhZ2UgJT4lIAogIGNvdW50KGxhbmd1YWdlLCBzb3J0PVQpICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZChuLyhzdW0obikvMTAwKSkpCnBhcnRuZXJzX2xhbmd1YWdlX3JhdGlvCmBgYAoKYGBge3IsfQpwYXJ0bmVyX2xhbmd1YWdlX2NvdW50PC0gc3RyX2NvdW50KHBhcnRuZXJzJExhbmd1YWdlX2NsZWFuLCAiOyIpKzEKYGBgCgoqKkNvbW1lbnRhcnk6KiogVGhlIGxhbmd1YWdlIGNvdmVyYWdlIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIGNvbnNpc3RzIHByZWRvbWluYW50bHkgb2YgTGF0aW4gYW5kIEdyZWVrIGVpdGhlciBhbG9uZSBvciBpbiBjb21iaW5hdGlvbiAocmVwcmVzZW50aW5nIGByIHN1bShwYXJ0bmVyc19sYW5ndWFnZV9yYXRpbyRyYXRpb1twYXJ0bmVyc19sYW5ndWFnZV9yYXRpbyRsYW5ndWFnZSAlaW4lIGMoIkdyZWVrIiwgIkxhdGluIildKWAlIG9mIHRoZSBhbnN3ZXJzKS4gYHIgbGVuZ3RoKHBhcnRuZXJfbGFuZ3VhZ2VfY291bnRbcGFydG5lcl9sYW5ndWFnZV9jb3VudD09MV0pYCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIHJlY29yZCBpbnNjcmlwdGlvbnMgaW4gb25lIGxhbmd1YWdlIG9ubHksIHdoaWxlIGByIGxlbmd0aChwYXJ0bmVyX2xhbmd1YWdlX2NvdW50W3BhcnRuZXJfbGFuZ3VhZ2VfY291bnQ+MV0pYCBjb250YWluIGluc2NyaXB0aW9ucyBpbiB0d28gb3IgbW9yZSBsYW5ndWFnZXMgKGByIG1heChwYXJ0bmVyX2xhbmd1YWdlX2NvdW50KWAgYmVpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlZCBsYW5ndWFnZXMgaW4gb25lIHByb2plY3QuKQoKVGhlIGBPdGhlcmAgKGkuZS4gb3RoZXIgdGhhbiBHcmVlayBhbmQgTGF0aW4pIGNhdGVnb3J5IGVuY29tcGFzc2VkIGEgc3Vic3RhbnRpYWwgcGFydCBvZiB0aGUgc3VydmV5ZWQgcHJvamVjdHMgKGByIDEwMC1zdW0ocGFydG5lcnNfbGFuZ3VhZ2VfcmF0aW8kcmF0aW9bcGFydG5lcnNfbGFuZ3VhZ2VfcmF0aW8kbGFuZ3VhZ2UgJWluJSBjKCJHcmVlayIsICJMYXRpbiIpXSlgJSksIGRvY3VtZW50aW5nIHRoZSBuZWVkIHRvIGV4cGFuZCBiZXlvbmQgdGhlIHRyYWRpdGlvbmFsIExhdGluIGFuZCBHcmVlayBmb2N1cyBvZiB0aGUgY2xhc3NpY2FsIGVwaWdyYXBoaWMgZGlzY2lwbGluZS4gVGhlIGxhbmd1YWdlcyBsaXN0ZWQgYXMgYE90aGVyYCBjb25zaXN0ZWQgb2YgKmByIHBhcnRuZXJzX2xhbmd1YWdlX3JhdGlvJGxhbmd1YWdlWzQ6MTRdYCouIEl0IGlzLCBob3dldmVyLCB3b3J0aCBub3RpbmcgdGhhdCB0aGUgbWFqb3JpdHkgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyByZWNvcmQgbGFuZ3VhZ2VzIGZyb20gdGhlIHdpZGVyIE1lZGl0ZXJyYW5lYW4vRXVyb3BlYW4gbGluZ3Vpc3RpYyBzcGFjZS4KCioqVW5pcXVlIGNvbWJpbmF0aW9ucyBvZiBsYW5ndWFnZXMgYXMgcmV0cmlldmVkIGZyb20gdGhlIHN1cnZleToqKgoKYGBge3J9CmFzLmRhdGEuZnJhbWUodW5pcXVlKHBhcnRuZXJzJExhbmd1YWdlX2NsZWFuKSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIElUIGluZnJhc3RydWN0dXJlCgoqKlF1ZXN0aW9uKio6ICpEb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSB3ZWJzaXRlPyoKCmBgYHtyfQpwYXJ0bmVycyAlPiUgCiAgY291bnQoV2Vic2l0ZSkKYGBgCgoqKkNvbW1lbnRhcnkqKjogQWxsIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIGN1cnJlbnRseSBtYWludGFpbiBhbiBvbmxpbmUgcHJlc2VuY2UgKGFzIG9mIEZlYnJ1YXJ5LUFwcmlsIDIwMjIpLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpEb2VzIHlvdXIgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/KgoKYGBge3J9CklUIDwtIHBhcnRuZXJzICU+JSAKICBjb3VudChgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKElUX3NwZWMgPSBgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKSVQKYGBgCgoqKkNvbW1lbnRhcnkqKjogVGhlIG1ham9yaXR5IG9mIHRoZSBkaWdpdGFsIHBhcnRuZXIgcHJvamVjdHMgaGF2ZSBhbiBJVCBzcGVjaWFsaXN0LCB5ZXQgb25seSBgciBzdW0oSVQkbltJVCRJVF9zcGVjICVpbiUgYygiWWVzLCBlcXVpdmFsZW50IG9mIGZ1bGwtdGltZSAoMS4wIEZURSkgcG9zaXRpb24iLCJZZXMsIGVxdWl2YWxlbnQgb2YgbW9yZSB0aGFuIGZ1bGwtdGltZSAoPjEuMCBGVEUpIHBvc2l0aW9uIildKWAgcHJvamVjdHMgaGF2ZSBhbiBlcXVpdmFsZW50IG9mIDEuMCBGVEUgb3IgbW9yZSBhdCB0aGVpciBkaXNwb3NhbC4gYHIgcm91bmQoSVQkcmF0aW9bSVQkSVRfc3BlYyA9PSAiWWVzLCBlcXVpdmFsZW50IG9mIHBhcnQtdGltZSAoPDEuMCBGVEUpIHBvc2l0aW9uIl0pYCAlIG9mIHByb2plY3RzIGhhdmUgYWNjZXNzIHRvIHBhcnQtdGltZSBJVCBzdXBwb3J0IGZvciB0aGVpciBwcm9qZWN0cywgd2hpY2ggaW4gc29tZSBpbnN0YW5jZXMgbWF5IGJlIG9ubHkgYSBmZXcgaG91cnMgcGVyIHdlZWsgcGVyIHByb2plY3QuIGByIHN1bShJVCRuW0lUJElUX3NwZWMgJWluJSBjKCJObyIsIldlIHBhaWQgc29tZSBzcGVjaWFsaXN0cywgYnV0IGN1cnJlbnRseSB3ZSBoYXZlIG5vIGJ1ZGdldCBmb3IgdGhlbSAoYW5kIHRoaXMgaXMgYSBwcm9ibGVtLCBldmVuIGZvciB0aGUgc3VzdGFpbmFiaWxpdHkgYW5kIG9yZGluYXJ5IG1haW50YWluYW5jZSBvZiBvdXIgZGlnaXRhbCBhc3NldHMpIildKWAgcHJvamVjdHMgcmVwb3J0ZWQgbm8gYXZhaWxhYmlsaXR5IG9mIElUIHN1cHBvcnQsIGV2ZW4gb24gYSBwYXJ0LXRpbWUgYmFzaXMgKHJlcHJlc2VudGluZyBgciByb3VuZChzdW0oSVQkbltJVCRJVF9zcGVjICVpbiUgYygiTm8iLCJXZSBwYWlkIHNvbWUgc3BlY2lhbGlzdHMsIGJ1dCBjdXJyZW50bHkgd2UgaGF2ZSBubyBidWRnZXQgZm9yIHRoZW0gKGFuZCB0aGlzIGlzIGEgcHJvYmxlbSwgZXZlbiBmb3IgdGhlIHN1c3RhaW5hYmlsaXR5IGFuZCBvcmRpbmFyeSBtYWludGFpbmFuY2Ugb2Ygb3VyIGRpZ2l0YWwgYXNzZXRzKSIpXSkvKG5yb3cocGFydG5lcnMpLzEwMCkpYCUgb2YgcGFydGljaXBhdGluZyBwYXJ0bmVyIHByb2plY3RzKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqRG9lcyB5b3VyIHByb2plY3Qgc3RvcmUgZXBpZ3JhcGhpYyBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0cy4uLj8qCgpgYGB7cn0KZm9ybWF0IDwtIHBhcnRuZXJzICU+JSAKICBjb3VudChgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKGZvcm1hdCA9IGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgKSAlPiUgCiAgbXV0YXRlKG5vX2Zvcm1hdCA9IHN0cl9jb3VudChmb3JtYXQsICIsIikgKyAxKQpmb3JtYXQKYGBgCgpgYGB7cn0KZXBpZG9jIDwtIHN1bShzdHJfZGV0ZWN0KHBhcnRuZXJzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiRXBpZG9jIFhNTCIpKQpqc29uIDwtIHN1bShzdHJfZGV0ZWN0KHBhcnRuZXJzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiSlNPTiIpKQpyZGYgPC0gc3VtKHN0cl9kZXRlY3QocGFydG5lcnMkYE91ciBwcm9qZWN0cyBzdG9yZXMgZXBpZ3JhcGhpYyBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0c2AsICJSREYiKSkKY3N2IDwtIHN1bShzdHJfZGV0ZWN0KHBhcnRuZXJzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiQ1NWIikpCnNxbCA8LSBzdW0oc3RyX2RldGVjdChwYXJ0bmVycyRgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgIlNRTCIpKQpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbWFqb3JpdHkgb2YgcHJvamVjdHMgdXNlIGBFcGlkb2MgWE1MYCBhcyB0aGVpciBtYWluIG91dHB1dCBkYXRhIGZvcm1hdCAoYHIgcm91bmQoZXBpZG9jLyhucm93KHBhcnRuZXJzKS8xMDApKWAlIG9mIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMpLCBlaXRoZXIgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBmb3JtYXRzIG9yIGFzIHRoZSBzb2xlIGRhdGEgZm9ybWF0LiBPdGhlciBkYXRhIGZvcm1hdHMgYXJlIHJlcHJlc2VudGVkIGxlc3MgZnJlcXVlbnRseTogSlNPTiAoYHIgcm91bmQoanNvbi8obnJvdyhwYXJ0bmVycykvMTAwKSlgJSksIFJERiAoYHIgcm91bmQocmRmLyhucm93KHBhcnRuZXJzKS8xMDApKWAlKSwgU1FMIChgciByb3VuZChzcWwvKG5yb3cocGFydG5lcnMpLzEwMCkpYCUpIGFuZCBDU1YgKGByIHJvdW5kKGNzdi8obnJvdyhwYXJ0bmVycykvMTAwKSlgJSkuIGByIHJvdW5kKChzdW0oZm9ybWF0JG5vX2Zvcm1hdCA9PSAxKSkvKG5yb3cocGFydG5lcnMpLzEwMCkpYCUgb2YgcHJvamVjdHMgdXNlIG9ubHkgb25lIHR5cGUgb2YgZGF0YSBmb3JtYXQsIHdoaWxlIGByIHJvdW5kKChzdW0oZm9ybWF0JG5vX2Zvcm1hdCA+IDEpKS8obnJvdyhwYXJ0bmVycykvMTAwKSlgJSB1c2UgdHdvIG9yIG1vcmUgZGF0YSBmb3JtYXQgdHlwZXMgd2l0aGluIHRoZWlyIHByb2plY3QuCgojIyBEYXRhIHNoYXJpbmcKCioqUXVlc3Rpb24qKjogKkRvIHlvdSBzaGFyZSB5b3VyIGRhdGEgb3V0c2lkZSBvZiB5b3VyIHByb2plY3Q/KgoKYGBge3J9CnNoYXJlPC0gcGFydG5lcnMgJT4lIAogIGNvdW50KGBEbyB5b3Ugc2hhcmUgeW91ciBkYXRhIG91dHNpZGUgb2YgeW91ciBwcm9qZWN0YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHNoYXJlID0gYERvIHlvdSBzaGFyZSB5b3VyIGRhdGEgb3V0c2lkZSBvZiB5b3VyIHByb2plY3RgKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCnNoYXJlCmBgYAoKKipDb21tZW50YXJ5Kio6IEFsbCBwYXJ0bmVyIHByb2plY3RzIHJlcG9ydGVkIHRoZWlyIHdpbGxpbmduZXNzIHRvIHNoYXJlIHRoZSBkYXRhLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBjdXJyZW50bHkgZG9pbmcgc28sIG9yIGlmIHRoZXkgcHJvdmlkZSB0aGUgZGF0YSBvbmx5IG9uIGRlbWFuZC4gYHIgc2hhcmUkcmF0aW9bc2hhcmUkc2hhcmUgPT0iWWVzLCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZSJdYCUgb2YgcGFydG5lciBwcm9qZWN0cyBzaGFyZSB0aGUgZGF0YSB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZSAoPGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy8+KSwgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBtb2RlIGFjY29yZGluZyB0byB0aGUgRkFJUiBkYXRhIHByaW5jaXBsZXMuIFRoZSBtYWpvcml0eSBvZiBwYXJ0bmVycyB3aGljaCBhcmUgY3VycmVudGx5IG5vdCB1c2luZyBDcmVhdGl2ZSBDb21tb25zIGxpY2Vuc2VzIGFyZSBjb25zaWRlcmluZyB0aGVpciB1c2UgaW4gdGhlIGZ1dHVyZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSG93IGRvIHlvdSBzaGFyZSB5b3VyIGRhdGEgd2l0aCB1c2VycyBvdXRzaWRlIHlvdXIgcHJvamVjdD8qCgpgYGB7cn0Kb3V0c2hhcmU8LSBwYXJ0bmVycyAlPiUgCiAgY291bnQoYEhvdyBkbyBzaGFyZSB5b3VyIGRhdGEgd2l0aCB1c2VycyBvdXRzaWRlIHlvdXIgcHJvamVjdGAsIHNvcnQ9VCkgJT4lIAogIHJlbmFtZShzaGFyZV9hbGwgPSBgSG93IGRvIHNoYXJlIHlvdXIgZGF0YSB3aXRoIHVzZXJzIG91dHNpZGUgeW91ciBwcm9qZWN0YCkgJT4lIAogIG11dGF0ZShzaGFyZV9tZXRob2QgPSBzdHJfY291bnQoc2hhcmVfYWxsLCAiOyAiKSArIDEpIAoKb3V0c2hhcmUKYGBgCgoqKkNvbW1lbnRhcnkqKjogQWxsIHBhcnRuZXIgcHJvamVjdHMgcHJvdmlkZSBhdCBsZWFzdCBvbmUgd2F5IG9mIHNoYXJpbmcgdGhlIGRhdGEgKHdoZXRoZXIgaXQgaXMgY3VycmVudGx5IGFjY2Vzc2libGUgdG8gdGhlIHB1YmxpYyBvciBub3QsIG9yIGl0IGlzIGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgaW4gdGhlIGZ1dHVyZSkuIFRoZSBhdmVyYWdlIChtZWRpYW4pIG51bWJlciBvZiBzaGFyaW5nIG1ldGhvZHMgcGVyIHByb2plY3QgaXMgYHIgbWVkaWFuKG91dHNoYXJlJHNoYXJlX21ldGhvZClgLgoKYGBge3IgZmlnMSwgZmlnLndpZHRoPTEwLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXA9IkZpZ3VyZSBzaG93aW5nIHRoZSBwb3B1bGFyaXR5IG9mIGluZGl2aWR1YWwgc2hhcmluZyBtZXRob2RzIGFuZCBmb3JtYXRzIGFjcm9zcyBwYXJ0bmVyIHByb2plY3RzLiJ9CgpzaGFyaW5nc2VydiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYEhvdyBkbyBzaGFyZSB5b3VyIGRhdGEgd2l0aCB1c2VycyBvdXRzaWRlIHlvdXIgcHJvamVjdGAsICI7ICIpKSkKY29sbmFtZXMoc2hhcmluZ3NlcnYpIDwtIGMoInNlcnZpY2UiKQoKCnNoYXJpbmdfc2VydmljZSA8LSBzaGFyaW5nc2VydiAlPiUgCiAgY291bnQoc2VydmljZSwgc29ydD0gVCkgCgpzaGFyaW5ncGxvdDwtIHNoYXJpbmdfc2VydmljZSAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX2NvbChhZXMoeT0gcmVvcmRlcihzZXJ2aWNlLCAtbiksIHg9IG4sIGZpbGwgPSBuKSwgd2lkdGggPSAwLjkpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDc1KSkgICsKICBnZ3RpdGxlKCJOdW1iZXIgb2Ygc2hhcmluZyBtZXRob2RzIHBlciBwcm9qZWN0IikgKwogIHhsYWIoIlNoYXJpbmcgbWV0aG9kIikgKyB5bGFiKCJOdW1iZXIgb2YgcHJvamVjdHMiKSArCiAgI2Nvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgI2Nvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1KSkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCnNoYXJpbmdwbG90CmBgYAoKQXMgc2VlbiBpbiAqKkZpZ3VyZSAxKiosIGRpcmVjdCBkb3dubG9hZCBvZiB0aGUgRXBpZG9jIFhNTCBpcyBieSBmYXIgdGhlIG1vc3QgcG9wdWxhciBmb3JtYXQgZm9yIGRhdGEgc2hhcmluZyAoaW1wbGVtZW50ZWQgYnkgYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIkluZGl2aWR1YWwgRXBpZG9jIFhNTHMgb3IgRXBpZG9jIFhNTCBkdW1wcyBvbiB0aGUgd2Vic2l0ZSIpKWAgcHJvamVjdHMpLCBob3dldmVyIG90aGVyIE9wZW4gU2NpZW5jZSBzZXJ2aWNlcyBhcmUgc3RhcnRpbmcgdG8gbWFrZSB0aGVpciB3YXkgaW50byBlc3RhYmxpc2hlZCBkaWdpdGFsIGVwaWdyYXBoeSBwcm9qZWN0cywgc3VjaCBhcyBzaGFyaW5nIHZpYSBhIHB1YmxpYyByZXBvc2l0b3J5LCBpbXBsZW1lbnRlZCBieSBgciBzdW0oc3RyX2NvdW50KG91dHNoYXJlJHNoYXJlX2FsbCwiR2l0SHViIikpYCAoR2l0SHViKSBhbmQgYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIlplbm9kbyIpKWAgKFplbm9kbykgcHJvamVjdHMgcmVzcGVjdGl2ZWx5LCBhcyB3ZWxsIGFzIHByb3ZpZGluZyByYXcgZGF0YSBpbiB0aGUgQ1NWIChjb21tYS1zZXBhcmF0ZWQgdmFsdWUpIGZvcm1hdCAoYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIkNTViIpKS8yYCBwcm9qZWN0cyksIG9yIGFzIEpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSBmaWxlcyAoYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIkpTT04iKSkvMmAgcHJvamVjdHMpLiBBIG1pbm9yaXR5IG9mIHBhcnRpY2lwYXRpbmcgcGFydG5lciBwcm9qZWN0cyBzaGFyZXMgdGhlIGRhdGEgb24gYW4gb24tZGVtYW5kIGJhc2lzIG9yIGhhdmUgYSBub24tcHVibGljIEFQSSBhY2Nlc3MgcG9pbnQgdG8gdGhlaXIgZGF0YS4KCiMjIEluc3RpdHV0aW9uYWwgcG9saWNpZXMKCioqUXVlc3Rpb246KiogKkRvZXMgeW91ciBpbnN0aXR1dGlvbiBvciBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4gRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT8qCgpgYGB7cn0KcG9saWNpZXMgPC0gcGFydG5lcnMgJT4lIAogIG11dGF0ZShwb2xpY2llcyA9IGBEb2VzIHlvdXIgaW5zdGl0dXRpb24gb2YgZnVuZGluZyBib2R5IHJlcXVpcmUgeW91ciBwcm9qZWN0IHRvIGNvbXBseSB3aXRoIGFueSBkYXRhIHBvbGljaWVzIChlLmcuLCBGQUlSIHByaW5jaXBsZXMsIGRhdGEgc3RvcmFnZSwgZGF0YSBzaGFyaW5nLCBPcGVuIFNjaWVuY2UpP2ApICU+JSAKICBjb3VudChwb2xpY2llcywgc29ydD1UKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCnBvbGljaWVzCmBgYAoKKipDb21tZW50YXJ5Kio6IFRoZSBtYWpvcml0eSBvZiBwcm9qZWN0cyAocmVwcmVzZW50ZWQgYnkgYHIgcG9saWNpZXMkcmF0aW9bcG9saWNpZXMkcG9saWNpZXMgPT0gIlllcyJdYCUpIGFyZSByZXF1aXJlZCB0byBjb21wbHkgd2l0aCBkYXRhLXJlbGF0ZWQgcG9saWN5IGludHJvZHVjZWQgZWl0aGVyIGJ5IHRoZWlyIGluc3RpdHV0aW9uIG9yIGEgZnVuZGluZyBib2R5LiBgciBzdW0ocG9saWNpZXMkcmF0aW9bcG9saWNpZXMkcG9saWNpZXMgJWluJSBjKCJObyIsICJOb3QgeWV0IiwgIlRoZSBFUkMgb3BlbiBkYXRhIHBvbGljaWVzIGRvbid0IGFwcGx5IHRvIHRoaXMgcHJvamVjdCwgYnV0IHdlIGFyZSBmb2xsb3dpbmcgdGhlbSBhbnl3YXkuIiwgIlRoaXMgaXMgYW4gb2JqZWN0aXZlLCBidXQgbm90IGN1cnJlbnRseSBhIHJlcXVpcmVtZW50IG9mIHRoZSBwcm9qZWN0LiIpXSlgJSBvZiBwYXJ0bmVyIHByb2plY3RzIGFyZSBub3QgcmVxdWlyZWQgdG8gZm9sbG93IGFueSBkYXRhIHBvbGljeSwgYnV0IHNvbWUgZm9sbG93IG9uZSBvbiBhIHZvbHVudGFyeSBiYXNpcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSWYgeW91IGhhdmUgYW5zd2VyZWQgWUVTIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgcGxlYXNlIHNwZWNpZnkgd2hhdCBhcmUgdGhlIHBvbGljaWVzLCBvciBwcm92aWRlIGEgbGluay4qCgpgYGB7ciwgbGluZXdpZHRoPTkwfQpwb2xpY3lfc3BlY2lmaWVkIDwtIHVuaXF1ZShuYS5vbWl0KHBhcnRuZXJzJGBJZiB5b3UgaGF2ZSBhbnN3ZXJlZCBZRVMgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uLCBwbGVhc2Ugc3BlY2lmeSB3aGF0IGFyZSB0aGUgcG9saWNpZXMsIG9yIHByb3ZpZGUgbGluay5gKSkKCmFzLmRhdGEuZnJhbWUocG9saWN5X3NwZWNpZmllZCkKYGBgCgoqKkNvbW1lbnRhcnkqKjogU2V2ZXJhbCBvZiB0aGUgcGFydG5lciBwcm9qZWN0cyBmb2xsb3cgdGhlIEVSQyBkYXRhIGFuZCBvcGVuIGFjY2VzcyBwb2xpY2llcy4gTW9yZSBpbmZvcm1hdGlvbiBvbiBFUkMgT3BlbiBSZXNlYXJjaCBEYXRhIGFuZCBEYXRhIE1hbmFnZW1lbnQgUGxhbnMgY2FuIGJlIGZvdW5kIGF0IDxodHRwczovL2VyYy5ldXJvcGEuZXUvc2l0ZXMvZGVmYXVsdC9maWxlcy9kb2N1bWVudC9maWxlL0VSQ19pbmZvX2RvY3VtZW50LU9wZW5fUmVzZWFyY2hfRGF0YV9hbmRfRGF0YV9NYW5hZ2VtZW50X1BsYW5zLnBkZj4gb3IgYXQgRVJDIE9wZW4gU2NpZW5jZSBwb2xpY2llcyBwYWdlIDxodHRwczovL2VyYy5ldXJvcGEuZXUvbWFuYWdpbmcteW91ci1wcm9qZWN0L29wZW4tc2NpZW5jZT4uCgojIyBPcGVuIFNjaWVuY2UgcHJhY3RpY2UKCioqUXVlc3Rpb24qKjogKlN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtczoqCgpgYGB7cn0Kc3RhbmRfdGVybSA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYFN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgIiwgIikpKQpjb2xuYW1lcyhzdGFuZF90ZXJtKSA8LSBjKCJzdGFuZGFyZF90ZXJtaW5vbG9naWVzIikKCnN0YW5kX3Rlcm1fcmF0aW88LSBzdGFuZF90ZXJtICU+JSAKICBjb3VudChzdGFuZGFyZF90ZXJtaW5vbG9naWVzLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQobi8obnJvdyhwYXJ0bmVycykvMTAwKSkpICAKCnN0YW5kX3Rlcm1fcmF0aW8KYGBgCgoqKkNvbW1lbnRhcnkqKjogSW50ZXJuYWwgYXV0aG9yaXR5IGxpc3RzIGFyZSB0aGUgbW9zdCB3aWRlbHkgdXNlZCBtZXRob2QgdG8gcmVjb3JkIGVwaWdyYXBoaWMgdGVybWlub2xvZ2llcyAoYHIgc3RhbmRfdGVybV9yYXRpbyRyYXRpb1tzdGFuZF90ZXJtX3JhdGlvJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0gIkludGVybmFsIGF1dGhvcml0eSBsaXN0cyJdYCAlIG9mIHByb2plY3RzKS4gVGhlIHZvY2FidWxhcmllcyBmb3IgdGhlIGVwaWdyYXBoaWMgZGlzY2lwbGluZSBjcmVhdGVkIGJ5IHRoZSBFQUdMRSBwcm9qZWN0ICg8aHR0cHM6Ly93d3cuZWFnbGUtbmV0d29yay5ldS9yZXNvdXJjZXMvdm9jYWJ1bGFyaWVzLz4pIGFyZSB1c2VkIGVpdGhlciBpbiB0aGVpciBvcmlnaW5hbCBmb3JtIChgciBzdW0obmEub21pdChzdGFuZF90ZXJtX3JhdGlvJHJhdGlvW3N0YW5kX3Rlcm1fcmF0aW8kc3RhbmRhcmRfdGVybWlub2xvZ2llcyA9PSAiRUFHTEUgdm9jYWJ1bGFyaWVzIGFzIHByb3ZpZGVkIGF0IGh0dHBzOi8vd3d3LmVhZ2xlLW5ldHdvcmsuZXUvcmVzb3VyY2VzL3ZvY2FidWxhcmllcy8iXSkpYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cykgb3IgaW4gYSBmb3JtIG1vZGlmaWVkIGZvciB0aGUgaW5kaXZpZHVhbCBuZWVkcyBvZiB0aGUgcHJvamVjdCAoYHIgc3VtKG5hLm9taXQoc3RhbmRfdGVybV9yYXRpbyRyYXRpb1tzdGFuZF90ZXJtX3JhdGlvJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0gIk93biB2ZXJzaW9uIG9mIEVBR0xFIHZvY2FidWxhcmllcyAoZWRpdGVkIGZvciBvdXIgcHJvamVjdCkiXSkpYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cykuIFRoZSB1c2Ugb2Ygbm9uLXN0YW5kYXJkaXplZCBpbnRlcm5hbCBhdXRob3JpdHkgbGlzdHMgYW5kIHRoZSBuZWVkIGZvciBtb2RpZmljYXRpb25zIHN1Z2dlc3RzIHRoYXQgdGhlIEVBR0xFIHZvY2FidWxhcmllcyBkbyBub3QgaW4gZmFjdCBvZmZlciBzdWZmaWNpZW50bHkgYSBjb21tdW5pdHktd2lkZSBzdGFuZGFyZCBhbmQgbmVlZCB0byBiZSBpbXByb3ZlZCBiZWZvcmUgYmVjb21pbmcgb25lLiBUaGlzIHByb2Nlc3MgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkIGJ5IHRoZSBFcGlncmFwaHkuaW5mbyBWb2NhYnVsYXJpZXMgd29ya2luZyBncm91cCBvZiB3aGljaCBIZXJtYW5rb3ZhLCBIb3JzdGVyLCBhbmQgUHJhZyBhcmUgYWxsIG1lbWJlcnMuIEZvciBtb3JlIGRldGFpbHMgc2VlIDxodHRwczovL2VwaWdyYXBoeS5pbmZvL3ZvY2FidWxhcmllc193Zy8+LiBJZiB5b3Ugd291bGQgbGlrZSB0byBqb2luIHRoZSB3b3JraW5nIGdyb3VwLCBwbGVhc2UgZ2V0IGluIHRvdWNoIHdpdGggdGhlIGF1dGhvcnMuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKlN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBkYXRhIG9uIGNvbWJpbmF0aW9uIG9mIHZvY2FidWxhcmllcyBzeXN0ZW1zKgoKYGBge3J9CnN0YW5kX21ldGhvZDwtIHBhcnRuZXJzICU+JSAKICAjY291bnQoYFN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHN0YW5kX2FsbCA9IGBTdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llczogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXMgKGNoZWNrIGFsbCB0aGF0IGFwcGx5KWApICU+JSAKICBtdXRhdGUoc3RhbmRhcmRfbWV0aG9kX25vID0gc3RyX2NvdW50KHN0YW5kX2FsbCwgIiwgIikgKyAxKSAgJT4lIAogIHNlbGVjdChzdGFuZGFyZF9tZXRob2Rfbm8pICU+JSAKICBjb3VudChzdGFuZGFyZF9tZXRob2Rfbm8pICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZChuLyhucm93KHBhcnRuZXJzKS8xMDApKSkKc3RhbmRfbWV0aG9kCmBgYAoKKipDb21tZW50YXJ5Kio6IFRoZSBtYWpvcml0eSBvZiBwcm9qZWN0cyAoYHIgc3RhbmRfbWV0aG9kJHJhdGlvW3N0YW5kX21ldGhvZCRzdGFuZGFyZF9tZXRob2Rfbm8gPT0gMV1gJSkgdXNlIG9ubHkgb25lIG1ldGhvZCB0byByZWNvcmQgdGhlaXIgc3RhbmRhcmQgdGVybWlub2xvZ2llcywgd2hpbGUgYHIgc3VtKHN0YW5kX21ldGhvZCRyYXRpb1tzdGFuZF9tZXRob2Qkc3RhbmRhcmRfbWV0aG9kX25vID4gMV0pYCUgb2YgcHJvamVjdHMgdXNlIGEgY29tYmluYXRpb24gb2YgdHdvIG9yIG1vcmUgbWV0aG9kcy4gSW50ZXJuYWwgYXV0aG9yaXR5IGxpc3RzIGFyZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIEVBR0xFIHZvY2FidWxhcmllcyBib3RoIGluIHRoZWlyIG9yaWdpbmFsIGFuZCBtb2RpZmllZCBmb3JtLiBTaGFyaW5nIG9yIHB1YmxpY2F0aW9uIG9mIGludGVybmFsIGF1dGhvcml0eSBsaXN0cyB3b3VsZCB0aGVyZWZvcmUgYmUgaGlnaGx5IGJlbmVmaWNpYWwgZm9yIGltcHJvdmluZyB0aGUgZXhpc3RpbmcgRUFHTEUgdm9jYWJ1bGFyaWVzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpMaW5rZWQgT3BlbiBEYXRhc2V0czogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXM6KgoKYGBge3J9CmxvZCA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYExpbmtlZCBPcGVuIERhdGE6IFRoZSBwcm9qZWN0IHVzZXMgdGhlIGZvbGxvd2luZyBzeXN0ZW1zIChjaGVjayBhbGwgdGhhdCBhcHBseSlgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZCkgPC0gYygibGlua2VkX2RhdGEiKQoKbG9kX3JhdGlvPC0gbG9kICU+JSAKICBjb3VudChsaW5rZWRfZGF0YSwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpb19hbGxfcHJvaiA9IHJvdW5kKG4vKG5yb3cocGFydG5lcnMpLzEwMCkpKQpsb2RfcmF0aW8KCmBgYAoKKipDb21tZW50YXJ5Kio6IEZyb20gdGhlIGxpc3RlZCBMaW5rZWQgT3BlbiBEYXRhc2V0cyAoTE9EKSwgVHJpc21lZ2lzdG9zIGFuZCBQbGVpYWRlcyBhcmUgYnkgZmFyIHRoZSBtb3N0IHBvcHVsYXIsIGJlaW5nIHVzZWQgaW4gYHIgbG9kX3JhdGlvJHJhdGlvX2FsbF9wcm9qW2xvZF9yYXRpbyRsaW5rZWRfZGF0YT09IlRyaXNtZWdpc3RvcyJdYCUgYW5kIGluIGByIGxvZF9yYXRpbyRyYXRpb19hbGxfcHJvaltsb2RfcmF0aW8kbGlua2VkX2RhdGE9PSJQbGVpYWRlcyJdYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMuIFRoZSBFQUdMRSB2b2NhYnVsYXJpZXMgYXJlIHVzZWQgaW4gYHIgbG9kX3JhdGlvJHJhdGlvX2FsbF9wcm9qW2xvZF9yYXRpbyRsaW5rZWRfZGF0YT09IkVBR0xFIHZvY2FidWxhcmllcyJdYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMuCgpgYGB7cn0KCmxvZHA8LSBwYXJ0bmVycyRgTGlua2VkIE9wZW4gRGF0YTogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXMgKGNoZWNrIGFsbCB0aGF0IGFwcGx5KWAKCmdlb2dyYXBoaWM8LSByb3VuZChucm93KGFzLmRhdGEuZnJhbWUobG9kcCkgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QobG9kcCwgIlRyaXNtZWdpc3Rvc3xQbGVpYWRlc3xPdGhlcjogQWRyaWF0bGFzfE90aGVyOiBDYXJ0YXB1bGlhIikpKS8obnJvdyhwYXJ0bmVycykvMTAwKSkKCnByb3NvcG9ncmFwaGljPC0gcm91bmQobnJvdyhhcy5kYXRhLmZyYW1lKGxvZHApICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGxvZHAsICJFREggUGVvcGxlfFBJUnxMR1BOIikpKS8obnJvdyhwYXJ0bmVycykvMTAwKSkKYGBgCgpUaGUgZ3JvdXAgb2YgTE9EIHJlc291cmNlcyBmb2N1c2luZyBvbiAqKmdlb2dyYXBoaWMgZGF0YSoqIChlLmcuIFBsZWlhZGVzLCBBZHJpYXRsYXMsIENhcnRhcHVsaWEsIFRyaXNtZWdpc3Rvcykgc2VlbXMgdG8gYmUgc3Ryb25nbHkgcmVwcmVzZW50ZWQgYW1vbmdzdCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIChgciBnZW9ncmFwaGljYCAlIHVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlbSksIHN1Z2dlc3RpbmcgdGhhdCBnZW9ncmFwaGljIExPRCBhcmUgd2VsbCBlc3RhYmxpc2hlZCBmb3IgdGhlIHN0dWR5IG9mIHRoZSBhbmNpZW50IHdvcmxkLgoKKipQcm9zb3BvZ3JhcGhpYyBkYXRhKiosIGFzIHJlcHJlc2VudGVkIGJ5IEVESCBQZW9wbGUsIFBJUiwgYW5kIExHUE4gYXJlIHVzZWQgYnkgYHIgcHJvc29wb2dyYXBoaWNgJSBvZiBhbGwgcGFydGljaXBhdGluZyBwcm9qZWN0cy4gVGhlIHN1cnZleSByZXNwb25zZXMgc3VnZ2VzdCB0aGVyZSBpcyBhIGdyZWF0IHNwYWNlIGZvciBpbXByb3ZlbWVudCBhbmQgcG90ZW50aWFsbHkgZ3JlYXQgYmVuZWZpdCBpbiBjcmVhdGluZyBhbmQgZnVydGhlciBpbXByb3ZpbmcgcHJvc29wb2dyYXBoaWMgTE9ELgoKIyBOb24tcGFydG5lcmVkIGVwaWdyYXBoeSBwcm9qZWN0cwoKYGBge3IgZGF0YV9wcm9qZWN0cywgaW5jbHVkZT1GQUxTRX0KIyBsb2FkaW5nIGRhdGEgZnJvbSBUU1YgZmlsZQpwcm9qZWN0c19hbGw8LSByZWFkX3RzdigiLi4vZGF0YS8wMl9zY29waW5nX3N1cnZleV9hbm9ueW1pc2VkLnRzdiIpCgpwcm9qZWN0cyA8LSBwcm9qZWN0c19hbGwgJT4lIAogIGZpbHRlcihgRG8geW91IGNvbnNlbnQgb24gcHVibGlzaGluZyB0aGUgYW5vbnltaXNlZCBkYXRhIGluIHRoZSBmb3JtIG9mIHdyaXR0ZW4gc2hvcnQgcmVwb3J0IG9wZW4gdG8gcHVibGljIGFuZCBhY2Nlc3NpYmxlIHZpYSB0aGUgRkFJUiBFcGlncmFwaHkgaW5mcmFzdHJ1Y3R1cmUgKHdlYnNpdGUsIEdpdEh1YiwgVHdpdHRlcik/YCA9PSAiWWVzIikKYGBgCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlcyB0aGUgcmVzdWx0cyBvZiB0aGUgb25saW5lIHN1cnZleSBbKkRpZ2l0YWwgZXBpZ3JhcGh5IGluIDIwMjI6IHNjb3Bpbmcgc3VydmV5Kl0oaHR0cHM6Ly9naXRodWIuY29tL0ZBSVItZXBpZ3JhcGh5L3Njb3Bpbmdfc3VydmV5X3JlcG9ydC9kYXRhLzAyX1N1cnZleV9wcm9qZWN0c19xdWVzdGlvbnMucGRmKSB0YXJnZXRlZCBhdCBkaWdpdGFsIHByb2plY3RzIGN1cnJlbnRseSBsaXN0ZWQgdW5kZXIgRGlnaXRhbCBFcGlncmFwaHkgUHJvamVjdHMgb24gdGhlIERpZ2l0YWwgQ2xhc3NpY2lzdCBXaWtpIHBhZ2UgKDxodHRwczovL3dpa2kuZGlnaXRhbGNsYXNzaWNpc3Qub3JnL0NhdGVnb3J5OlByb2plY3RzPikgYW5kIHdoaWNoIHdhcyBwb3NzaWJsZSB0byB0cmFjZSBpbiBGZWJydWFyeSAyMDIyLiBUaGUgc3VydmV5IHdhcyBzZW50IHRvIDgzIHByb2plY3RzIGFuZCB0aGUgbGluayBjaXJjdWxhdGVkIHVudGlsIG1pZC1BcHJpbCAyMDIyLiBXZSBoYXZlIHJlY2VpdmVkIGByIG5yb3cocHJvamVjdHNfYWxsKWAgcmVzcG9uc2VzIHRvIHRoZSBzdXJ2ZXksIGEgcmVzcG9uc2UgcmF0ZSBvZiBgciByb3VuZChucm93KHByb2plY3RzKS8wLjgzKWAlLiBTb21lIHBhcnRpY2lwYW50cyBjb250cmlidXRlZCBvbiBiZWhhbGYgb2YgbXVsdGlwbGUgcHJvamVjdHMgaW4gb25lIHJlc3BvbnNlLCB3aGljaCB3ZSB3ZXJlIHVuYWJsZSB0byBkaXNlbnRhbmdsZSBhbmQgdGh1cyB0aGUgcmVzcG9uc2UgcmF0ZSBpcyBzbGlnaHRseSBza2V3ZWQuIGByIHJvdW5kKG5yb3cocHJvamVjdHMpLyhucm93KHByb2plY3RzX2FsbCkvMTAwKSlgJSAoYHIgbnJvdyhwcm9qZWN0cylgKSBvZiBub24tcGFydG5lcmVkIHByb2plY3RzIGdhdmUgY29uc2VudCB0byBwdWJsaXNoIHRoZWlyIGFub255bWlzZWQgcmVzcG9uc2VzIGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQgcmVwb3J0LiBUaGUgcmVtYWluaW5nIHJlc3BvbnNlcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgcmVwb3J0IGJ1dCB3aWxsIGJlIHVzZWQgdG8gaW5mb3JtIHRoZSBGQUlSIEVwaWdyYXBoeSBwbGFubmluZyBhbmQgZGVjaXNpb24gbWFraW5nLgoKVGhlIHJlc3BvbmRlbnRzIHJlcHJlc2VudCBhIHdpZGUgcmFuZ2Ugb2YgcHJvamVjdHMgZnJvbSB3ZWxsIGVzdGFibGlzaGVkIHByb2plY3RzIHRvIHNob3J0LXRlcm0gUGhEIHByb2plY3RzLCB3aXRoIHRoZSBhdmVyYWdlIGR1cmF0aW9uIG9mIGEgcHJvamVjdCBiZWluZyBgciBtZWRpYW4oYXMubnVtZXJpYyhwcm9qZWN0cyRMZW5ndGhfbnVtZXJpY195ZWFycykpYCB5ZWFycy4gVGhlIHNob3J0ZXN0IHBhcnRpY2lwYXRpbmcgcHJvamVjdCByZXBvcnRlZCB0aGVpciBkdXJhdGlvbiBhcyBgciBtaW4oYXMubnVtZXJpYyhwcm9qZWN0cyRMZW5ndGhfbnVtZXJpY195ZWFycykpYCB5ZWFyIGFuZCB0aGUgbG9uZ2VzdCBgciBtYXgoYXMubnVtZXJpYyhwcm9qZWN0cyRMZW5ndGhfbnVtZXJpY195ZWFycykpYCB5ZWFycy4KCioqUXVlc3Rpb24qKjogKklzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT8qCgpgYGB7cn0KcHJval9hY3Q8LSBwcm9qZWN0cyAlPiUgCiAgY291bnQoYElzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT9gLCBzb3J0PVQpICU+JSAKICByZW5hbWUoc3RhdHVzID0gYElzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT9gKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQobi8oc3VtKG4pLzEwMCkpKQpwcm9qX2FjdApgYGAKCioqQ29tbWVudGFyeSoqOiBgciBwcm9qX2FjdCRyYXRpb1twcm9qX2FjdCRzdGF0dXMgPT0gIlllcyJdYCUgb2YgcmVzcG9uZGluZyBwcm9qZWN0cyBhcmUgc3RpbGwgYWN0aXZlLCB3aGlsZSBgciBwcm9qX2FjdCRyYXRpb1twcm9qX2FjdCRzdGF0dXMgPT0gIk5vLCB0aGUgcHJvamVjdCBpcyBjbG9zZWQiXWAlIG9mIHByb2plY3RzIGFyZSBwZXJtYW5lbnRseSBjbG9zZWQgYW5kIGRvIG5vdCBjb25zaWRlciByZXN0YXJ0aW5nIGluIHRoZSBmdXR1cmUuIGByIHByb2pfYWN0JHJhdGlvW3Byb2pfYWN0JHN0YXR1cyA9PSAiQ3VycmVudGx5IG5vdCwgYnV0IHdlIGFyZSBjb25zaWRlcmluZyBhIHJlLXN0YXJ0Il1gJSBvZiBwcm9qZWN0cyBhcmUgY3VycmVudGx5IG5vdCBhY3RpdmUsIGJ1dCBtaWdodCBiZSByZWFjdGl2YXRlZCBpbiB0aGUgZnV0dXJlLgoKIyMgTGFuZ3VhZ2UgY292ZXJhZ2UKCioqUXVlc3Rpb246KiogKldoYXQgaXMgdGhlIHByZWRvbWluYW50IGxhbmd1YWdlIG9mIGVwaWdyYXBoaWMgZGF0YSBpbiB5b3VyIHByb2plY3QgKGZvciBtaXhlZCBjb2xsZWN0aW9ucyBvciBjb2xsZWN0aW9ucyB3aGVyZSBvdGhlciBsYW5ndWFnZXMgYXJlIHByZWRvbWluYW50IHByb3ZpZGUgZGV0YWlscyBpbiBPdGhlcikqCgpgYGB7cn0KcHJvamVjdHNfbGFuZ3VhZ2UgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3RyX3NwbGl0KHByb2plY3RzJExhbmd1YWdlX2NsZWFuLCAiOyAiKSkpCmNvbG5hbWVzKHByb2plY3RzX2xhbmd1YWdlKSA8LSBjKCJsYW5ndWFnZSIpCgpwcm9qZWN0c19sYW5ndWFnZV9yYXRpbyA8LSBwcm9qZWN0c19sYW5ndWFnZSAlPiUgCiAgY291bnQobGFuZ3VhZ2UsIHNvcnQ9VCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKcHJvamVjdHNfbGFuZ3VhZ2VfcmF0aW8KYGBgCgpgYGB7cn0KcHJvamVjdF9sYW5ndWFnZV9jb3VudDwtIHN0cl9jb3VudChwcm9qZWN0cyRMYW5ndWFnZV9jbGVhbiwgIjsiKSsxCmBgYAoKKipDb21tZW50YXJ5OioqIFRoZSBsYW5ndWFnZSBjb3ZlcmFnZSBvZiB0aGUgcGFydGljaXBhdGluZyBwcm9qZWN0cyBjb25zaXN0ZWQgcHJlZG9taW5hbnRseSBvZiBMYXRpbiBhbmQgR3JlZWsgcHJvamVjdHMsIHJlcHJlc2VudGluZyBgciBzdW0ocHJvamVjdHNfbGFuZ3VhZ2VfcmF0aW8kcmF0aW9bcHJvamVjdHNfbGFuZ3VhZ2VfcmF0aW8kbGFuZ3VhZ2UgJWluJSBjKCJHcmVlayIsICJMYXRpbiIpXSlgJSBvZiBwcm9qZWN0cyBjb21iaW5lZC4gR3JlZWsgaXMgdGhlIG1vc3QgZnJlcXVlbnQgbGFuZ3VhZ2UsIGVpdGhlciBhcyB0aGUgc29sZS9wcmVkb21pbmFudCBsYW5ndWFnZSAoYHIgc3VtKHByb2plY3RzJExhbmd1YWdlX2NsZWFuID09ICJHcmVlayIpYCBwcm9qZWN0cykgb3IgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBsYW5ndWFnZXMgKGByIHN1bShzdHJfY291bnQocHJvamVjdHMkTGFuZ3VhZ2VfY2xlYW4sIkdyZWVrIikpLXN1bShwcm9qZWN0cyRMYW5ndWFnZV9jbGVhbiA9PSAiR3JlZWsiKWAgcHJvamVjdHMpLiBMYXRpbiBpcyB0aGUgc29sZS9wcmVkb21pbmFudCBsYW5ndWFnZSBpbiBgciBzdW0ocHJvamVjdHMkTGFuZ3VhZ2VfY2xlYW4gPT0gIkxhdGluIilgIHByb2plY3RzIG9yIGluIGNvbWJpbmF0aW9uIHdpdGggb3RoZXIgbGFuZ3VhZ2VzIChgciBzdW0oc3RyX2NvdW50KHByb2plY3RzJExhbmd1YWdlX2NsZWFuLCJMYXRpbiIpKS1zdW0ocHJvamVjdHMkTGFuZ3VhZ2VfY2xlYW4gPT0gIkxhdGluIilgIHByb2plY3RzKS4gYHIgbGVuZ3RoKHByb2plY3RfbGFuZ3VhZ2VfY291bnRbcHJvamVjdF9sYW5ndWFnZV9jb3VudD09MV0pYCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIHJlY29yZCBpbnNjcmlwdGlvbnMgaW4gb25lIGxhbmd1YWdlIG9ubHksIHdoaWxlIGByIGxlbmd0aChwcm9qZWN0X2xhbmd1YWdlX2NvdW50W3Byb2plY3RfbGFuZ3VhZ2VfY291bnQ+MV0pYCBjb250YWluIGluc2NyaXB0aW9ucyBpbiB0d28gb3IgbW9yZSBsYW5ndWFnZXMgKGByIG1heChwcm9qZWN0X2xhbmd1YWdlX2NvdW50KWAgYmVpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlZCBsYW5ndWFnZXMuKS4KClRoZSBsYW5ndWFnZXMgbGlzdGVkIGFzIGBPdGhlcmAgY29uc2lzdGVkIG9mIGxhbmd1YWdlcyBzdWNoIGFzIGByIHByb2plY3RzX2xhbmd1YWdlX3JhdGlvJGxhbmd1YWdlWzM6MTZdYC4gQWxsIGxhbmd1YWdlcyBjb21lIGZyb20gdGhlIHdpZGVyIE1lZGl0ZXJyYW5lYW4vRXVyb3BlYW4gbGluZ3Vpc3RpYyBzcGFjZS4KCioqVW5pcXVlIGNvbWJpbmF0aW9ucyBvZiBsYW5ndWFnZXMgYXMgcmV0cmlldmVkIGZyb20gdGhlIHN1cnZleToqKgoKYGBge3J9CmFzLmRhdGEuZnJhbWUodW5pcXVlKHByb2plY3RzJExhbmd1YWdlX2NsZWFuKSkKYGBgCgojIyBJVCBpbmZyYXN0cnVjdHVyZQoKKipRdWVzdGlvbioqOiAqRG9lcyB0aGUgcHJvamVjdCBoYXZlIGEgd2Vic2l0ZT8qCgpgYGB7cn0KcHJvamVjdHMgJT4lIAogIGNvdW50KFdlYnNpdGUsIHNvcnQ9VCkKYGBgCgoqKkNvbW1lbnRhcnkqKjogQWxtb3N0IGFsbCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIG1haW50YWluIGFuIG9ubGluZSBwcmVzZW5jZSAoYXMgb2YgRmVicnVhcnktQXByaWwgMjAyMikuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkRvZXMgeW91ciBwcm9qZWN0IGhhdmUgYW4gSVQgc3BlY2lhbGlzdChzKT8qCgpgYGB7cn0KSVQyIDwtIHByb2plY3RzICU+JSAKICBjb3VudChgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKElUX3NwZWMgPSBgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCkgJT4lIAogICNuYS5vbWl0KElUX3NwZWMpICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZChuLyhucm93KHByb2plY3RzKS8xMDApKSkKSVQyCmBgYAoKKipDb21tZW50YXJ5Kio6IE9ubHkgYHIgSVQyJHJhdGlvW25hLm9taXQoSVQyJElUX3NwZWMpID09ICJZZXMsIGVxdWl2YWxlbnQgb2YgZnVsbC10aW1lICgxLjAgRlRFKSBwb3NpdGlvbiJdYCUgb2YgcHJvamVjdHMgaGF2ZSBhbiBlcXVpdmFsZW50IG9mIDEuMCBGVEUgb3IgbW9yZSBJVCBzdXBwb3J0IGF0IHRoZWlyIGRpc3Bvc2FsLiBgciBzdW0oSVQyJHJhdGlvW2MoNiw3LDkpXSkgKyBzdW0oSVQyJHJhdGlvW25hLm9taXQoSVQyJElUX3NwZWMpID09ICJZZXMsIGVxdWl2YWxlbnQgb2YgcGFydC10aW1lICg8MS4wIEZURSkgcG9zaXRpb24iXSlgJSBvZiBkaWdpdGFsIHByb2plY3RzIGhhdmUgYW4gSVQgc3BlY2lhbGlzdCBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IHNldmVyYWwgaG91cnMgcGVyIHdlZWsgb3Igc2hhcmUgdGhlbSB3aXRoIG90aGVyIGRpZ2l0YWwgcHJvamVjdHMgd2l0aGluIHRoZWlyIGluc3RpdHV0aW9uLiBTZXZlcmFsIHByb2plY3RzIHJlcG9ydCBkaWZmaWN1bHR5IHdpdGggZmluZGluZyBmaW5hbmNpYWwgcmVzb3VyY2VzIHRvIHN1cHBvcnQgZnVydGhlciBkZXZlbG9wbWVudCBhbmQgbG9uZy10ZXJtIHN1c3RhaW5hYmlsaXR5IG9mIHRoZSBwcm9qZWN0IG9yIGV2ZW4gZGF5LXRvLWRheSBzdXBwb3J0LiBgciBzdW0oSVQyJHJhdGlvW25hLm9taXQoSVQyJElUX3NwZWMpICVpbiUgYygiTm8iLCAiV2UgaGFkIildKWAlIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIHJlcG9ydCB0aGF0IHRoZXkgY3VycmVudGx5IGRvIG5vdCBoYXZlIGFueSBhY2Nlc3MgdG8gSVQgc3VwcG9ydC4gQW4gYWRkaXRpb25hbCBgciBJVDIkcmF0aW9bbmEub21pdChJVDIkSVRfc3BlYykgPT0gIk4vQSJdYCUgb2YgcHJvamVjdHMgZGlkIG5vdCBpbmRpY2F0ZSB3aGV0aGVyIHRoZXkgaGF2ZSBhY2Nlc3MgdG8gSVQgc3VwcG9ydCBiZWNhdXNlIHRoZXkgYXJlIG5vIGxvbmdlciBhY3RpdmUuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQgdGhlIHByZWNpc2Ugc2lnbmlmaWNhbmNlIG9mIHRoaXMgZGF0YSwgaXQgd291bGQgYmUgbmVjZXNzYXJ5IGluIGZ1dHVyZSBzdXJ2ZXlzIHRvIGNsYXJpZnkgdGhlIGN1cnJlbnQgZnVuZGluZyBzdGF0dXMgb2YgaW5kaXZpZHVhbCBwcm9qZWN0cy4gSG93ZXZlciwgdGhlIGdlbmVyYWwgdHJlbmQgb2YgbGltaXRlZCBhY2Nlc3MgdG8gSVQgc3VwcG9ydCBhbW9uZ3N0IG5vbi1wYXJ0bmVyZWQgcHJvamVjdCBzdGFuZHMgb3V0LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpEb2VzIHlvdXIgcHJvamVjdCBzdG9yZSBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzLi4uPyoKCmBgYHtyfQpmb3JtYXQyIDwtIHByb2plY3RzICU+JSAKICBjb3VudChgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKGZvcm1hdCA9IGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgKSAlPiUgCiAgZmlsdGVyKGZvcm1hdCAhPSAiTi9BIikgJT4lIAogIG11dGF0ZShub19mb3JtYXQgPSBzdHJfY291bnQoZm9ybWF0LCAiLCIpICsgMSkKZm9ybWF0MgpgYGAKCmBgYHtyfQplcGlkb2MyIDwtIHN1bShzdHJfZGV0ZWN0KHByb2plY3RzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiRXBpZG9jIFhNTCIpKQpqc29uMiA8LSBzdW0oc3RyX2RldGVjdChwcm9qZWN0cyRgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgIkpTT04iKSkKcmRmMiA8LSBzdW0oc3RyX2RldGVjdChwcm9qZWN0cyRgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgIlJERiIpKQpjc3YyIDwtIHN1bShzdHJfZGV0ZWN0KHByb2plY3RzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiQ1NWIikpCnNxbDIgPC0gc3VtKHN0cl9kZXRlY3QocHJvamVjdHMkYE91ciBwcm9qZWN0cyBzdG9yZXMgZXBpZ3JhcGhpYyBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0c2AsICJTUUwiKSkKYGBgCgoqKkNvbW1lbnRhcnkqKjogVGhlIG1ham9yaXR5IG9mIHByb2plY3RzIHVzZSBgRXBpZG9jIFhNTGAgYXMgdGhlaXIgbWFpbiBvdXRwdXQgZGF0YSBmb3JtYXQgKGByIHJvdW5kKGVwaWRvYzIvKG5yb3cocHJvamVjdHMpLzEwMCkpYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyksIGVpdGhlciBpbiBjb21iaW5hdGlvbiB3aXRoIG90aGVyIGZvcm1hdHMgb3IgYXMgdGhlIHNvbGUgZGF0YSBmb3JtYXQuIFNRTCBhbmQgc2ltaWxhciBkYXRhYmFzZSBmb3JtYXRzIGFyZSByZWxhdGl2ZWx5IGNvbW1vbiwgaW4gYHIgcm91bmQoc3FsMi8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSBvZiBwcm9qZWN0cy4gT3RoZXIgZGF0YSBmb3JtYXRzIGFyZSByZXByZXNlbnRlZCBsZXNzIGZyZXF1ZW50bHkgYnkgYSBzbWFsbCBudW1iZXIgb2YgcHJvamVjdHMgYW5kIG1vc3RseSBhcyBjb21wbGVtZW50YXJ5IGRhdGEgZm9ybWF0cyB0byBtb3JlIHBvcHVsYXIgZm9ybWF0cyBzdWNoIGFzIEVwaWRvYyBYTUwgb3IgU1FMOiBKU09OIChgciByb3VuZChqc29uMi8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSksIFJERiAoYHIgcm91bmQocmRmMi8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSksIGFuZCBDU1YgKGByIHJvdW5kKGNzdjIvKG5yb3cocHJvamVjdHMpLzEwMCkpYCUpLiBgciByb3VuZChmb3JtYXQyJG5bOV0vKG5yb3cocHJvamVjdHMpLzEwMCkpYCUgb2YgcHJvamVjdHMgaW5kaWNhdGVkIHRoZSB1c2Ugb2YgYSBjb21iaW5hdGlvbiBvZiBhbmFsb2d1ZSBkYXRhIGFuZCAzRCBkYXRhIGZvcm1hdC4gYHIgcm91bmQoZm9ybWF0MiRuW2Zvcm1hdDIkZm9ybWF0PT0iWE1MIGFkYXB0ZWQgZnJvbSBFcGlkb2MgWE1MIl0vKG5yb3cocHJvamVjdHMpLzEwMCkpYCUgb2YgcHJvamVjdHMgaW5kaWNhdGVkIHVzaW5nIHRoZWlyIG93biB2ZXJzaW9uIG9mIEVwaWRvYyBYTUwsIGFkYXB0ZWQgdG8gdGhlaXIgc3BlY2lmaWMgbmVlZHMuCgpgciByb3VuZCgoc3VtKGZvcm1hdDIkbm9fZm9ybWF0ID09IDEpKS8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSBvZiBwcm9qZWN0cyB1c2Ugb25seSBvbmUgdHlwZSBvZiBkYXRhIGZvcm1hdCwgd2hpbGUgYHIgcm91bmQoKHN1bShmb3JtYXQyJG5vX2Zvcm1hdCA+IDEpKS8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSB1c2UgdHdvIG9yIG1vcmUgZGF0YSBmb3JtYXQgdHlwZXMuIFRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgcHJvamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSBpcyByZWNvcmRlZCBpbiB0aGUgZm9sbG93aW5nICpEYXRhIHNoYXJpbmcqIHNlY3Rpb24sIHVuZGVyICpDbG9zZWQgUHJvamVjdHMqLgoKIyMgRGF0YSBzaGFyaW5nCgojIyMgQWN0aXZlIHByb2plY3RzCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlZCBvbmx5IHRoZSAnYWN0aXZlJyBwcm9qZWN0cy4gRm9yICdjbG9zZWQvbm9uLWFjdGl2ZScgcHJvamVjdHMsIHNlZSB0aGUgc2VjdGlvbiBiZWxvdy4KCmBgYHtyfQphY3RpdmVfcHJvaiA8LSBucm93KGZpbHRlcihwcm9qZWN0cywgYElzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT9gJWluJSBjKCJZZXMiKSkpCmBgYAoKKipRdWVzdGlvbioqOiAqRG8geW91IHNoYXJlIHlvdXIgZGF0YSBvdXRzaWRlIG9mIHlvdXIgcHJvamVjdD8qCgpgYGB7cn0Kc2hhcmUyPC0gcHJvamVjdHMgJT4lIAogIGNvdW50KGBEbyB5b3Ugc2hhcmUgeW91ciBkYXRhIG91dHNpZGUgb2YgeW91ciBwcm9qZWN0YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHNoYXJlID0gYERvIHlvdSBzaGFyZSB5b3VyIGRhdGEgb3V0c2lkZSBvZiB5b3VyIHByb2plY3RgKSAlPiUgCiAgZmlsdGVyKHNoYXJlICE9ICJOL0EiKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCnNoYXJlMgpgYGAKCioqQ29tbWVudGFyeSoqOiBBcyBvZiBGZWJydWFyeSAyMDIyLCBgciBzdW0oYWN0aXZlX3Byb2opYCBwcm9qZWN0cyBwYXJ0aWNpcGF0ZWQgaW4gdGhlIHN1cnZleSBhcyBhY3RpdmUgcHJvamVjdHMuIFRoZSBtYWpvcml0eSBvZiBhY3RpdmUgcHJvamVjdHMgYXJlIHdpbGxpbmcgdG8gc2hhcmUgdGhlaXIgZGF0YSwgcmVwcmVzZW50aW5nIGByIHN1bShzaGFyZTIkcmF0aW9bYygxLDMsNCw1LDYsNyw4LDksMTApXSlgJSBvZiBwYXJ0aWNpcGF0aW5nIHByb2plY3RzLiBgciBzdW0oc2hhcmUyJHJhdGlvW2MoMSw3LDgsOSldKWAlIG9mIGFjdGl2ZSBwcm9qZWN0cyBzaGFyZSBkYXRhIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBsaWNlbnNlLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBGQUlSIGRhdGEgcHJpbmNpcGxlcy4gYHIgc3VtKHNoYXJlMiRyYXRpb1tjKDMsMTApXSlgJSBvZiBhY3RpdmUgcHJvamVjdHMgc2hhcmUgZGF0YSB3aXRob3V0IGFueSBzcGVjaWZpYyBsaWNlbnNlLCB3aGlsZSBgciBzaGFyZTIkcmF0aW9bNF1gJSBwcm92aWRlIGRhdGEgb25seSBvbiBkZW1hbmQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkhvdyBkbyB5b3Ugc2hhcmUgeW91ciBkYXRhIHdpdGggdXNlcnMgb3V0c2lkZSB5b3VyIHByb2plY3Q/KgoKYGBge3J9Cm91dHNoYXJlMjwtIHByb2plY3RzICU+JSAKICBjb3VudChgSG93IGRvIHNoYXJlIHlvdXIgZGF0YSB3aXRoIHVzZXJzIG91dHNpZGUgeW91ciBwcm9qZWN0YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHNoYXJlX2FsbCA9IGBIb3cgZG8gc2hhcmUgeW91ciBkYXRhIHdpdGggdXNlcnMgb3V0c2lkZSB5b3VyIHByb2plY3RgKSAlPiUKICBmaWx0ZXIoc2hhcmVfYWxsICE9ICJOL0EiKSAlPiUgCiAgbXV0YXRlKHNoYXJlX21ldGhvZCA9IHN0cl9jb3VudChzaGFyZV9hbGwsICJbLHw7XSAiKSArIDEpIAoKb3V0c2hhcmUyCmBgYAoKKipDb21tZW50YXJ5Kio6IEFzIG9mIEZlYnJ1YXJ5IDIwMjIsIGFsbCBidXQgb25lIG9mIHRoZSBhY3RpdmUgcHJvamVjdHMgcHJvdmlkZSBhdCBsZWFzdCBvbmUgd2F5IG9mIHNoYXJpbmcgZGF0YSAod2hldGhlciBpdCBpcyBjdXJyZW50bHkgYWNjZXNzaWJsZSB0byB0aGUgcHVibGljIG9yIG5vdCwgb3IgaXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNjZXNzaWJsZSBpbiB0aGUgZnV0dXJlKS4gVGhlIGF2ZXJhZ2UgKG1lZGlhbikgbnVtYmVyIG9mIHNoYXJpbmcgbWV0aG9kcyBwZXIgcHJvamVjdCBpcyBgciByb3VuZChtZWRpYW4obmEub21pdChvdXRzaGFyZTIkc2hhcmVfbWV0aG9kKSkpYCwgd2hpbGUgdGhlIG1heGltdW0gbnVtYmVyIGlzIGByIG1heChuYS5vbWl0KG91dHNoYXJlMiRzaGFyZV9tZXRob2QpKWAuCgpUaGVyZSBpcyBubyBkaXNjaXBsaW5lLXdpZGUgc3RhbmRhcmQgZGF0YSByZXBvc2l0b3J5IGFzIGlzIGNvbW1vbiBpbiBvdGhlciBkaXNjaXBsaW5lcyAoZS5nLiBUREFSLCA8aHR0cHM6Ly9jb3JlLnRkYXIub3JnLz4sIG9yIEFyaWFkbmVQbHVzLCA8aHR0cHM6Ly9hcmlhZG5lLWluZnJhc3RydWN0dXJlLmV1Lz4gZm9yIGFyY2hhZW9sb2dpY2FsIGRhdGEpLiBUaHVzIGFsbCBwcm9qZWN0cyB1c2UgZWl0aGVyIHRoZWlyIGluc3RpdHV0aW9uYWwgb3IgbmF0aW9uYWwgcmVzb3VyY2VzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgaWRlYWwgZm9yIGVwaWdyYXBoaWMgZGF0YS4gQW1vbmcgdGhvc2Ugd2hvIHNoYXJlIGRhdGEsIHRoZSBFcGlkb2MgWE1MIGZvcm1hdCBpcyB0aGUgbW9zdCBwb3B1bGFyIGZvcm1hdCBmb3IgZGF0YSBzaGFyaW5nIChgciBzdW0oc3RyX2NvdW50KG91dHNoYXJlMiRzaGFyZV9hbGwsICJFcGlkb2MgWE1MIikpYCBwcm9qZWN0cyksIGFsb25nc2lkZSBwcm92aWRpbmcgZGF0YSBvdXRwdXQgdXBvbiBzZWFyY2ggb24gdGhlIHByb2plY3QncyB3ZWJzaXRlIChpbiB3aGljaGV2ZXIgZm9ybWF0KS4gT3BlbiBTY2llbmNlIHByYWN0aWNlcyBkbyBub3Qgc2VlbSB0byBiZSBhIHBvcHVsYXIgY2hvaWNlIGluIGRpZ2l0YWwgZXBpZ3JhcGh5LCBzdWNoIGFzIHNoYXJpbmcgdmlhIHB1YmxpYyByZXBvc2l0b3J5LCBlLmcuIEdpdEh1YiAoYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZTIkc2hhcmVfYWxsLCAiR2l0SHViIikpYCBwcm9qZWN0cykgb3IgWmVub2RvIChgciBzdW0oc3RyX2NvdW50KG91dHNoYXJlMiRzaGFyZV9hbGwsICJaZW5vZG8iKSlgIHByb2plY3RzKSwgYXMgd2VsbCBhcyBwcm92aWRpbmcgcmF3IGRhdGEgaW4gdGhlIENTViAoY29tbWEtc2VwYXJhdGVkIHZhbHVlKSBmb3JtYXQsIG9yIGFzIEpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSBmaWxlcy4gQ29tcHV0ZXItYXV0b21hdGVkIGFjY2VzcyB0byBkYXRhIGlzIHJhcmUgYW5kIG1hbnVhbCBodW1hbiBpbnRlcmFjdGlvbiwgc3VjaCBhcyBtYW51YWwgc2VsZWN0aW9uIGFuZC9vciBtYW51YWwgZG93bmxvYWQgb2YgZmlsZXMgcHJldmFpbHMsIHBvdGVudGlhbGx5IGhpbmRlcmluZyBhbnkgcXVhbnRpdGF0aXZlIGFuZCByZXByb2R1Y2libGUgc3R1ZGllcywgb3IgdGhlIGxpbmtpbmcgb2YgZGF0YXNldHMgdmlhIGF1dG9tYXRlZCBwcm9jZXNzZXMuIEZvciBleGFtcGxlLCBhbiBBUEkgYWNjZXNzIHBvaW50IGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb25seSBmb3IgYSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mIHByb2plY3RzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMgQ2xvc2VkIHByb2plY3RzCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlZCBvbmx5IHRoZSAnY2xvc2VkL25vbi1hY3RpdmUnIHByb2plY3RzLiBGb3IgJ2FjdGl2ZScgcHJvamVjdHMsIHNlZSB0aGUgc2VjdGlvbiBhYm92ZS4KCioqUXVlc3Rpb24qKjogKklzIHRoZSBkYXRhIGNyZWF0ZWQgYnkgeW91ciBwcm9qZWN0IGFjY2Vzc2libGU/KgoKYGBge3J9CmNsb3NlZF9wcm9qIDwtIG5yb3coZmlsdGVyKHByb2plY3RzLCBgSXMgdGhlIHByb2plY3Qgc3RpbGwgYWN0aXZlP2AlaW4lIGMoIk5vLCB0aGUgcHJvamVjdCBpcyBjbG9zZWQiLCAiQ3VycmVudGx5IG5vdCwgYnV0IHdlIGFyZSBjb25zaWRlcmluZyBhIHJlLXN0YXJ0IikpKQpgYGAKCmBgYHtyfQpzaGFyZV9jbDwtIHByb2plY3RzICU+JSAKICByZW5hbWUoc2hhcmUgPSBgSXMgdGhlIGRhdGEgY3JlYXRlZCBieSB5b3VyIHByb2plY3QgYWNjZXNzaWJsZT9gKSAlPiUKICBmaWx0ZXIoc2hhcmUgIT0iTi9BIikgJT4lIAogIGNvdW50KHNoYXJlLCBzb3J0PVQpICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZCgobi8oc3VtKGNsb3NlZF9wcm9qKS8xMDApKSkpCnNoYXJlX2NsCmBgYAoKKipDb21tZW50YXJ5Kio6IEFzIG9mIEZlYnJ1YXJ5IDIwMjIsIGByIGNsb3NlZF9wcm9qYCBvZiB0aGUgcGFydGljaXBhdGluZyBwcm9qZWN0cyBhcmUgY2xvc2VkLiBgciBzaGFyZV9jbCRyYXRpb1tzaGFyZV9jbCRzaGFyZSA9PSAiWWVzLCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZSJdYCUgb2YgdGhlbSBwcm92aWRlIGFjY2VzcyB0byB0aGVpciBkYXRhIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBsaWNlbnNlIGV2ZW4gdGhvdWdoIHRoZSBwcm9qZWN0IGlzIG5vIGxvbmdlciBhY3RpdmUsIGByIHNoYXJlX2NsJHJhdGlvW3NoYXJlX2NsJHNoYXJlID09ICJZZXMsIHdpdGhvdXQgYW55IGxpY2Vuc2UiXWAlIG9mIGNsb3NlZCBwcm9qZWN0cyBwcm92aWRlIGFjY2VzcyB3aXRob3V0IGFueSBsaWNlbnNlIGFuZCBgciBzaGFyZV9jbCRyYXRpb1tzaGFyZV9jbCRzaGFyZSA9PSAiTm90IGN1cnJlbnRseSwgYnV0IHdlIGFyZSB0aGlua2luZyBhYm91dCBtYWtpbmcgaXQgYXZhaWxhYmxlIl1gJSBkbyBub3QgY3VycmVudGx5IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBkYXRhIHRoZXkgaGF2ZSBjcmVhdGVkIGR1cmluZyB0aGUgbGl2ZSBwaGFzZSBvZiB0aGVpciBwcm9qZWN0LCBidXQgdGhleSBhcmUgY29uc2lkZXJpbmcgbWFraW5nIHRoZSBkYXRhIGF2YWlsYWJsZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSXMgdGhlIGRhdGEgY3JlYXRlZCBieSB5b3VyIHByb2plY3QgYWNjZXNzaWJsZT8qCgpgYGB7cn0Kc2hhcmluZ19jbGFjIDwtIGFzX3RpYmJsZSh1bmxpc3Qoc3RyX3NwbGl0KHByb2plY3RzJGBPdXIgcHJvamVjdCBkYXRhIGFyZSBhY2Nlc3NpYmxlIHZpYSAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpOmAsICIsICIpKSkKY29sbmFtZXMoc2hhcmluZ19jbGFjKSA8LSBjKCJzZXJ2aWNlIikKCgpzaGFyaW5nX2NsYWNjZXNzIDwtIHNoYXJpbmdfY2xhYyAlPiUgCiAgZmlsdGVyKHNlcnZpY2UgIT0gIk4vQSIpICU+JSAKICBjb3VudChzZXJ2aWNlLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShjbG9zZWRfcHJvaikvMTAwKSkpKQpzaGFyaW5nX2NsYWNjZXNzCmBgYAoKKipDb21tZW50YXJ5Kio6IEFzIG9mIEZlYnJ1YXJ5IDIwMjIsIGByIGNsb3NlZF9wcm9qYCBvZiB0aGUgcGFydGljaXBhdGluZyBwcm9qZWN0cyBhcmUgY2xvc2VkLiBPdXQgb2YgdGhlc2UgY2xvc2VkIHByb2plY3RzLCBgciBzaGFyaW5nX2NsYWNjZXNzJHJhdGlvW3NoYXJpbmdfY2xhY2Nlc3Mkc2VydmljZSA9PSAiSW5kaXZpZHVhbCBFcGlkb2MgWE1McyBvciBFcGlkb2MgWE1MIGR1bXBzIG9uIHRoZSB3ZWJzaXRlIl1gJSBwcm92aWRlIHRoZWlyIGRhdGEgaW4gdGhlIEVwaWRvYyBYTUwgZm9ybWF0IG9uIHRoZWlyIHdlYnNpdGUsIGByIHNoYXJpbmdfY2xhY2Nlc3MkcmF0aW9bc2hhcmluZ19jbGFjY2VzcyRzZXJ2aWNlID09ICJQdWJsaWMgcmVwb3NpdG9yeSBvbiBHaXRIdWIiXWAlIHByb3ZpZGUgdGhlaXIgZGF0YSB2aWEgcHVibGljIHJlcG9zaXRvcnkgb24gR2l0SHViLCBgciBzaGFyaW5nX2NsYWNjZXNzJHJhdGlvW3NoYXJpbmdfY2xhY2Nlc3Mkc2VydmljZSA9PSAiT3RoZXIgcHVibGljbHkgYWNjZXNzaWJsZSByZXBvc2l0b3J5IChzcGVjaWZ5IGluIE90aGVyKSJdYCUgdmlhIG90aGVyIHB1YmxpY2x5IGFjY2Vzc2libGUgcmVwb3NpdG9yaWVzLiBgciBzaGFyaW5nX2NsYWNjZXNzJHJhdGlvW3NoYXJpbmdfY2xhY2Nlc3Mkc2VydmljZSA9PSAiV2UgZG9uJ3QgY3VycmVudGx5IHNoYXJlIGRhdGEgb3V0c2lkZSBvdXIgcHJvamVjdCJdYCUgb2YgY2xvc2VkIHByb2plY3RzIGRvdCBjdXJyZW50bHkgc2hhcmUgZGF0YSBvdXRzaWRlIHRoZSBwcm9qZWN0ICg9YHIgbGVuZ3RoKHNoYXJpbmdfY2xhY2Nlc3MkcmF0aW9bc2hhcmluZ19jbGFjY2VzcyRzZXJ2aWNlID09ICJXZSBkb24ndCBjdXJyZW50bHkgc2hhcmUgZGF0YSBvdXRzaWRlIG91ciBwcm9qZWN0Il0pYCBwcm9qZWN0KS4KClRoZSBmYWN0IHRoYXQgZXZlbiB0aGUgY2xvc2VkIHByb2plY3RzIHNoYXJlIHRoZWlyIGRhdGEgaW4gc29tZSBmb3JtIGV2ZW4gYWZ0ZXIgdGhlIHByb2plY3QgaXMgbm8gbG9uZ2VyIGFjdGl2ZS9kb2VzIG5vdCBoYXZlIGZ1bmRpbmcgZm9yIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb3IgbWFpbnRlbmFuY2UgaXMgcG9zaXRpdmUuIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGRhdGEgc2l0IG9uIHByaXZhdGUgb3IgaW5zdGl0dXRpb25hbCB3ZWJzaXRlcyB0aGF0IGNhbiBlYXNpbHkgZGlzYXBwZWFyLCBhbG9uZyB3aXRoIGFjY2VzcyB0byB0aGUgZGF0YS4gVGhlIGJlc3QgcHJhY3RpY2UgZm9yIHRoZSBsb25nZXZpdHkgb2YgdGhlc2UgY3JlYXRlZCBkYXRhc2V0cyB3b3VsZCBiZSBhcmNoaXZpbmcgdGhlbSB0byBhIHB1YmxpY2x5IGFjY2Vzc2libGUgcmVwb3NpdG9yeSwgc3VjaCBhcyBHaXRIdWIsIFplbm9kbywgSEFMLCBPcGVuIFNjaWVuY2UgRnJhbWV3b3JrIG9yIGFueSBzaW1pbGFyIGFyY2hpdmFsIGluZnJhc3RydWN0dXJlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBJbnN0aXR1dGlvbmFsIHBvbGljaWVzCgoqUXVlc3Rpb246KiAqRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9yIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiBGQUlSIHByaW5jaXBsZXMsIGRhdGEgc3RvcmFnZSwgZGF0YSBzaGFyaW5nLCBPcGVuIFNjaWVuY2UpPyoKCmBgYHtyfQpwb2xpY2llczIgPC0gcHJvamVjdHMgJT4lIAogIG11dGF0ZShwb2xpY2llcyA9IGBEb2VzIHlvdXIgaW5zdGl0dXRpb24gb2YgZnVuZGluZyBib2R5IHJlcXVpcmUgeW91ciBwcm9qZWN0IHRvIGNvbXBseSB3aXRoIGFueSBkYXRhIHBvbGljaWVzIChlLmcuLCBGQUlSIHByaW5jaXBsZXMsIGRhdGEgc3RvcmFnZSwgZGF0YSBzaGFyaW5nLCBPcGVuIFNjaWVuY2UpP2ApICU+JSAKICBmaWx0ZXIocG9saWNpZXMgIT0gIk4vQSIpICU+JSAKICBjb3VudChwb2xpY2llcywgc29ydD1UKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCiAgCnBvbGljaWVzMgpgYGAKCioqQ29tbWVudGFyeSoqOiBgciBwb2xpY2llczIkcmF0aW9bcG9saWNpZXMyJHBvbGljaWVzID09ICJObyJdYCUgb2YgcHJvamVjdHMgZG8gbm90IGV4cGxpY2l0bHkgaGF2ZSB0byBmb2xsb3cgYW55IHBvbGljeS4gYHIgcG9saWNpZXMyJHJhdGlvW3BvbGljaWVzMiRwb2xpY2llcyA9PSAiWWVzIl1gJSBvZiBwcm9qZWN0cyBhcmUgcmVxdWlyZWQgdG8gY29tcGx5IHdpdGggZGF0YSByZWxhdGVkIHBvbGljaWVzLCB3aGlsZSBhbiBhZGRpdGlvbmFsIGByIHN1bShwb2xpY2llczIkcmF0aW9bYygzLDQsNSw2KV0pYCUgb2YgcHJvamVjdHMgYXJlIGVuY291cmFnZWQgdG8gY29tcGx5IHdpdGggRkFJUiBkYXRhIHByaW5jaXBsZXMgYnV0IG5vIHJ1bGVzIGFyZSBlbmZvcmNlZC4KCkhvd2V2ZXIsIHNvbWUgb2YgdGhlIHByb2plY3RzIGFyZSBhbHJlYWR5IGNsb3NlZCBhbmQgbWF5IGhhdmUgYmVlbiBjbG9zZWQgZm9yIHNvbWUgdGltZS4gRGF0YSBwb2xpY3kgcmVxdWlyZW1lbnRzIGhhdmUgdW5kZXJnb25lIG1ham9yIGNoYW5nZXMgaW4gdGhlIGxhc3QgNSB5ZWFycywgYW5kIGl0IGlzIG1vcmUgdGhhbiBsaWtlbHkgdGhhdCBzdWNoIHBvbGljaWVzIHdlcmUgbm90IHByZXZpb3VzbHkgcmVxdWlyZWQsIHdoaWNoIG1heSBiZSByZWZsZWN0ZWQgaW4gdGhlIHJlbGF0aXZlbHkgbG93IGNvbXBsaWFuY2Ugd2l0aCBGQUlSIGFuZCBPcGVuIFNjaWVuY2UgZGF0YSBwb2xpY2llcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSWYgeW91IGhhdmUgYW5zd2VyZWQgWUVTIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgcGxlYXNlIHNwZWNpZnkgd2hhdCBhcmUgdGhlIHBvbGljaWVzLCBvciBwcm92aWRlIGEgbGluay4qCgpgYGB7ciwgbGluZXdpZHRoPTkwfQpwb2xpY2llc19leGFtcGxlPC0gYXMuZGF0YS5mcmFtZShwcm9qZWN0cyRgSWYgeW91IGhhdmUgYW5zd2VyZWQgWUVTIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgcGxlYXNlIHNwZWNpZnkgd2hhdCBhcmUgdGhlIHBvbGljaWVzLCBvciBwcm92aWRlIGxpbmsuYCkKY29sbmFtZXMocG9saWNpZXNfZXhhbXBsZSkgPC0gInBvbGljeV9leGFtcGxlIgpwb2xpY2llc19leGFtcGxlICU+JSAKICBuYS5vbWl0KCkgLT4gcG9saWNpZXNfZXhhbXBsZQoKcG9saWNpZXNfZXhhbXBsZQpgYGAKCioqQ29tbWVudGFyeSoqOiBEYXRhIHBvbGljaWVzIGluIHRoZSBmaWVsZCBvZiBkaWdpdGFsIGVwaWdyYXBoeSBhcmUgc3RpbGwgYmVpbmcgaW1wbGVtZW50ZWQgYW5kIHNvIGFyZSBub3QgeWV0IHJlZmxlY3RlZCBpbiBwYXN0IGFuZCBjdXJyZW50IHByb2plY3RzLiBUaGVyZSBpcyBhIHZhcmlhdGlvbiBiZXR3ZWVuIG5hdGlvbmFsIHBvbGljaWVzIGFtb25nc3Qgb3VyIHJlc3BvbnNlcywgd2l0aCBGcmFuY2UgYW5kIE5vcndheSBwcm92aWRpbmcgZXhhbXBsZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIE9wZW4gU2NpZW5jZSBpbiBkaWdpdGFsIGVwaWdyYXBoeS4KCmBgYHtyLCBlY2hvPUZBTFNFfQpwb2xpY2llczJfbGVuZ3RoPC0gcHJvamVjdHMgJT4lIAogIHNlbGVjdChMZW5ndGhfbnVtZXJpY195ZWFycywgYERvZXMgeW91ciBpbnN0aXR1dGlvbiBvZiBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4sIEZBSVIgcHJpbmNpcGxlcywgZGF0YSBzdG9yYWdlLCBkYXRhIHNoYXJpbmcsIE9wZW4gU2NpZW5jZSk/YCkgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9mIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiwgRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT9gKQogIApwb2xpY2llczJfbGVuZ3RoJHBvbGljeV9zaW1wbGUgPC0gaWZlbHNlKGdyZXBsKCJOZWl0aGVyIG91ciBncmFudCBmdW5kaW5nKiIsIHBvbGljaWVzMl9sZW5ndGgkcG9saWN5KSwgIlZvbHVudGFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJQb2xpY2llcyBhcmUgb24gdGhlIHdheSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCp8V2UgZG9uJ3Qgd29yayBmb3IgYW55IGluc3RpdHV0aW9uKiIsIHBvbGljaWVzMl9sZW5ndGgkcG9saWN5KSwgIk5vIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJUaGUgRnJlbmNoIE5hdGlvbmFsIENlbnRyZSBmb3IgU2NpZW50aWZpYyBSZXNlYXJjaCBzdHJvbmdseSBlbmNvdXJhZ2VzIGl0cyBtZW1iZXJzIHRvIGNvbXBseSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCoiLCBwb2xpY2llczJfbGVuZ3RoJHBvbGljeSksICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljaWVzMl9sZW5ndGgkcG9saWN5KSkpCgpwb2xpY2llczJfbGVuZ3RoJExlbmd0aF9udW1lcmljX3llYXJzIDwtIGFzLm51bWVyaWMocG9saWNpZXMyX2xlbmd0aCRMZW5ndGhfbnVtZXJpY195ZWFycykKCnBvbGljaWVzMl9sZW5ndGhfbWVhbjwtIHBvbGljaWVzMl9sZW5ndGggJT4lIGdyb3VwX2J5KHBvbGljeV9zaW1wbGUpICU+JSAKICBzdW1tYXJpc2VfYXQodmFycyhMZW5ndGhfbnVtZXJpY195ZWFycyksIGxpc3QoYXZlcmFnZV9kdXJhdGlvbl95ZWFycyA9IG1lYW4pKQpgYGAKCmBgYHtyfQpwb2xpY2llczJfbGVuZ3RoX21lYW4KYGBgCgoqKkFkZGl0aW9uYWwgaW52ZXN0aWdhdGlvbioqOgoKVGhlIG1haW4gZmFjdG9yIGluZmx1ZW5jaW5nIHRoZSBuZWVkIHRvIGNvbXBseSB3aXRoIGluc3RpdHV0aW9uYWwgcHJpbmNpcGxlcyBzZWVtcyB0byBiZSB0aGUgYWdlIG9mIHRoZSBwcm9qZWN0IC0gZm9yIHByb2plY3RzIGNyZWF0ZWQgaW4gcmVjZW50IHllYXJzIChlLmcuIHNpbmNlIDIwMTUpLCB3ZSB3b3VsZCBleHBlY3QgRkFJUiBkYXRhIHBvbGljaWVzIHRvIGJlIG9uZSBvZiBjb25kaXRpb25zIGZvciBzZWN1cmluZyBmdW5kaW5nLiBJbiBvcmRlciB0byB2ZXJpZnkgdGhpcyBoeXBvdGhlc2lzLCB3ZSBjb2xsZWN0ZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYW51YWxseSBmcm9tIHByb2plY3Qgd2Vic2l0ZXMgYW5kIHB1Ymxpc2hlZCBtYXRlcmlhbHMsIHN1Y2ggYXMgdGhlIG9mZmljaWFsIHByb2plY3Qgc3RhcnQtZGF0ZSwgdGhlIGNvdW50cnkgb2Ygb3JpZ2luIG9mIGEgZ2l2ZW4gcHJvamVjdCwgaW5kaWNhdGlvbnMgb2YgZXhpc3RpbmcgZnVuZGluZyBhbmQgcHJpbWFyeSBmb2N1cyBvZiBhIGdpdmVuIHByb2plY3QgKHRleHQgcHVibGljYXRpb24gb3IgbWV0YWRhdGEgY29sbGVjdGlvbikuIFRoZSBhbm9ueW1pc2VkIGRhdGEgaXMgc2F2ZWQgYXMgYSBUU1YgaW4gdGhlIHNhbWUgR2l0SHViIHJlcG9zaXRvcnkgYXMgYC9kYXRhLzAyX3Njb3Bpbmdfc3VydmV5X2Fub255bWlzZWRfUG9zdFN1cnZleS50c3ZgLgoKYGBge3IgZGF0YV9wb3N0c3VydmV5LCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQojIGxvYWRpbmcgZGF0YSBmcm9tIFRTViBmaWxlCnByb2plY3RzX3Bvc3Q8LSByZWFkX3RzdigiLi4vZGF0YS8wMl9zY29waW5nX3N1cnZleV9hbm9ueW1pc2VkX1Bvc3RTdXJ2ZXkudHN2IikKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBtZXJnaW5nIHdpdGggdGhlIG9yaWdpbmFsIGRhdGFzZXQKcHJvamVjdHNfY29tYiA8LSBtZXJnZSh4PXByb2plY3RzLCB5PXByb2plY3RzX3Bvc3QsIGJ5PSJJRF9hbm9uIikKCnByb2plY3RzX2NvbWIkWWVhclN0YXJ0ZWQgPC0gYXMubnVtZXJpYyhwcm9qZWN0c19jb21iJFllYXJTdGFydGVkKQoKI3Byb2Nlc3NpbmcKcG9saWN5X3llYXJfc3RhcnRlZDwtIHByb2plY3RzX2NvbWIgJT4lIAogIHNlbGVjdChZZWFyU3RhcnRlZCwgYERvZXMgeW91ciBpbnN0aXR1dGlvbiBvZiBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4sIEZBSVIgcHJpbmNpcGxlcywgZGF0YSBzdG9yYWdlLCBkYXRhIHNoYXJpbmcsIE9wZW4gU2NpZW5jZSk/YCkgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9mIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiwgRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT9gKQogIApwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeV9zaW1wbGUgPC0gaWZlbHNlKGdyZXBsKCJOZWl0aGVyIG91ciBncmFudCBmdW5kaW5nKiIsIHBvbGljeV95ZWFyX3N0YXJ0ZWQkcG9saWN5KSwgIlZvbHVudGFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJQb2xpY2llcyBhcmUgb24gdGhlIHdheSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCp8V2UgZG9uJ3Qgd29yayBmb3IgYW55IGluc3RpdHV0aW9uKiIsIHBvbGljeV95ZWFyX3N0YXJ0ZWQkcG9saWN5KSwgIk5vIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJUaGUgRnJlbmNoIE5hdGlvbmFsIENlbnRyZSBmb3IgU2NpZW50aWZpYyBSZXNlYXJjaCBzdHJvbmdseSBlbmNvdXJhZ2VzIGl0cyBtZW1iZXJzIHRvIGNvbXBseSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCoiLCBwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeSksICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeV95ZWFyX3N0YXJ0ZWQkcG9saWN5KSkpCgpgYGAKCmBgYHtyIGZpZzIsIGZpZy5hbGlnbj0iY2VudGVyIiwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuY2FwPSJUaGUgY2hhcnQgc2hvd3MgdGhlIGV4aXN0ZW5jZSBvZiBpbnN0aXR1dGlvbmFsIGRhdGEgcG9saWN5IG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgYW5kIGl0cyBkZXZlbG9wbWVudCBvdmVyIHRpbWUuIn0KIyMgZ2dwbG90IHBvbGljeSBieSB5ZWFycyBzdGFydGVkCnBvbGljeV95ZWFyX3N0YXJ0ZWQgJT4lIAogIGZpbHRlcihZZWFyU3RhcnRlZD4xOTUwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PVllYXJTdGFydGVkLCB5PXBvbGljeV9zaW1wbGUsIGNvbG9yPXBvbGljeV9zaW1wbGUpKSsKICBnZW9tX3Zpb2xpbigpICsKICAjZ2VvbV9wb2ludChhZXMoeD1ZZWFyU3RhcnRlZCwgeT1wb2xpY3lfc2ltcGxlKSkKICBnZW9tX2RlbnNpdHkoKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjAxNSwgbGluZXR5cGU9MiwgY29sb3VyPSJicm93biIpICsKICBnZ3RpdGxlKCJSZXF1aXJlbWVudCBvZiBpbnN0aXR1dGlvbmFsIGRhdGEgcG9saWN5IG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgc2luY2UgMTk5MCIpICsKICB4bGFiKCJTdGFydCB5ZWFyIG9mIGEgcHJvamVjdCIpICsgeWxhYigiRXhpc3RlbmNlIG9mIGluc3RpdHV0aW9uYWwgZGF0YSBwb2xpY3kiKSArCiAgI2Nvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgI2Nvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1KSkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKT3VyIGV4cGVjdGF0aW9ucyBvbiBkYXRhIHBvbGljaWVzIGJlaW5nIHByb2dyZXNzaXZlbHkgaW1wbGVtZW50ZWQgb3ZlciB0aGUgbGFzdCBzZXZlbiB5ZWFycyB3ZXJlIGNvbmZpcm1lZCBvbmx5IHBhcnRpYWxseS4gQXMgKipGaWd1cmUgMSoqIGFib3ZlIGRlbW9uc3RyYXRlcywgdGhlIG51bWJlciBvZiBwcm9qZWN0cyB0aGF0IGluZGljYXRlZCBhbiBleGlzdGluZyBpbnN0aXR1dGlvbmFsIGRhdGEgcG9saWN5IGdyb3dzIHN0ZWFkaWx5IGZyb20gMjAxNSAoaW5kaWNhdGVkIGJ5IGJyb3duIGRhc2hlZCB2ZXJ0aWNhbCBsaW5lKS4gT24gdGhlIGNvbnRyYXJ5LCB0aGUgbnVtYmVyIG9mIHByb2plY3RzIHRoYXQgaW5kaWNhdGVkIG5vIGV4aXN0aW5nIGRhdGEgcG9saWN5IGRlY3JlYXNlcywgYnV0IG9ubHkgcmVsYXRpdmVseSBzbG93bHkuIFRoZSBwcm9qZWN0cyByZXNwb25kZWQgYE4vQWAgYXJlIHRob3NlIHdoaWNoIGNvbnNpZGVyIHRoZW1zZWx2ZXMgaW4gRmVicnVhcnkgMjAyMiBhcyBgY2xvc2VkYC4KCmBgYHtyLCBlY2hvPUZBTFNFfQojcHJvY2Vzc2luZwpwb2xpY3lfY291bnRyeTwtIHByb2plY3RzX2NvbWIgJT4lIAogIHNlbGVjdChZZWFyU3RhcnRlZCwgYERvZXMgeW91ciBpbnN0aXR1dGlvbiBvZiBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4sIEZBSVIgcHJpbmNpcGxlcywgZGF0YSBzdG9yYWdlLCBkYXRhIHNoYXJpbmcsIE9wZW4gU2NpZW5jZSk/YCwgQ291bnRyeSkgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9mIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiwgRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT9gKQogIApwb2xpY3lfY291bnRyeSRwb2xpY3lfc2ltcGxlIDwtIGlmZWxzZShncmVwbCgiTmVpdGhlciBvdXIgZ3JhbnQgZnVuZGluZyoiLCBwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeSksICJWb2x1bnRhcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiUG9saWNpZXMgYXJlIG9uIHRoZSB3YXkqfE5vdCB3aXRoIGFuIG9mZmljaWFsIHJlcXVlc3QqfFdlIGRvbid0IHdvcmsgZm9yIGFueSBpbnN0aXR1dGlvbioiLCBwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeSksICJObyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiVGhlIEZyZW5jaCBOYXRpb25hbCBDZW50cmUgZm9yIFNjaWVudGlmaWMgUmVzZWFyY2ggc3Ryb25nbHkgZW5jb3VyYWdlcyBpdHMgbWVtYmVycyB0byBjb21wbHkqfE5vdCB3aXRoIGFuIG9mZmljaWFsIHJlcXVlc3QqIiwgcG9saWN5X3llYXJfc3RhcnRlZCRwb2xpY3kpLCAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5X3llYXJfc3RhcnRlZCRwb2xpY3kpKSkKYGBgCgpgYGB7ciwgZmlnLmFsaWduPSJjZW50ZXIiLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5jYXA9IlRoZSBjaGFydCBzaG93cyB0aGUgcmVxdWlyZW1lbnQgb2YgaW5zdGl0dXRpb25hbCBkYXRhIHBvbGljeSBvZiBub24tcGFydG5lcmVkIHByb2plY3RzIGJ5IGNvdW50cnkuIn0KIyMgZ2dwbG90IHBvbGljeSBieSBjb3VudHJpZXMKcG9saWN5X2NvdW50cnkgJT4lIAogIGZpbHRlcihZZWFyU3RhcnRlZD4xOTUwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUNvdW50cnksIHk9cG9saWN5X3NpbXBsZSwgY29sb3I9cG9saWN5X3NpbXBsZSkpKwogIGdlb21fcG9pbnQoYWVzKHg9Q291bnRyeSwgeT1wb2xpY3lfc2ltcGxlKSwgc2l6ZT00KSArCiAgZ2d0aXRsZSgiUmVxdWlyZW1lbnQgb2YgaW5zdGl0dXRpb25hbCBkYXRhIHBvbGljeSBvZiBub24tcGFydG5lcmVkIHByb2plY3RzIGJ5IGNvdW50cnkiKSArCiAgeGxhYigiQ291bnRyeSIpICsgeWxhYigiRXhpc3RlbmNlIG9mIGluc3RpdHV0aW9uYWwgZGF0YSBwb2xpY3kiKSArCiAgI2Nvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1KSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKXG5ld3BhZ2UKCioqRmlndXJlIDIqKiBhYm92ZSBzaG93cyBjbGVhciBnZW9ncmFwaGljIGRpZmZlcmVuY2VzIGluIGltcGxlbWVudGF0aW9uIG9mIGRhdGEgcG9saWNpZXMgYmFzZWQgb24gdGhlIG1haW4gY291bnRyeSB3aGVyZSB0aGUgcHJvamVjdCBpcyBiYXNlZC4gRnJhbmNlLCBHZXJtYW55LCBhbmQgSXRhbHkgYXJlIGxpc3RlZCBhcyBjb3VudHJpZXMgd2hlcmUgZGF0YSBwb2xpY2llcyBhcmUgcmVxdWlyZWQsIHlldCBzb21lIHByb2plY3RzIGluIEdlcm1hbnkgYW5kIEl0YWx5IGFuc3dlcmVkIHRoYXQgbm8gZGF0YSBwb2xpY2llcyBhcmUgcmVxdWlyZWQuIFRodXMgdGhlIHByYWN0aWNhbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXRhIHBvbGljaWVzIG1heSBkZXBlbmQgb24gdGhlIHBhcnRpY3VsYXIgZnVuZGluZyBhZ2VuY3kgb3IgaW5zdGl0dXRpb24sIHJhdGhlciB0aGFuIG9uIG5hdGlvbi13aWRlIHBvbGljaWVzLiBXZSBhcmUgd2VsbCBhd2FyZSB0aGF0IGRhdGEgcG9saWNpZXMgbWlnaHQgYmUgZGlmZmVyZW50IGZvciBwcm9qZWN0cyBmdW5kZWQgZnJvbSBvdGhlciBzb3VyY2VzIHRoYW4gbmF0aW9uYWwgb3IgRXVyb3BlYW4gcmVzZWFyY2ggY291bmNpbCBzY2hlbWVzLCB3aGVyZSBzdWNoIHJlcXVpcmVtZW50cyBtYXkgbm90IGJlIGNvbXB1bHNvcnkuIE91ciByZXN1bHRzIGFyZSBvbmx5IHByZWxpbWluYXJ5IGFuZCBiYXNlZCBvbiBhIHZlcnkgc21hbGwgc2FtcGxlIGFuZCBuZWVkIHRvIGJlIGNvbmZpcm1lZCBieSBmdXJ0aGVyIGFuZCBtb3JlIGRldGFpbGVkIGludmVzdGlnYXRpb24uIAoKIyMgT3BlbiBTY2llbmNlIFByYWN0aWNlCgoqKlF1ZXN0aW9uKio6ICpBcmUgeW91IGZhbWlsaWFyIHdpdGggdGhlIEZBSVIgZGF0YSBwcmluY2lwbGVzPyoKCmBgYHtyfQpmYWlyPC0gcHJvamVjdHMgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgQXJlIHlvdSBmYW1pbGlhciB3aXRoIHRoZSBGQUlSIGRhdGEgcHJpbmNpcGxlcz9gKSAlPiUKICBjb3VudChwb2xpY3ksIHNvcnQ9VCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKZmFpcgpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbWFqb3JpdHkgb2YgcHJvamVjdHMgKGByIGZhaXIkcmF0aW9bZmFpciRwb2xpY3kgPT0gIlllcyJdYCUpIGlzIGZhbWlsaWFyIHdpdGggRkFJUiBkYXRhIHBvbGljeSwgaG93ZXZlciwgYHIgZmFpciRyYXRpb1tmYWlyJHBvbGljeSA9PSAiVmFndWVseSJdYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyBhcmUgb25seSB2YWd1ZWx5IGZhbWlsaWFyIGFuZCB3b3VsZCBiZW5lZml0IGZyb20gY2xlYXIgZ3VpZGVsaW5lcyBjdXN0b21pc2VkIGZvciB0aGUgZXBpZ3JhcGhpYyBjb21tdW5pdHkuIE9ubHkgYHIgZmFpciRyYXRpb1tmYWlyJHBvbGljeSA9PSAiTm8iXWAlIG9mIHByb2plY3RzIGFyZSBub3QgZmFtaWxpYXIgd2l0aCBGQUlSIGRhdGEgcHJpbmNpcGxlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqU3RhbmRhcmRpemVkIHRlcm1pbm9sb2dpZXM6IFRoZSBwcm9qZWN0IHVzZXMgdGhlIGZvbGxvd2luZyBzeXN0ZW1zOioKCmBgYHtyfQpzdGFuZF90ZXJtMiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocHJvamVjdHMkYFN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgIiwgIikpKQpjb2xuYW1lcyhzdGFuZF90ZXJtMikgPC0gYygic3RhbmRhcmRfdGVybWlub2xvZ2llcyIpCgoKc3RhbmRfdGVybV9yYXRpbzI8LSBzdGFuZF90ZXJtMiAlPiUgCiAgY291bnQoc3RhbmRhcmRfdGVybWlub2xvZ2llcywgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKCnN0YW5kX3Rlcm1fcmF0aW8yCmBgYAoKKipDb21tZW50YXJ5Kio6IGByIHN0YW5kX3Rlcm1fcmF0aW8yJHJhdGlvW3N0YW5kX3Rlcm1fcmF0aW8yJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0iV2UgZG9uJ3QgdXNlIGFueSBzdGFuZGFyZGl6ZWQgbGlzdHMiXWAlIG9mIHByb2plY3RzIGRvIG5vdCB1c2UgYW55IHN0YW5kYXJkaXplZCBsaXN0cyBvciB2b2NhYnVsYXJpZXMuIFRob3NlIHByb2plY3RzIGFyZSBtb3N0IGxpa2VseSB0aG9zZSB3aG8gZm9jdXMgb24gM0QgdmlzdWFsaXNhdGlvbiBvZiBpbnNjcmlwdGlvbnMgb3IgcHVibGljYXRpb24gb2YgbWV0YWRhdGEsIHJhdGhlciB0aGFuIHB1YmxpY2F0aW9uIG9mIHRleHQgZWRpdGlvbnMuIGByIHN0YW5kX3Rlcm1fcmF0aW8yJHJhdGlvW3N0YW5kX3Rlcm1fcmF0aW8yJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0iSW50ZXJuYWwgYXV0aG9yaXR5IGxpc3RzIl1gJSBvZiBwcm9qZWN0cyB1c2UgdGhlaXIgb3duIGludGVybmFsIGF1dGhvcml0eSBsaXN0cy4gRUFHTEUgdm9jYWJ1bGFyaWVzIGluIHRoZWlyIG9yaWdpbmFsIGZvcm0gYXJlIHVzZWQgYnkgYHIgc3RhbmRfdGVybV9yYXRpbzIkcmF0aW9bc3RhbmRfdGVybV9yYXRpbzIkc3RhbmRhcmRfdGVybWlub2xvZ2llcyA9PSJFQUdMRSB2b2NhYnVsYXJpZXMgYXMgcHJvdmlkZWQgYXQgaHR0cHM6Ly93d3cuZWFnbGUtbmV0d29yay5ldS9yZXNvdXJjZXMvdm9jYWJ1bGFyaWVzLyJdYCUgb2YgcHJvamVjdHMsIGFuZCBpbiBhbiBlZGl0ZWQgdmVyc2lvbiBieSBgciBzdGFuZF90ZXJtX3JhdGlvMiRyYXRpb1tzdGFuZF90ZXJtX3JhdGlvMiRzdGFuZGFyZF90ZXJtaW5vbG9naWVzID09Ik93biB2ZXJzaW9uIG9mIEVBR0xFIHZvY2FidWxhcmllcyAoZWRpdGVkIGZvciBvdXIgcHJvamVjdCkiXWAlIG9mIHByb2plY3RzLiBTZXZlcmFsIHByb2plY3RzIHRoYXQgZm9jdXMgb24gbGFuZ3VhZ2VzIG90aGVyIHRoYW4gR3JlZWsgYW5kIExhdGluIGhhdmUgY3JlYXRlZCB0aGVpciBvd24gc3lzdGVtcywgc29tZXRpbWVzIHdvcmtpbmcgZnJvbSBleGlzdGluZyB2b2NhYnVsYXJpZXMsIGJ1dCBhbHNvIGJ1aWxkaW5nIHRoZXNhdXJpLCBlLmcuIHRoZSBjcmVhdGlvbiBvZiBhIHRoZXNhdXJ1cyBzdWNoIGFzIHRoZSBPcGVuVGhlc28gdG9vbCAoRXBpVm9jKSA8aHR0cHM6Ly90aGVzYXVydXMubW9tLmZyL29wZW50aGVzby8/aWR0PXRoNjE+IGFsaWduZWQgd2l0aCBleGlzdGluZyB2b2NhYnVsYXJpZXMgb3IgdXNpbmcgdGVybXMgb2YgdGhlIGNvbW11bml0eS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqQXJlIHlvdSB3aWxsaW5nIHRvIHNoYXJlIHRoZSBzdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llcyB1c2VkIGluIHlvdXIgcHJvamVjdCB3aXRoIHVzIChlLmcuIHR5cGUgb2YgaW5zY3JpcHRpb24gdm9jYWJ1bGFyaWVzLCB0eXBlIG9mIG1hdGVyaWFsIGV0Yy4pKgoKYGBge3J9CnBvbGljeV9zaGFyZTwtIHByb2plY3RzICU+JSAKICBtdXRhdGUocG9saWN5X3NoYXJlID0gYEFyZSB5b3Ugd2lsbGluZyB0byBzaGFyZSB0aGUgc3RhbmRhcmRpemVkIHRlcm1pbm9sb2dpZXMgdXNlZCBpbiB5b3VyIHByb2plY3Qgd2l0aCB1cyAoZS5nLiB0eXBlIG9mIGluc2NyaXB0aW9uIHZvY2FidWxhcmllcywgdHlwZSBvZiBtYXRlcmlhbCBldGMuKWApICU+JSAKICBjb3VudChwb2xpY3lfc2hhcmUsIHNvcnQ9VCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKICAKcG9saWN5X3NoYXJlCmBgYAoKKipDb21tZW50YXJ5Kio6IFRoZSB2YXN0IG1ham9yaXR5IG9mIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMgKGByIHBvbGljeV9zaGFyZSRyYXRpb1twb2xpY3lfc2hhcmUkcG9saWN5X3NoYXJlID09ICJZZXMiXWAlKSBpcyB3aWxsaW5nIHRvIHNoYXJlIGFueSBzdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llcyB1c2VkIGluIHRoZWlyIHByb2plY3QsIHN1Y2ggYXMgdGVybWlub2xvZ2llcyBjb3ZlcmluZyB0aGUgdHlwZSBvZiBpbnNjcmlwdGlvbiwgdGhlIHR5cGUgb2YgbWF0ZXJpYWwgZXRjLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpMaW5rZWQgT3BlbiBEYXRhc2V0czogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXM6KgoKYGBge3J9CmxvZDIgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3RyX3NwbGl0KHByb2plY3RzJGBMaW5rZWQgT3BlbiBEYXRhOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgIiwgIikpKQpjb2xuYW1lcyhsb2QyKSA8LSBjKCJsaW5rZWRfZGF0YSIpCgoKbG9kX3JhdGlvMjwtIGxvZDIgJT4lIAogIGNvdW50KGxpbmtlZF9kYXRhLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQobi8obnJvdyhwcm9qZWN0cykvMTAwKSkpCgpsb2RfcmF0aW8yCmBgYAoKKipDb21tZW50YXJ5Kio6IFBsZWlhZGVzIGlzIHRoZSBtb3N0IHBvcHVsYXIgTE9EIGRhdGFzZXQsIGJlaW5nIHVzZWQgaW4gYHIgbG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJQbGVpYWRlcyJdYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMsIGFsb25nc2lkZSBUcmlzbWVnaXN0b3MgYWxzbyBpbiBgciBsb2RfcmF0aW8yJHJhdGlvW2xvZF9yYXRpbzIkbGlua2VkX2RhdGEgPT0gIlRyaXNtZWdpc3RvcyJdYCUuIEVBR0xFIHZvY2FidWxhcmllcyBhcmUgcmVwcmVzZW50ZWQgaW4gYHIgbG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJFQUdMRSB2b2NhYnVsYXJpZXMiXWAlIG9mIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMsIHdoaWxlIGNvbWJpbmVkIHByb3NvcG9ncmFwaGljIGRhdGFzZXRzIChMR1BOK1BJUikgZmVhdHVyZSBpbiBgciBzdW0obG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJMR1BOIl0rbG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJQSVIiXSlgJSBvZiBwcm9qZWN0cy4gT25seSBgciBsb2RfcmF0aW8yJHJhdGlvW2xvZF9yYXRpbzIkbGlua2VkX2RhdGEgPT0gIk90aGVyOiBOb25lIl1gJSBvZiBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIGRvIG5vdCB1c2UgYW55IExPRC4KCmBgYHtyfQoKbG9kcDI8LSBwcm9qZWN0cyRgTGlua2VkIE9wZW4gRGF0YTogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXMgKGNoZWNrIGFsbCB0aGF0IGFwcGx5KWAKCmdlb2dyYXBoaWMyPC0gcm91bmQobnJvdyhhcy5kYXRhLmZyYW1lKGxvZHAyKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChsb2RwMiwgIlRyaXNtZWdpc3Rvc3xQbGVpYWRlc3xPdGhlcjogaURhaUdhemV0dGVlcnxPdGhlcjogR2VvbmFtZXMiKSkpLyhucm93KHByb2plY3RzKS8xMDApKQoKcHJvc29wb2dyYXBoaWMyPC0gcm91bmQobnJvdyhhcy5kYXRhLmZyYW1lKGxvZHAyKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChsb2RwMiwgIkxHUE58UElSfE90aGVyOiBQTFJFIikpKS8obnJvdyhwcm9qZWN0cykvMTAwKSkKCmNocm9ub2xvZ2ljMjwtIHJvdW5kKG5yb3coYXMuZGF0YS5mcmFtZShsb2RwMikgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QobG9kcDIsICJQZXJpb2QuT3xPdGhlcjogR09ET1Q6IGh0dHBzOi8vZ29kb3QuZGF0ZS9ob21lIikpKS8obnJvdyhwcm9qZWN0cykvMTAwKSkKYGBgCgpUaGUgZ3JvdXAgb2YgTE9EIHJlc291cmNlcyBmb2N1c2luZyBvbiAqKmdlb2dyYXBoaWMgZGF0YSoqIChlLmcuIFBsZWlhZGVzLCBpRGFpIEdhemV0dGVlciwgR2VvbmFtZXMsIFRyaXNtZWdpc3Rvcykgc2VlbXMgdG8gYmUgc3Ryb25nbHkgcmVwcmVzZW50ZWQgYW1vbmdzdCBwYXJ0aWNpcGF0aW5nIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgKGByIGdlb2dyYXBoaWMyYCAlIHVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlbSksIHN1Z2dlc3RpbmcgdGhhdCBnZW9ncmFwaGljIExPRCBhcmUgd2VsbCBlc3RhYmxpc2hlZCBmb3IgdGhlIHN0dWR5IG9mIHRoZSBhbmNpZW50IHdvcmxkLgoKKipQcm9zb3BvZ3JhcGhpYyBkYXRhKiosIHJlcHJlc2VudGVkIGJ5IExHUE4sIFBJUiwgYW5kIFBMUkUgYXJlIHVzZWQgYnkgYHIgcHJvc29wb2dyYXBoaWMyYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgbm9uLXBhcnRuZXJlZCBwcm9qZWN0cy4KCioqQ2hyb25vbG9naWNhbCBkYXRhKiosIHJlcHJlc2VudGVkIGJ5IFBlcmlvZC5PIGFuZCBHT0RPVCBhcmUgdXNlZCBieSBgciBjaHJvbm9sb2dpYzJgICUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgbm9uLXBhcnRuZXJlZCBwcm9qZWN0cy4KCkl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IG5vdCBldmVyeSBjYXRlZ29yeSBsaXN0ZWQgYW1vbmdzdCB0aGUgcmVzcG9uc2VzIGlzIGEgdHJ1ZSBsaW5rZWQgb3BlbiBkYXRhc2V0LiBUaGUgc3VydmV5IHJlc3BvbnNlcyBzdWdnZXN0IHRoZXJlIGlzIGEgY29uc2lkZXJhYmxlIHJvb20gZm9yIGltcHJvdmVtZW50IGFuZCBwb3RlbnRpYWxseSBncmVhdCBiZW5lZml0IGluIGNyZWF0aW5nIGFuZCBmdXJ0aGVyIGltcHJvdmluZyBMT0QgZm9yIHRoZSBzdHVkeSBvZiB0aGUgYW5jaWVudCB3b3JsZC4KCiMgRnV0dXJlIG5lZWRzIG9mIGRpZ2l0YWwgZXBpZ3JhcGh5CgpUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSB3aXNoZXMgb2YgYWxsIHBhcnRpY2lwYXRpbmcgZGlnaXRhbCBlcGlncmFwaHkgcHJvamVjdHMuIFRoZSByZXNwb25zZXMgd2VyZSBhbm9ueW1pc2VkIHNvIG5vIGluZGl2aWR1YWwgb3IgcHJvamVjdCBjYW4gYmUgaWRlbnRpZmllZCBidXQgYXJlIG90aGVyd2lzZSBwcmVzZW50ZWQgYXMgc3VibWl0dGVkIGluIHRoZSBzdXJ2ZXkuCgojIyBQYXJ0bmVyIHByb2plY3RzCgoqKlF1ZXN0aW9uKio6ICpPdXIgcHJvamVjdCB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIHdpdGhpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczoqCgpgYGB7cn0KbG9kX2Z1dHVyZSA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYFNlbGVjdCBhbGwgb3B0aW9ucyB5b3VyIHByb2plY3QgbGlrZSB0byBiZSBhYmxlIHRvIHVzZSB3aXRoaW4gdGhlIG5leHQgdGhyZWUgeWVhcnM6YCwgIiwgIikpKQpjb2xuYW1lcyhsb2RfZnV0dXJlKSA8LSBjKCJsb2RfZiIpCgoKbG9kX2ZfcmF0aW88LSBsb2RfZnV0dXJlICU+JSAKICBjb3VudChsb2RfZiwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKG5yb3cocGFydG5lcnMpLzEwMCkpKQpsb2RfZl9yYXRpbwpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbW9zdCBwb3B1bGFyIGlzIHRoZSBvcHRpb24gYEJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIGFsbCBlcGlncmFwaGljIHB1YmxpY2F0aW9ucyB3aXRoIHN0YWJsZSBVUkkgKGUuZy4gWmVub24pYCwgcmVwcmVzZW50aW5nIHRoZSB3aXNoZXMgb2YgYHIgbG9kX2ZfcmF0aW8kcmF0aW9bbG9kX2ZfcmF0aW8kbG9kX2Y9PSJCaWJsaW9ncmFwaGljYWwgcmVmZXJlbmNlcyB0byBhbGwgZXBpZ3JhcGhpYyBwdWJsaWNhdGlvbnMgd2l0aCBzdGFibGUgVVJJIChlLmcuIFplbm9uKSJdYCUgb2YgYWxsIHBhcnRuZXIgcHJvamVjdHMuCgpUaGUgZ3JlYXQgaW50ZXJlc3QgaW4gcHJvc29wb2dyYXBoaWMgTE9EIGZvciBlcGlncmFwaHkgaXMgc3VwcG9ydGVkIGJ5IGByIGxvZF9mX3JhdGlvJHJhdGlvW2xvZF9mX3JhdGlvJGxvZF9mPT0iUm9tYW4gUHJvc29wb2dyYXBoaWNhbCBkYXRhIHdpdGggc3RhYmxlIFVSSXMiXWAlIG9mIHBhcnRuZXIgcHJvamVjdHMgZm9yIHRoZSBSb21hbiB3b3JsZCBhbmQgYHIgbG9kX2ZfcmF0aW8kcmF0aW9bbG9kX2ZfcmF0aW8kbG9kX2Y9PSJHcmVlayBPbm9tYXN0aWMgZGF0YSB3aXRoIHN0YWJsZSBVUklzIChlLmcuIExHUE4gd2l0aCBzdGFibGUgaWRlbnRpZmllcnMpIl1gJSBvZiBwcm9qZWN0cyBmb3IgdGhlIEdyZWVrIHdvcmxkIHJlc3BlY3RpdmVseS4KClRoZSBgaW1wcm92ZWQgRUFHTEUgdm9jYWJ1bGFyaWVzYCBhcmUgd2lzaGVkIGZvciBieSBgciBsb2RfZl9yYXRpbyRyYXRpb1tsb2RfZl9yYXRpbyRsb2RfZj09IkVBR0xFIHZvY2FidWxhcmllcyAocmV2aXNlZCBhbmQgZXh0ZW5kZWQgd2l0aCBjbGVhciBzdHJ1Y3R1cmUgKyBlbGltaW5hdGVkIGR1cGxpY2F0ZXMgKyBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0KSJdYCUgb2YgcGFydG5lciBwcm9qZWN0cy4KClRoZSBgZG9tYWluLXNwZWNpZmljIHJlcG9zaXRvcnkgZm9yIGVwaWdyYXBoaWMgZGF0YWAgKGRpc2N1c3NlZCBhbHNvIHVuZGVyIGBPdGhlcmAgcmVzcG9uc2VzKSBvciB0aGUgYG9wZW4gYW5kIGFjY2Vzc2libGUgUkRGIFRyaXBsZXN0b3JlYCBkbyBub3Qgc2VlbSB0byBiZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBvZiBwYXJ0aWNpcGF0aW5nIHByb2plY3RzLCBidXQgYXJlIHN0aWxsIHJlbGF0aXZlbHkgcG9wdWxhciBhcyBgciBsb2RfZl9yYXRpbyRyYXRpb1tsb2RfZl9yYXRpbyRsb2RfZj09Ik9uZSBkb21haW4gc3BlY2lmaWMgcmVwb3NpdG9yeSBmb3IgZXBpZ3JhcGhpYyBkYXRhIl1gJSBvZiByZXNwb25kYW50cyB3aXNoZXMgZm9yIG9uZSBvZiB0aGUgdHdvLiBPbmUgcGFydGljaXBhdGluZyBwcm9qZWN0IHdpc2hlcyBzcGVjaWZpY2FsbHkgZm9yIHRoZSBmb2xsb3dpbmc6IGByIGxvZF9mX3JhdGlvJGxvZF9mWzddYC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqUG90ZW50aWFsIGlkZWFzIHRoYXQgb3VyIHByb2plY3Qgd291bGQgYmVuZWZpdCBmcm9tOioKCmBgYHtyLCBsaW5ld2lkdGg9OTB9CmxvZF9pZGVhcyA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYFNlbGVjdCBhbGwgaXRlbXMgeW91ciBwcm9qZWN0IHdvdWxkIGJlbmVmaXQgZnJvbSBpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczpgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZF9pZGVhcykgPC0gYygibG9kX2kiKQoKCmxvZF9pX3JhdGlvPC0gbG9kX2lkZWFzICU+JSAKICBjb3VudChsb2RfaSwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpb19hbGxfcHJvaiA9IHJvdW5kKG4vKG5yb3cocGFydG5lcnMpLzEwMCkpKQoKbG9kX2lfcmF0aW8KYGBgCgoqKkNvbW1lbnRhcnkqKjogYHIgbG9kX2lfcmF0aW8kcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8kbG9kX2kgPT0gIlNldCBvZiBndWlkZWxpbmVzIGZvciBGQUlSIGFuZCBMaW5rZWQgT3BlbiBEYXRhIGluIGVwaWdyYXBoeSJdWzFdYCUgb2YgYWxsIHByb2plY3RzIGNvbnNpZGVyIHRoYXQgdGhleSB3b3VsZCBiZW5lZml0IGZyb20gYEEgc2V0IG9mIGd1aWRlbGluZXMgZm9yIEZBSVIgYW5kIExpbmtlZCBPcGVuIERhdGEgaW4gZXBpZ3JhcGh5YC4gVGhlcmUgaXMgYSBnZW5lcmFsIGludGVyZXN0IGluIHByYWN0aWNhbCBleGFtcGxlcyBhbmQgd29ya3Nob3Aocykgb24gaG93IHRvIHVzZSBMT0QgYW5kIEZBSVIgUHJpbmNpcGxlcyBpbiBlcGlncmFwaHksIGFzIHdlbGwgYXMgcmVzb3VyY2VzIGZvciBxdWFudGl0YXRpdmUgYW5hbHlzaXMgb2YgZGF0YSBpbiBlcGlncmFwaHkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkFkZGl0aW9uYWwgZGlnaXRhbCBuZWVkcyoKCmBgYHtyLCBsaW5ld2lkdGg9OTB9CnVuaXF1ZShuYS5vbWl0KHBhcnRuZXJzJGBZb3VyIHBlcnNvbmFsIHdpc2ggbGlzdC4gUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHBvdGVudGlhbCB0YXNrcyBhbmQgaXNzdWVzIHRoZSBGQUlSIEVwaWdyYXBoeSBjYW4gaGVscCB5b3VyIHByb2plY3Qgd2l0aGluIHRoZSBuZXh0IHRocmVlIHllYXJzIChhbmQgYmV5b25kKWApKQpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBhZGRpdGlvbmFsIG5lZWRzIG9mIHBhcnRuZXIgcHJvamVjdHMuIFBhcnRuZXIgcHJvamVjdHMgd291bGQgbGlrZSB0byBzZWUgYSBwbGF0Zm9ybSBsaW5raW5nIGVwaWdyYXBoaWMgZGF0YSBmcm9tIG11bHRpcGxlIHNvdXJjZXMsIGluY2x1ZGluZyBhIHN0YWJsZSByZWZlcmVuY2UgcG9pbnQgb3IgYW4gQVBJIGZvciBpbXByb3ZlZCBlcGlncmFwaGljIHZvY2FidWxhcmllcyAoaW4gb3RoZXIgd29yZHMsIHRoZSBzb3J0IG9mIHJlc291cmNlIHdoaWNoIGFncmVlZCB2b2NhYnVsYXJpZXMgYW5kIGFuIFJERiB0cmlwbGVzdG9yZSBtaWdodCBmYWNpbGl0YXRlKS4gUGFydG5lciBwcm9qZWN0cyB3b3VsZCBhbHNvIGxpa2UgdG8gYmUgYWJsZSB0byB1c2UgZ3VpZGVsaW5lcyBmb3IgRkFJUiBwcmFjdGljZXMgaW4gZXBpZ3JhcGh5LCB3aGljaCBjdXJyZW50bHkgZG8gbm90IGV4aXN0LgoKIyMgTm9uLXBhcnRuZXJlZCBwcm9qZWN0cwoKKipRdWVzdGlvbioqOiAqT3VyIHByb2plY3Qgd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHVzZSB3aXRoaW4gdGhlIG5leHQgdGhyZWUgeWVhcnM6KgoKYGBge3J9CmxvZF9mdXR1cmUyIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHN0cl9zcGxpdChwcm9qZWN0cyRgU2VsZWN0IGFsbCBvcHRpb25zIHlvdXIgcHJvamVjdCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIHdpdGhpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczpgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZF9mdXR1cmUyKSA8LSBjKCJsb2RfZiIpCgoKbG9kX2ZfcmF0aW8yPC0gbG9kX2Z1dHVyZTIgJT4lIAogIGNvdW50KGxvZF9mLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvX2FsbF9wcm9qID0gcm91bmQobi8obnJvdyhwcm9qZWN0cykvMTAwKSkpCmxvZF9mX3JhdGlvMgpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbW9zdCBwb3B1bGFyIGlzIHRoZSBvcHRpb24gYEJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIGFsbCBlcGlncmFwaGljIHB1YmxpY2F0aW9ucyB3aXRoIHN0YWJsZSBVUkkgKGUuZy4gWmVub24pYCByZXByZXNlbnRpbmcgdGhlIHdpc2hlcyBvZiBgciBsb2RfZl9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2ZfcmF0aW8yJGxvZF9mID09IkJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIGFsbCBlcGlncmFwaGljIHB1YmxpY2F0aW9ucyB3aXRoIHN0YWJsZSBVUkkgKGUuZy4gWmVub24pIl1gJSBvZiBhbGwgcGFydGljaXBhdGluZyBwcm9qZWN0cy4gVGhlIGdyZWF0IGludGVyZXN0IGluIG9ub21hc3RpYyBhbmQgcHJvc29wb2dyYXBoaWMgTE9EIGZvciBib3RoIHRoZSBHcmVlayBhbmQgUm9tYW4gd29ybGQgaXMgc3VwcG9ydGVkIGJ5IGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbzIkbG9kX2YgPT0gIkdyZWVrIE9ub21hc3RpYyBkYXRhIHdpdGggc3RhYmxlIFVSSXMgKGUuZy4gTEdQTiB3aXRoIHN0YWJsZSBpZGVudGlmaWVycykiXStsb2RfZl9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2ZfcmF0aW8yJGxvZF9mID09ICJSb21hbiBQcm9zb3BvZ3JhcGhpY2FsIGRhdGEgd2l0aCBzdGFibGUgVVJJcyJdYCUgb2Ygbm9uLXBhcnRuZXJlZCBwcm9qZWN0cy4gVGhlIGBpbXByb3ZlZCBFQUdMRSB2b2NhYnVsYXJpZXNgIGFyZSB3aXNoZWQgZm9yIGJ5IGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbzIkbG9kX2Y9PSJFQUdMRSB2b2NhYnVsYXJpZXMgKHJldmlzZWQgYW5kIGV4dGVuZGVkIHdpdGggY2xlYXIgc3RydWN0dXJlICsgZWxpbWluYXRlZCBkdXBsaWNhdGVzICsgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCkiXWAlIG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMuIFRoZSBgZG9tYWluLXNwZWNpZmljIHJlcG9zaXRvcnkgZm9yIGVwaWdyYXBoaWMgZGF0YWAgKGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbyRsb2RfZj09Ik9uZSBkb21haW4gc3BlY2lmaWMgcmVwb3NpdG9yeSBmb3IgZXBpZ3JhcGhpYyBkYXRhIl1gJSkgb3IgdGhlIGBvcGVuIGFuZCBhY2Nlc3NpYmxlIFJERiBUcmlwbGVzdG9yZWAgKGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbyRsb2RfZj09Ik9wZW4gYW5kIGFjY2Vzc2libGUgUkRGIFRyaXBsZXN0b3JlIl1gJSkgZG8gbm90IHNlZW0gdG8gYmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cywgYnV0IHN0aWxsIGEgcmVsYXRpdmVseSBwb3B1bGFyIHJlc3BvbnNlLiBPbmUgcGFydGljaXBhdGluZyBwcm9qZWN0IHdpc2hlcyBzcGVjaWZpY2FsbHkgZm9yIHRoZSBmb2xsb3dpbmc6IGByIGxvZF9mX3JhdGlvMiRsb2RfZls4XWAsIHdoaWNoIG90aGVyIGV4aXN0aW5nIHByb2plY3RzLCBzdWNoIGFzIFBsZWlhZGVzIG9yIFRyaXNtZWdpc3RvcywgbWlnaHQgYmUgYmV0dGVyIGVxdWlwcGVkIHRvIHByb3ZpZGUuIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB3aXNoZXMgYW5kIGFuc3dlcnMgb2YgdGhlIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgaXMgKmludGVyIGFsaWEqIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdCBzZXZlcmFsIHBhcnRuZXIgcHJvamVjdHMgY29tZSBmcm9tIGEgd29ybGQgYmV5b25kIEdyZWVrIGFuZCBMYXRpbiBlcGlncmFwaHkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKlBvdGVudGlhbCBpZGVhcyB0aGF0IG91ciBwcm9qZWN0IHdvdWxkIGJlbmVmaXQgZnJvbToqCgpgYGB7cn0KbG9kX2lkZWFzMiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocHJvamVjdHMkYFNlbGVjdCBhbGwgaXRlbXMgeW91ciBwcm9qZWN0IHdvdWxkIGJlbmVmaXQgZnJvbSBpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczpgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZF9pZGVhczIpIDwtIGMoImxvZF9pIikKCgpsb2RfaV9yYXRpbzI8LSBsb2RfaWRlYXMyICU+JSAKICBjb3VudChsb2RfaSwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpb19hbGxfcHJvaiA9IHJvdW5kKG4vKG5yb3cocHJvamVjdHMpLzEwMCkpKQoKbG9kX2lfcmF0aW8yCmBgYAoKKipDb21tZW50YXJ5Kio6IGByIGxvZF9pX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfaV9yYXRpbzIkbG9kX2kgPT0gIlNldCBvZiBndWlkZWxpbmVzIGZvciBGQUlSIGFuZCBMaW5rZWQgT3BlbiBEYXRhIGluIGVwaWdyYXBoeSJdYCUgb2YgYWxsIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgY29uc2lkZXIgdGhhdCB0aGV5IHdvdWxkIGJlbmVmaXQgZnJvbSBgQSBzZXQgb2YgZ3VpZGVsaW5lcyBmb3IgRkFJUiBhbmQgTGlua2VkIE9wZW4gRGF0YSBpbiBlcGlncmFwaHlgLiBUaGVyZSBpcyBhIGdlbmVyYWwgaW50ZXJlc3QgaW4gcHJhY3RpY2FsIGV4YW1wbGVzIChgciBsb2RfaV9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8yJGxvZF9pID09IlByYWN0aWNhbCBzY3JpcHRlZCBleGFtcGxlcyBvbiBob3cgdG8gdXNlIExPRCBpbiBlcGlncmFwaHkiXWAlKSBhbmQgd29ya3Nob3Aocykgb24gaG93IHRvIHVzZSBMT0QgaW4gZXBpZ3JhcGh5IChgciBsb2RfaV9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8yJGxvZF9pID09IldvcmtzaG9wIG9uIGhvdyB0byB1c2UgTE9EIGluIGVwaWdyYXBoeSJdYCUpLCBhcyB3ZWxsIGFzIHJlc291cmNlcyBmb3IgcXVhbnRpdGF0aXZlIGFuYWx5c2lzIG9mIGRhdGEgaW4gZXBpZ3JhcGh5IChgciBsb2RfaV9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8kbG9kX2kgPT0iU2V0IG9mIGd1aWRlbGluZXMvcmVzb3VyY2VzIGZvciBxdWFudGl0YXRpdmUgYW5hbHlzaXMgb2YgZXBpZ3JhcGhpYyBkYXRhIl1bMV1gJSkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkFkZGl0aW9uYWwgZGlnaXRhbCBuZWVkcyoKCmBgYHtyLCBsaW5ld2lkdGg9OTB9CnVuaXF1ZShuYS5vbWl0KHByb2plY3RzJGBZb3VyIHBlcnNvbmFsIHdpc2ggbGlzdC4gUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHBvdGVudGlhbCB0YXNrcyBhbmQgaXNzdWVzIHRoZSBGQUlSIEVwaWdyYXBoeSBjYW4gaGVscCB5b3VyIHByb2plY3Qgd2l0aGluIHRoZSBuZXh0IHRocmVlIHllYXJzIChhbmQgYmV5b25kKWApKQpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGlzIHNlY3Rpb24gY292ZXJzIGFkZGl0aW9uYWwgbmVlZHMgb2YgcGFydGljaXBhdGluZyBkaWdpdGFsIHByb2plY3RzLiBTb21lIG9mIHRoZSB3aXNoZXMgbWlnaHQgYmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGUgRkFJUiBFcGlncmFwaHkgcHJvamVjdCBidXQgdGhlIHJlc3BvbnNlcyBwcm92aWRlIHZhbHVhYmxlIGd1aWRhbmNlIGFuZCBoaW50IGF0IHNvbWUgb2YgdGhlIGNoYWxsZW5nZXMgdGhlIGVwaWdyYXBoaWMgZGlzY2lwbGluZSB3aWxsIGJlIGZhY2luZyBpbiB0aGUgbmVhciBmdXR1cmUuIFRoZSByZXNwb25zZXMgbWF5IGluc3BpcmUgb3RoZXIgcHJvamVjdHMgd2l0aCBzaW1pbGFyIG5lZWRzIHRvIGpvaW4gZm9yY2VzIGFuZCBwb3RlbnRpYWxseSBkZXZlbG9wIHNvbHV0aW9ucyB0b2dldGhlci4gVGhlIEZBSVIgRXBpZ3JhcGh5IHByb2plY3QgbWF5IG9mZmVyIG9uZSBjaGFubmVsIHRvIGV4cGxvcmUgYW5kIGNvbGxhYm9yYXRlIG9uIHRoZSBtZWV0aW5nIG9mIHRoZXNlIG5lZWRzIGluIGZ1dHVyZS4KCiMgU3VtbWFyeQoKVGhlIHByZXNlbnQgcmVwb3J0IGRlbW9uc3RyYXRlcyBhIGdyZWF0IHZhcmlhdGlvbiBpbiB0aGUgZXBpZ3JhcGhpYyBkaXNjaXBsaW5lIGluIDIwMjIuIFdlIHJlY2VpdmVkIGFuc3dlcnMgZnJvbSAxMyBwYXJ0bmVyIHByb2plY3RzIGFuZCAyNyBub24tcGFydG5lcmVkIHByb2plY3RzLiBBbHRob3VnaCBpdCBtYXkgc2VlbSB0aGF0IGEgcmVsYXRpdmVseSBzbWFsbCBudW1iZXIgb2YgcHJvamVjdHMgcGFydGljaXBhdGVkIGluIHRoZSBzdXJ2ZXksIG5vbnRoZWxlc3MsIHdlIGNvbnNpZGVyIHRoYXQgcmVzcG9uc2VzIHByb3ZpZGUgYSByZXByZXNlbnRhdGl2ZSBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRpc2NpcGxpbmUuIFRoZSByZXNwb25zZSByYXRlIG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgd2FzIGxvd2VyIHRoYW4gdGhlIHJlc3BvbnNlIHJhdGUgb2YgcGFydG5lciBwcm9qZWN0cyAoMTAwICUgdnMgMzEgJSkuIFRoaXMgbWF5IHJlZmxlY3QgdGhlIG92ZXJhbGwgbG93ZXIgcmF0ZSBvZiBjb21wbGlhbmNlIHdpdGggRkFJUiBwcmluY2lwbGVzLCBvciB0aGUgZmFjdCB0aGF0IG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgbWF5IGhhdmUgY2Vhc2VkIGFjdGl2ZSBvcGVyYXRpb24gYmVmb3JlIEZBSVIgcHJpbmNpcGxlcyB3ZXJlIGVzdGFibGlzaGVkIGFuZCBpbXBsZW1lbnRlZCBieSB0aGVpciBpbnN0aXR1dGlvbnMgYW5kIGZ1bmRpbmcgYm9kaWVzLgoKVGhlIHJlc3BvbnNlcyByZXByZXNlbnQgYSBkaXZlcnNlIHNlbGVjdGlvbiBvZiBwcm9qZWN0cywgYmFzZWQgbW9zdGx5IGluIEV1cm9wZSBhbmQgdGhlIFVTQS4gVGhlIG1ham9yaXR5IG9mIHByb2plY3RzIGZvY3VzIHByZWRvbWluYW50bHkgb24gcHVibGljYXRpb24gb2YgdGV4dHVhbCBlZGl0aW9ucyBvZiBpbnNjcmlwdGlvbnMgKHdoZXJlIEVwaWRvYyBYTUwgaXMgdGhlIG1haW4gZGF0YSBmb3JtYXQpLCB3aGlsZSBzb21lIGZvY3VzIG9uIHB1YmxpY2F0aW9uIG9mIHJlbGF0ZWQgbWV0YWRhdGEgd2l0aG91dCBwcm9kdWNpbmcgbmV3IGVkaXRpb25zIG9mIHRleHQgKGFuZCB0aHVzIHVzZSBkaWZmZXJlbnQgZGF0YSBmb3JtYXRzIHRoYW4gRXBpZG9jIFhNTCkuCgpBbHRob3VnaCB0aGUgbWFqb3JpdHkgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyByZWNvcmQgaW5zY3JpcHRpb25zIGluIExhdGluIGFuZCBHcmVlaywgd2Ugc2VlIGEgZGl2ZXJzZSBhcnJheSBvZiBwcm9qZWN0cyBleHBhbmRpbmcgYmV5b25kIHRoZSB0cmFkaXRpb25hbCBmb2N1cyBvZiB0aGUgZGlzY2lwbGluZSB0aGUgd2F5IGFzIGl0IHdhcyBlc3RhYmxpc2hlZCBpbiB0aGUgMTl0aCBjZW50dXJ5LiBUaGUgcHJvamVjdHMgcGFydGljaXBhdGluZyBpbiB0aGUgc3VydmV5IGluY2x1ZGUgd2VsbC1lc3RhYmxpc2hlZCBwcm9qZWN0cyB0aGF0IGhhdmUgZXhpc3RlZCBvdmVyIHNldmVyYWwgZGVjYWRlcywgcmVnaW9uYWwgb3IgdGhlbWF0aWMgY29ycG9yYSwgYW5kIG1vcmUgc3BlY2lhbGlzZWQsIHNob3J0LXRlcm0gUGhEIHByb2plY3RzLiBXZSBoYXZlIG9ic2VydmVkIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2Vlbiwgb24gdGhlIG9uZSBoYW5kLCBwcm9qZWN0cyB3aXRoIGEgbG9uZyB0cmFkaXRpb24gYW5kIG1vc3QgaW1wb3J0YW50bHkgd2l0aCByZWxhdGl2ZWx5IHN0YWJsZSBpbnN0aXR1dGlvbmFsIHN1cHBvcnQsIHdoaWNoIGhhdmUgYWNjZXNzIHRvIGluc3RpdHV0aW9uYWwgcmVwb3NpdG9yaWVzLCBwb2xpY2llcyBhbmQgYXQgbGVhc3QgYmFzaWMgSVQgc2VydmljZXM7IGFuZCBvbiB0aGUgb3RoZXIsIHNtYWxsLXNjYWxlIHByb2plY3RzIHdpdGggbGltaXRlZCBzdXBwb3J0IGFuZCBhY2Nlc3MgdG8gcmVzb3VyY2VzIGFuZCB0cmFpbmluZywgdHlwaWZpZWQgYnkgc2hvcnQtdGVybSBwcm9qZWN0cyBvbiBhIHNwZWNpZmljIHRvcGljIHRoYXQgbWF5IGxhY2sgYWNjZXNzIHRvIGxvbmctdGVybSBpbnN0aXR1dGlvbmFsIHN1cHBvcnQuIE9uZSBvZiB0aGUgbWlzc2lvbnMgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IFByb2plY3QgaXMgdG8gc3VwcG9ydCBwcm9qZWN0cyB3aXRoIGxpbWl0ZWQgYWNjZXNzIHRvIHJlc291cmNlcywgYXMgd2VsbCBhcyBlc3RhYmxpc2hlZCBwcm9qZWN0cywgYnkgcHJvdmlkaW5nIGFjY2Vzc2libGUgYW5kIGNvbXByZWhlbnNpYmxlIHRyYWluaW5nIGFuZCBndWlkZWxpbmVzIGZvciBGQUlSIGFuZCBMaW5rZWQgT3BlbiBEYXRhIHByaW5jaXBsZXMgaW4gZXBpZ3JhcGh5LgoKVGhlIGVzdGFibGlzaGVkIHByb2plY3RzIG1vc3RseSBmb2xsb3cgdGhlIEZBSVIgcHJpbmNpcGxlcywgYWx0aG91Z2ggdG8gYSB2YXJpYWJsZSBleHRlbnQuIFRoZSBtYWpvcml0eSBvZiBlc3RhYmxpc2hlZCBwcm9qZWN0cyBzaGFyZSB0aGVpciBkYXRhIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBsaWNlbnNlIGluIG9uZSBvciBtb3JlIHdpZGVseSBhY2NlcHRlZCBmb3JtYXRzICh3aXRoIEVwaWRvYyBYTUwgYmVpbmcgdGhlIG1vc3QgcG9wdWxhciBmb3JtYXQgZm9yIGFsbCB0eXBlcyBvZiBwcm9qZWN0cyBpcnJlc3BlY3RpdmUgb2YgdGhlaXIgc3RhdHVzIGFuZCBsb25nZXZpdHkpLiBJbiBnZW5lcmFsLCB0aGUgbW9yZSBlc3RhYmxpc2hlZCBwcm9qZWN0cyBwcm92aWRlIG1vcmUgYWNjZXNzIHBvaW50cyB0byB0aGVpciBkYXRhIGFzIHdlbGwgYXMgbW9yZSBkYXRhIGZvcm1hdHMgdGhhbiB0aGUgcHJvamVjdHMgd2l0aCBsZXNzIGluc3RpdHV0aW9uYWwgc3VwcG9ydC4gVGhlIHVzZSBvZiBzdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llcyBpcyBzdGlsbCBsaW1pdGVkIGFuZCBwcm9qZWN0LXNwZWNpZmljLCBtb3N0bHkgZHVlIHRvIHRoZSBsYWNrIG9mIHVuaWZvcm1seSBhY2NlcHRlZCBzdGFuZGFyZHMuIE9uIGNvbnRyYXJ5LCB0aGUgYWRvcHRpb24gb2YgTGlua2VkIE9wZW4gRGF0YXNldHMgKExPRCkgYW5kIGNyZWF0aW9uIG9mIGxpbmtzIHdpdGhpbiB0aGUgZXBpZ3JhcGhpYyBkYXRhc2V0cyB3aXRoIHN0YWJsZSBpZGVudGlmaWVycyB0byB0aG9zZSBMT0Qgc291cmNlcyBzZWVtcyB0byBiZSBmYWlybHkgYWR2YW5jZWQsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2Ygd2VsbC1lc3RhYmxpc2hlZCBMT0QgZG9tYWlucyBzdWNoIGFzIFBsZWlhZGVzIG9yIFRyaXNtZWdpc3RvcyBmb3IgR3JhZWNvLVJvbWFuIHByb2plY3RzLCBhbmQgdG8gYSBsZXNzZXIgZXh0ZW50IHRoZSBFQUdMRSB2b2NhYnVsYXJpZXMuCgpUaGUgbm9uLXBhcnRuZXJlZCBwcm9qZWN0cyBmb2xsb3cgdGhlIEZBSVIgcHJpbmNpcGxlcywgYnV0IHRvIGEgbGVzc2VyIGRlZ3JlZSB0aGFuIHRoZSBlc3RhYmxpc2hlZCBwcm9qZWN0cy4gVGhlcmUgYXJlLCBob3dldmVyLCBzb21lIHNob3J0LXRlcm0gcHJvamVjdHMgdGhhdCBmdWxmaWxsIG9yIGV4Y2VlZCB0aGUgcmVxdWlyZW1lbnRzIGZvciBPcGVuIFNjaWVuY2UsIGJ1dCBhcyBhIGdlbmVyYWwgcnVsZSB0aGUgY29tcGxpYW5jZSBpcyBsb3dlciB0aGFuIGluIHRoZSBjYXNlIG9mIGVzdGFibGlzaGVkIHByb2plY3RzLiBUaGUgcmVhc29uIGZvciBsb3dlciBjb21wbGlhbmNlIGluIHNvbWUgcHJvamVjdHMgaXMgbW9zdCBsaWtlbHkgYSBjb21iaW5hdGlvbiBvZiBzaG9ydC10ZXJtIGluc3RpdHV0aW9uYWwgc3VwcG9ydCwgbGltaXRlZCBhY2Nlc3MgdG8gSVQgc3VwcG9ydCBhbmQgcG9vciBhY2Nlc3NpYmlsaXR5IG9mIGd1aWRlbGluZXMgYW5kIGRpc2NpcGxpbmUtc3BlY2lmaWMgdHJhaW5pbmcuCgpBcyB0byB0aGUgY3VycmVudCBhbmQgZnV0dXJlIG5lZWRzIG9mIGRpZ2l0YWwgZXBpZ3JhcGh5LCB0aGVyZSBpcyBhIGNsZWFyIGRlbWFuZCBmb3IgbW9yZSBhbmQgYmV0dGVyIExPRC4gVGhlIHJlcXVlc3RzIGNvbmNlcm5lZCBlc3BlY2lhbGx5IGJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIHN0YW5kYXJkIGVwaWdyYXBoaWMgY29ycG9yYSwgc3RhbmRhcmRpc2F0aW9uIG9mIGRpc2NpcGxpbmUtc3BlY2lmaWMgdm9jYWJ1bGFyaWVzLCBhbmQgcHJvc29wb2dyYXBoaWMgTE9EIGZvciB0aGUgYW5jaWVudCB3b3JsZC4gSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgd2lzaCBmb3Igc3VwcG9ydCBieSB0cmFpbmluZyBhbmQgdGhlIHByb3Zpc2lvbiBvZiBhY2Nlc3NpYmxlIHJlc291cmNlcyBhbmQgZ3VpZGVsaW5lcyBmb3IgRkFJUiBhbmQgT3BlbiBlcGlncmFwaHkuCgpJbiB0aGUgbmVhciBmdXR1cmUsIHdlIHBsYW4gdG8gdW5kZXJ0YWtlIHNldmVyYWwgaW4tZGVwdGggaW50ZXJ2aWV3cyB3aXRoIG91ciBwYXJ0bmVycyB0byBjb25maXJtIHNvbWUgb2Ygb3VyIGFzc3VtcHRpb25zIGFuZCB0byBkcmFmdCBhIGNvbmNyZXRlIHBsYW4gZm9yIHRoZSBmb2xsb3dpbmcgdGhyZWUgeWVhcnMuIEhvd2V2ZXIsIGl0IGlzIGNsZWFyIGZyb20gdGhlIHN1cnZleSByZXNwb25zZXMsIHRoYXQgd2Ugc2hvdWxkIGRpcmVjdCBvdXIgYXR0ZW50aW9uIHRvIHRocmVlIG1haW4gdGFza3M6CgoxLiAgaW1wbGVtZW50aW5nIGFuZCBob3N0aW5nIHN0YW5kYXJkcyBmb3IgZXBpZ3JhcGhpYyB2b2NhYnVsYXJpZXMgKGUuZy4gaW5zY3JpcHRpb24gdHlwZSwgbWF0ZXJpYWwsIG9iamVjdCBldGMuKQoyLiAgaW1wbGVtZW50aW5nIGFuZCBob3N0aW5nIHN0YW5kYXJkcyBmb3IgYmlibGlvZ3JhcGhpY2FsIHJlY29yZHMgKGUuZy4gc3RhYmxlIGFuZCB1bmlxdWUgcmVjb3JkcyBmb3IgYWxsIG1ham9yIGVwaWdyYXBoaWMgZWRpdGlvbnMpCjMuICBidWlsZGluZyBhIHBsYXRmb3JtIGZvciBGQUlSIGFuZCBPcGVuIEVwaWdyYXBoeSBvbiB0aGUgaW5mcmFzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgT3hmb3JkIChDU0FEKSwgdGhhdCB3aWxsIGZ1bmN0aW9uIGFzIGFuIGluZm9ybWF0aW9uIGh1YiwgcHJvdmlkaW5nIG5vdCBvbmx5IHRyYWluaW5nIGFuZCBnb29kIHByYWN0aWNlIGV4YW1wbGVzLCBidXQgYWxzbyBob3N0aW5nIHRoZSByZXNvdXJjZXMgYW5kIHRvb2xzLgoKV2UgaG9wZSB0byBydW4gYSBzaW1pbGFyIHN1cnZleSBhbm51YWxseSB0byB0cmFjayBhbnkgcHJvZ3Jlc3Mgd2l0aGluIHRoZSBkaXNjaXBsaW5lIGFuZCBjbG9zZWx5IG1vbml0b3IgY2hhbmdpbmcgbmVlZHMgb2YgaW5kaXZpZHVhbCBwcm9qZWN0cyBpbiBkaWdpdGFsIGVwaWdyYXBoeS4KCiMgQmlibGlvZ3JhcGh5Cgo6OjogeyNyZWZzfQo6OjoK