Introduction

As the world has transitioned into the age of big data, the need for data privacy and ethical data management process has increased. Unfortunately, regulations requiring ethical practices and the employment of unbiased models have yet to catch up. With many organizations only bound to create increased profit from the use of data, many ethical practices to ensure models are without bias are not mandatory but simply good practices. The first part of this paper will present ethics and fairness issues of data privacy among three New York Times Privacy Project topics. The second part of this paper will outline current efforts from the Data Privacy Lab to address the issues presented in part one. Finally, this paper will illustrate how the lack of regulations within the United States has downstream harm in several critical areas of data use regarding facial recognition model creation, anonymity, and identity protection and provide input on how to employ AI recommendation systems can thwart some current issues until legislation can catch up to current technology.

Part One

Privacy Protection Laws and Regulations

To highlight the need for more regulation outlining how the United States Government oversees data management and data sharing, Singer references the large gap in how the Government addresses several other areas of consumer protection. For example, when Apple discovered that laptop batteries could overheat and pose a fire hazard, the Consumer Protection Safety Commission issued a warning to inform apple users of potential harm (Singer, 2021). When it was identified that Fitbit wristbands began to cause skin rashes and blisters, the consumer safety agency issued a recall of the product to protect consumers (Singer, 2021). Unfortunately, the same level of oversight and protection for privacy does not currently exist within the United States.

Unlike Federal agencies created to ensure that consumers and citizens are protected from the harm created by faulty products, such as the Consumer Protection Bureau and the Consumer Product Safety Commission, the only regulatory body within the United States Government to address privacy is the Federal Trade Commission. While the overall purpose of the Federal Trade Commission is to enforce civil antitrust law and the promotion of consumer protection, they are woefully under-equipped and lack the empowerment from robust data protection laws to ensure federal compliance of data privacy. Compared to the European Union, bound by the General Data Protection Regulation (GDPR), current regulations within the United States are not relevant in overseeing data management and sharing to ensure all data is handled with privacy, fairness, and accountability. The GDPR was created in 2018 and consists of 99 individual articles that are considered the world’s strongest set of data protection rules, which enhance how people can access information about them and limits what organizations can do with personal data (Burgess, 2020). Unfortunately, the United States doesn’t have a singular law covering all data types. Instead, it has a mix of rules put together by the Health Insurance Portability and Accountability Act (HIPPA), the Fair Credit Reporting Act (FCRA), the Family Educational Rights and Privacy Act (FERPA), the Gramm-Leach-Bliley Act (GLBA), the Electronic Communications Privacy Act (ECPA), the Children’s Online Privacy Protection Rule (COPPA), the Video Privacy Protection Act (VPPA), and the Federal Trade Commission Act (FTCA) (Klosowski, 2021).

The lack of regulation has reverberating effects on how companies and organizations handle data. First, there are significant issues with re-identification from data sets because privacy and anonymity are not regulatory requirements in data sharing and machine learning (ML) model creation. Second, most states have yet to establish a current mandate to inform consumers how their data is used. As a result, companies can use, share, or sell any data they collect without notifying the consumer of what they are doing (Klosowski, 2021). The follow-on impact of the lack of informed consent is that companies can sell information to third parties that can further sell, aggregate, or share the data, all the while the individual never provided consent for their information to be proliferated throughout the public domain. Finally, because there are no laws requiring nondiscriminatory and unbiased data, models can frequently create biased and inaccurate systems that result in actual harm throughout society. Without robust legislation requiring organizations to be legally bound to manage data ethically, there is a concrete certainty that models will be created that enable organizations to prioritize profit or insights over the privacy and anonymity of the consumer or citizen.

Facial Recognition from Biased Data

To address data privacy issues regarding facial recognition software, this paper examined the project by Garvie, from 2019. The article presents vignettes that show common pitfalls from the misuse, bias, and pitfalls of facial recognition applications. While the report presents other data ethics concerns, such as informed consent of how our data is shared and provides examples of general anonymity concerns, the focus is how law enforcement leverages facial recognition technology from photos collected when Americans apply for a driver’s license. Unbeknownst to many citizens, our pictures that were taken when we applied for driver’s licenses have been used to construct training sets for facial recognition systems currently employed by the police. When the system is employed, the possibility exists that it will draw an incorrect conclusion and attribute a criminal act to an innocent citizen due to a biased model. Additionally, by the inclusion of these photos into law enforcement databases, the right to privacy is seriously infringed upon by the government.

Even though the more obvious danger that can arise from police using facial recognition software is incorrect conclusions, other hazards challenge the legitimacy of the software for police use. As previously identified in this paper, there are significant impacts on particular groups without regulations to govern how ML systems are created and employed. The racial bias remains a persistent issue in many facial recognition systems due to a lack of transparency on what information created the model. Many technologies provide very high levels of accuracy in accurately identifying middle-aged white males but suffer to deliver accurate conclusions with other genders and racial groups. In a study conducted in 2018 entitled the Gender Shades Project, it was found that by evaluating facial recognition systems by IBM and Microsoft, error rates were up to 34% higher for darker-skinned females than for light-skinned males (Najibi, 2020). By employing facial recognition systems that fail to achieve an equal level of accuracy across all groups in the citizenry, negative repercussions to those incorrectly identified will prove inevitable.

The source of harm in many inaccurate facial recognition systems comes from a representation bias. Training sets used to create the models essentially comprise middle-aged white male images. While the systems are very accurate with the pictures it has been trained to identify, it does not represent the larger use population (Suresh, 2021). By constructing the training sets using adversarial learning and counterfactual models as seen in other ML systems to create fair conclusions regardless of the inclusion of sensitive variables such as race and gender, facial recognition systems training sets can be purposefully built to become more equitable and representative of their use population. Additionally, by performing ethical auditing by independent sources, facial recognition systems can be held accountable for methodological biases (Najibi, 2020).

When known bias exists in the training data set for facial recognition and is leveraged for police use, an Artificial Intelligence (AI) recommendation system could be employed to ensure outputs do not negatively impact specific population groups. For example, an AI system could be trained to identify when it is queried to produce results below-specified accuracy levels. Whether the error comes from a representation, learning, or aggregation bias within the data, a system designed to create an output and audit itself would benefit facial recognition systems. In practice, the system could be queried to provide a match from an image while simultaneously assessing the level of accuracy predicted based on the picture provided. The tool could provide an alert to ensure human involvement within the decision-making loop when it has been asked to identify individuals with low-accuracy predictions. By creating a system that can recognize areas where it struggles to provide accurate conclusions while taking additional steps to create more representative training data sets, facial recognition systems would make more fair conclusions for all groups.

Genomic Privacy

With the proliferation of companies offering genomic sequencing services to screen for disease and illuminate a family’s genealogy, privacy concerns have arisen. In The New York Times Privacy Project tackling this issue, Bala provides numerous examples of the dangers of enlisting direct-to-consumer genetic sequencing services and the impact that it can have on the customer’s family. The troubles arise from the amount of information that can be gathered from one person’s genetic code. When the saliva sample is provided to the company, the customer consented to share private health data for not only themselves but their entire family. In one example, if a parent shares their children’s genetic information on public websites, parents are forever exposing their personal health data well before the age of consent (Bala, 2020). Because of the lack of regulations governing de-identification practices, an environment exists where genomic privacy is almost unattainable to those who have opted to share their genetic sequence. In the example above, it is a certainty that the remainder of the extended family did not consent to have their genetic code shared when the parents decided to conduct genetic testing on their child. Not only do current regulations lack the mandate to adequately de-identify consumers, but they also fail to enact policies that ensure all persons identified through testing provide consent.

Bala continues the project by illustrating the negative repercussions of oversharing children’s personal information. Unfortunately, when parents share the child’s genetic information, they have taken the right to privacy away from the child and the right not to know certain information. Referencing the 1977 Whalen vs. Roe decision, Bale outlines two critical components of the right to privacy; the individual interest in avoiding disclosure of personal matters and the interest in independence in making certain kinds of important decisions (Bale, 2020). While it may be beneficial for a parent to understand if their children carry hereditary genes linked to disease, the parents have removed the right to privacy from the child by sharing the genetic sequence. Furthermore, when a genetic sequence is shared with the company, information can be gathered on the customer’s entire family, presenting challenges to informed consent.

The source of harm in the use of companies like 23andMe, MyHeritage, and GEDmatch does not come from an inherent bias within a model or database. Instead, it illustrates how a lack of regulation governing the right to privacy reverberates through generations of citizens. The United States follows a tradition of allowing parents to make legal decisions on behalf of their children. However, what happens when no regulation or law dictates what information a parent can share about their child? In countries like France and Austria, children can sue their parents for oversharing personal information. In the United States, there are no such regulations. Even though the American Academy of Pediatrics and American College of Medical Genetics and Genomics strongly discourage home-kit genetic testing on children, the practice continues. Personal medical information is shared, analyzed, and sold, forever sharing private information with the world (Bale, 2020).

Part Two

Current State of Regulatory Shortfalls as seen in Sorrell v. IMS Health

Previously identified in this paper are instances where the need for regulations within the current United States civil code allows for companies to behave in their best interest rather than with a priority placed on data privacy. The privacy lab project that addresses how the current framework of United States privacy protection laws are at the discretion of State regulatory agencies curtailed by a patchwork of National Acts and rules is an evaluation of U.S. Supreme Court Case Sorrell v. IMS Health Inc. The project explores issues that have arisen from the HIPAA 1990s styled protection and references how more effort can be taken from organizations that collect medical information to still reap benefit from the collected data while protecting the patient’s privacy (Sweeney, n.d).

The court case presents an argument from Sorrell (the Petitioner) that IMS Health (the Respondent) fails to properly de-identify patient information under established Vermont State and Federal HIPAA regulations. Under Vermont State Law and HIPAA regulations, all patient data must be sufficiently de-identified before sharing it beyond the pharmacy that collected the information in the care of the patient (Sweeney, n.d.). During the hearing, the Petitioner argues that the de-identification approach used by IMS does not adequately protect the patient’s identity. Patient data shared by IMS health include the prescriber’s name and address, the name, dosage, and quantity of the drug prescribed, the date and location at which the prescription was filled, and the patient’s age and gender (Sweeney, n.d.). Through modern practices, re-identification of the patients was possible, and the court was presented examples where Sweeney was able to accurately identify 20 out of 22 participants in a data set taken from similar information that IMS Health released (Sweeney, n.d.).

Overall, the case illustrates weak privacy regulations’ impact on privacy protection. As the monetary value from data analysis and customer information becomes more valuable, additional rules are required to ensure customer and patient anonymity while maintaining the benefit from research. Unfortunately, current HIPAA regulations and U.S. State guidelines for de-identification have proven to be inadequate in ensuring that companies conduct data sharing and data sales to third parties achieving anonymity of the participants in the data set.

Facial Recognition De-Identification Efforts

Part one of this paper presented projects illuminating the harm that can occur from biased facial recognition systems as the technology gains acceptance despite its privacy shortfalls. However, facial recognition systems and video surveillance issues can be solved by employing novel technologies. To protect the privacy of individuals, images captured in standard surveillance systems should be de-identified. When coupled with facial recognition software, a system that fails to de-identify individuals in a city-wide surveillance system could effectively track single individuals throughout the coverage area (Newton, 2003). While the New York Times project in part one describes what could occur from inaccurate systems, other efforts exist to ensure that uninformed citizens’ privacy and anonymity are achieved through de-identification from standard video surveillance practices. The technique presented by Newton in the data privacy lab project illustrates how facial recognition systems can continue to be used without infringing on the right to privacy of the citizenry (Newton, 2003).

In the privacy lab project, Newton makes a point to reiterate the value of surveillance systems. The systems proposed attempt to enable the sharing of video data with scientific assurances of privacy protection while keeping the data practically useful (Newton, 2003). The project’s goal was to de-identify the facial features to a level where anonymity is achieved while leaving key defining characteristics while simultaneously encrypting the image for re-identification purposes. Previously attempted techniques, such as covering the eyes or altering pixel colors, failed to adequately protect images from facial recognition software.

There would be several privacy implications if Newton’s techniques were widely adopted. First, there is a decreased risk that an individual could be discriminated against through inaccurate facial recognition software running against common video surveillance. As presented in part one of this paper, significant accuracy issues negatively impact specific groups. Next, when de-identification is conducted before analysis in facial recognition software systems, another layer of protection is afforded to the privacy of historically infringed groups. Finally, citizens are now afforded the right to privacy. When data sets are shared containing images using Newton’s technique of pre-processing facial images before the faces are included in a data set, the people in the data set are safe from re-identification without an encryption key. The owner of the data set of facial images will now be free to share the encrypted images without violating participants’ privacy.

Genomic Privacy Protection Efforts

Work by Malin included in the data privacy project aims to illustrate how current de-identification protocols when anonymizing genomic data fails to fully protect from re-identification. As previously mentioned in this paper, medical information is protected using HIPPA regulations. Still, as seen through previous court cases such as Sorrell v. IMS Health, those policies are ineffective enough in today’s data-rich environment where genetic information is readily shared for scientific and medical benefit. Although advocates of de-identification address the issue of maintaining privacy with the best intentions when guided only by HIPPA regulations, they often fail to maintain anonymity, and participants can be re-identified (Malin, 2003). Additionally, when following de-identification guidelines, anonymized data can be related to publicly available information to identify specific individuals (Braun, 2009).

Malin proves that even when using several known de-identification methods, re-identification can still be achieved. Through evaluating the breadth of dangers described in the New York Times Privacy project showing the hazards from the oversharing of personal genetic information, it is apparent that further research and regulations are required to protect individual identities. Not only do researchers need to establish effective techniques to de-identify genetic information, but careful consideration should also be taken to determine if direct-to-consumer genetic services are beneficial enough to warrant the inherent loss of privacy.

Conclusion

Throughout this paper, several key privacy issues were illustrated by comparing existing privacy projects from the New York Times against ongoing academic and scientific efforts to address existing data privacy issues. As the data economy expands, ensuring individual privacy will remain a constant hurdle. This paper has shown how the need for a foundation of privacy and ethical management of identifiable information will only be achieved through additional regulations governing how data is protected and secured. Only after those regulations are created that address current technological advancements will individuals be safe from re-identification from genomic information and protected from inaccurate conclusions drawn from biased facial recognition programs.

References

Bala, N. (2020). Why Are You Sharing Your Child’s DNA Information?. New York Times. Retrieved January 28, 2023 from https://www.nytimes.com/2020/01/02/opinion/dna-test-privacy-children.html

Braun, R., Rowe, W., Schafer, C., Zhang, J., Buetow, K. (2005). Needles in the Haystack: Identifying Individuals Present in Pooled Genomic Data. PLos Genetics. Retrieved February 22, 2023 from https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2747273/

Burgess, M. (2020). What is the GDPR? The Summary Guide to Compliance in the UK. Wired. Retrieved February 18, 2023 from https://www.wired.co.uk/article/what-is-gdpr-uk-eu-legislation-compliance-summary-fines-2018

Garvie, C. (2019). You’re In A Police Lineup Right Now. New York Times. Retrieved January 27, 2023 from https://www.nytimes.com/2019/10/15/opinion/facial-recognition-police.html

Klosowski, T. (2021). The State of Consumer Data Privacy Protection Laws in the US (Any Why it Matters). Wirecutter. Retrieved February 15, 2023 from https://www.nytimes.com/wirecutter/blog/state-of-privacy-laws-in-us/

Malin, B. (2003). Why Pseudonyms Don’t Anonymize: A Computational Re-identification Analysis of Genomic Data Privacy Protection Systems. Carnegie Melon University. Retrieved January 28, 2023 from https://dataprivacylab.org/dataprivacy/projects/linkage/lidap-wp19.pdf

Najibi, A. (2020). Racial Discrimination in Face Recognition Technology. Harvard University. Retrieved February 20, 2023 from https://sitn.hms.harvard.edu/flash/2020/racial-discrimination-in-face-recognition-technology/

Newton, E., Sweeney, L., Malin, B. (2003). Preserving Privacy by De-Identifying Facial Images. Carnegie Melon University. Retrieved January 27, 2023 from https://dataprivacylab.org/dataprivacy/projects/video/paper.pdf

Singer, N. (2019). The Government Protects out Food and Cars. Why Not Our Data?. New York Times. Retrieved January 26, 2023 from https://www.nytimes.com/2019/11/02/sunday-review/data-protection-privacy.html

Suresh, H., Guttag, J. (2021). A Framework for Understanding Sources of Harm Throughout the Machine Learning Life Cycle. Massachusetts Institute of Technology. Retrieved February 20, 2023 from https://ucwv.mrooms3.net/pluginfile.php/1285783/mod_page/content/1/A%20Framework%20for%20Understanding%20Sources%20of%20Harm.pdf

Sweeney, L. (n.d.). Patient Privacy Risks in U.S. Supreme Court Case Sorrell vs. IMS Health. Privacy Lab Project. Retrieved January 26, from https://dataprivacylab.org/projects/identifiability/pharma2.pdf

LS0tCnRpdGxlOiAiSW1wYWN0cyBGcm9tIFJlZ3VsYXRvcnkgU2hvcnRmYWxscyIKYXV0aG9yOiAiRGF2aWQgQ3VydGlzIFVuaXZlcnN0aXR5IG9mIENoYXJsZXN0b24iCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgojIyBJbnRyb2R1Y3Rpb24KCkFzIHRoZSB3b3JsZCBoYXMgdHJhbnNpdGlvbmVkIGludG8gdGhlIGFnZSBvZiBiaWcgZGF0YSwgdGhlIG5lZWQgZm9yIGRhdGEgcHJpdmFjeSBhbmQgZXRoaWNhbCBkYXRhIG1hbmFnZW1lbnQgcHJvY2VzcyBoYXMgaW5jcmVhc2VkLiBVbmZvcnR1bmF0ZWx5LCByZWd1bGF0aW9ucyByZXF1aXJpbmcgZXRoaWNhbCBwcmFjdGljZXMgYW5kIHRoZSBlbXBsb3ltZW50IG9mIHVuYmlhc2VkIG1vZGVscyBoYXZlIHlldCB0byBjYXRjaCB1cC4gV2l0aCBtYW55IG9yZ2FuaXphdGlvbnMgb25seSBib3VuZCB0byBjcmVhdGUgaW5jcmVhc2VkIHByb2ZpdCBmcm9tIHRoZSB1c2Ugb2YgZGF0YSwgbWFueSBldGhpY2FsIHByYWN0aWNlcyB0byBlbnN1cmUgbW9kZWxzIGFyZSB3aXRob3V0IGJpYXMgYXJlIG5vdCBtYW5kYXRvcnkgYnV0IHNpbXBseSBnb29kIHByYWN0aWNlcy4gVGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBwYXBlciB3aWxsIHByZXNlbnQgZXRoaWNzIGFuZCBmYWlybmVzcyBpc3N1ZXMgb2YgZGF0YSBwcml2YWN5IGFtb25nIHRocmVlIE5ldyBZb3JrIFRpbWVzIFByaXZhY3kgUHJvamVjdCB0b3BpY3MuIFRoZSBzZWNvbmQgcGFydCBvZiB0aGlzIHBhcGVyIHdpbGwgb3V0bGluZSBjdXJyZW50IGVmZm9ydHMgZnJvbSB0aGUgRGF0YSBQcml2YWN5IExhYiB0byBhZGRyZXNzIHRoZSBpc3N1ZXMgcHJlc2VudGVkIGluIHBhcnQgb25lLiBGaW5hbGx5LCB0aGlzIHBhcGVyIHdpbGwgaWxsdXN0cmF0ZSBob3cgdGhlIGxhY2sgb2YgcmVndWxhdGlvbnMgd2l0aGluIHRoZSBVbml0ZWQgU3RhdGVzIGhhcyBkb3duc3RyZWFtIGhhcm0gaW4gc2V2ZXJhbCBjcml0aWNhbCBhcmVhcyBvZiBkYXRhIHVzZSByZWdhcmRpbmcgZmFjaWFsIHJlY29nbml0aW9uIG1vZGVsIGNyZWF0aW9uLCBhbm9ueW1pdHksIGFuZCBpZGVudGl0eSBwcm90ZWN0aW9uIGFuZCBwcm92aWRlIGlucHV0IG9uIGhvdyB0byBlbXBsb3kgQUkgcmVjb21tZW5kYXRpb24gc3lzdGVtcyBjYW4gdGh3YXJ0IHNvbWUgY3VycmVudCBpc3N1ZXMgdW50aWwgbGVnaXNsYXRpb24gY2FuIGNhdGNoIHVwIHRvIGN1cnJlbnQgdGVjaG5vbG9neS4KCiMjIFBhcnQgT25lCgojIyMgUHJpdmFjeSBQcm90ZWN0aW9uIExhd3MgYW5kIFJlZ3VsYXRpb25zCgpUbyBoaWdobGlnaHQgdGhlIG5lZWQgZm9yIG1vcmUgcmVndWxhdGlvbiBvdXRsaW5pbmcgaG93IHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgb3ZlcnNlZXMgZGF0YSBtYW5hZ2VtZW50IGFuZCBkYXRhIHNoYXJpbmcsIFNpbmdlciByZWZlcmVuY2VzIHRoZSBsYXJnZSBnYXAgaW4gaG93IHRoZSBHb3Zlcm5tZW50IGFkZHJlc3NlcyBzZXZlcmFsIG90aGVyIGFyZWFzIG9mIGNvbnN1bWVyIHByb3RlY3Rpb24uIEZvciBleGFtcGxlLCB3aGVuIEFwcGxlIGRpc2NvdmVyZWQgdGhhdCBsYXB0b3AgYmF0dGVyaWVzIGNvdWxkIG92ZXJoZWF0IGFuZCBwb3NlIGEgZmlyZSBoYXphcmQsIHRoZSBDb25zdW1lciBQcm90ZWN0aW9uIFNhZmV0eSBDb21taXNzaW9uIGlzc3VlZCBhIHdhcm5pbmcgdG8gaW5mb3JtIGFwcGxlIHVzZXJzIG9mIHBvdGVudGlhbCBoYXJtIChTaW5nZXIsIDIwMjEpLiBXaGVuIGl0IHdhcyBpZGVudGlmaWVkIHRoYXQgRml0Yml0IHdyaXN0YmFuZHMgYmVnYW4gdG8gY2F1c2Ugc2tpbiByYXNoZXMgYW5kIGJsaXN0ZXJzLCB0aGUgY29uc3VtZXIgc2FmZXR5IGFnZW5jeSBpc3N1ZWQgYSByZWNhbGwgb2YgdGhlIHByb2R1Y3QgdG8gcHJvdGVjdCBjb25zdW1lcnMgKFNpbmdlciwgMjAyMSkuIFVuZm9ydHVuYXRlbHksIHRoZSBzYW1lIGxldmVsIG9mIG92ZXJzaWdodCBhbmQgcHJvdGVjdGlvbiBmb3IgcHJpdmFjeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3Qgd2l0aGluIHRoZSBVbml0ZWQgU3RhdGVzLiAKCgpVbmxpa2UgRmVkZXJhbCBhZ2VuY2llcyBjcmVhdGVkIHRvIGVuc3VyZSB0aGF0IGNvbnN1bWVycyBhbmQgY2l0aXplbnMgYXJlIHByb3RlY3RlZCBmcm9tIHRoZSBoYXJtIGNyZWF0ZWQgYnkgZmF1bHR5IHByb2R1Y3RzLCBzdWNoIGFzIHRoZSBDb25zdW1lciBQcm90ZWN0aW9uIEJ1cmVhdSBhbmQgdGhlIENvbnN1bWVyIFByb2R1Y3QgU2FmZXR5IENvbW1pc3Npb24sIHRoZSBvbmx5IHJlZ3VsYXRvcnkgYm9keSB3aXRoaW4gdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCB0byBhZGRyZXNzIHByaXZhY3kgaXMgdGhlIEZlZGVyYWwgVHJhZGUgQ29tbWlzc2lvbi4gV2hpbGUgdGhlIG92ZXJhbGwgcHVycG9zZSBvZiB0aGUgRmVkZXJhbCBUcmFkZSBDb21taXNzaW9uIGlzIHRvIGVuZm9yY2UgY2l2aWwgYW50aXRydXN0IGxhdyBhbmQgdGhlIHByb21vdGlvbiBvZiBjb25zdW1lciBwcm90ZWN0aW9uLCB0aGV5IGFyZSB3b2VmdWxseSB1bmRlci1lcXVpcHBlZCBhbmQgbGFjayB0aGUgZW1wb3dlcm1lbnQgZnJvbSByb2J1c3QgZGF0YSBwcm90ZWN0aW9uIGxhd3MgdG8gZW5zdXJlIGZlZGVyYWwgY29tcGxpYW5jZSBvZiBkYXRhIHByaXZhY3kuIENvbXBhcmVkIHRvIHRoZSBFdXJvcGVhbiBVbmlvbiwgYm91bmQgYnkgdGhlIEdlbmVyYWwgRGF0YSBQcm90ZWN0aW9uIFJlZ3VsYXRpb24gKEdEUFIpLCBjdXJyZW50IHJlZ3VsYXRpb25zIHdpdGhpbiB0aGUgVW5pdGVkIFN0YXRlcyBhcmUgbm90IHJlbGV2YW50IGluIG92ZXJzZWVpbmcgZGF0YSBtYW5hZ2VtZW50IGFuZCBzaGFyaW5nIHRvIGVuc3VyZSBhbGwgZGF0YSBpcyBoYW5kbGVkIHdpdGggcHJpdmFjeSwgZmFpcm5lc3MsIGFuZCBhY2NvdW50YWJpbGl0eS4gVGhlIEdEUFIgd2FzIGNyZWF0ZWQgaW4gMjAxOCBhbmQgY29uc2lzdHMgb2YgOTkgaW5kaXZpZHVhbCBhcnRpY2xlcyB0aGF0IGFyZSBjb25zaWRlcmVkIHRoZSB3b3JsZOKAmXMgc3Ryb25nZXN0IHNldCBvZiBkYXRhIHByb3RlY3Rpb24gcnVsZXMsIHdoaWNoIGVuaGFuY2UgaG93IHBlb3BsZSBjYW4gYWNjZXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZW0gYW5kIGxpbWl0cyB3aGF0IG9yZ2FuaXphdGlvbnMgY2FuIGRvIHdpdGggcGVyc29uYWwgZGF0YSAoQnVyZ2VzcywgMjAyMCkuIFVuZm9ydHVuYXRlbHksIHRoZSBVbml0ZWQgU3RhdGVzIGRvZXNu4oCZdCBoYXZlIGEgc2luZ3VsYXIgbGF3IGNvdmVyaW5nIGFsbCBkYXRhIHR5cGVzLiBJbnN0ZWFkLCBpdCBoYXMgYSBtaXggb2YgcnVsZXMgcHV0IHRvZ2V0aGVyIGJ5IHRoZSBIZWFsdGggSW5zdXJhbmNlIFBvcnRhYmlsaXR5IGFuZCBBY2NvdW50YWJpbGl0eSBBY3QgKEhJUFBBKSwgdGhlIEZhaXIgQ3JlZGl0IFJlcG9ydGluZyBBY3QgKEZDUkEpLCB0aGUgRmFtaWx5IEVkdWNhdGlvbmFsIFJpZ2h0cyBhbmQgUHJpdmFjeSBBY3QgKEZFUlBBKSwgdGhlIEdyYW1tLUxlYWNoLUJsaWxleSBBY3QgKEdMQkEpLCB0aGUgRWxlY3Ryb25pYyBDb21tdW5pY2F0aW9ucyBQcml2YWN5IEFjdCAoRUNQQSksIHRoZSBDaGlsZHJlbuKAmXMgT25saW5lIFByaXZhY3kgUHJvdGVjdGlvbiBSdWxlIChDT1BQQSksIHRoZSBWaWRlbyBQcml2YWN5IFByb3RlY3Rpb24gQWN0IChWUFBBKSwgYW5kIHRoZSBGZWRlcmFsIFRyYWRlIENvbW1pc3Npb24gQWN0IChGVENBKSAoS2xvc293c2tpLCAyMDIxKS4gIAoKClRoZSBsYWNrIG9mIHJlZ3VsYXRpb24gaGFzIHJldmVyYmVyYXRpbmcgZWZmZWN0cyBvbiBob3cgY29tcGFuaWVzIGFuZCBvcmdhbml6YXRpb25zIGhhbmRsZSBkYXRhLiBGaXJzdCwgdGhlcmUgYXJlIHNpZ25pZmljYW50IGlzc3VlcyB3aXRoIHJlLWlkZW50aWZpY2F0aW9uIGZyb20gZGF0YSBzZXRzIGJlY2F1c2UgcHJpdmFjeSBhbmQgYW5vbnltaXR5IGFyZSBub3QgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgaW4gZGF0YSBzaGFyaW5nIGFuZCBtYWNoaW5lIGxlYXJuaW5nIChNTCkgbW9kZWwgY3JlYXRpb24uIFNlY29uZCwgbW9zdCBzdGF0ZXMgaGF2ZSB5ZXQgdG8gZXN0YWJsaXNoIGEgY3VycmVudCBtYW5kYXRlIHRvIGluZm9ybSBjb25zdW1lcnMgaG93IHRoZWlyIGRhdGEgaXMgdXNlZC4gQXMgYSByZXN1bHQsIGNvbXBhbmllcyBjYW4gdXNlLCBzaGFyZSwgb3Igc2VsbCBhbnkgZGF0YSB0aGV5IGNvbGxlY3Qgd2l0aG91dCBub3RpZnlpbmcgdGhlIGNvbnN1bWVyIG9mIHdoYXQgdGhleSBhcmUgZG9pbmcgKEtsb3Nvd3NraSwgMjAyMSkuIFRoZSBmb2xsb3ctb24gaW1wYWN0IG9mIHRoZSBsYWNrIG9mIGluZm9ybWVkIGNvbnNlbnQgaXMgdGhhdCBjb21wYW5pZXMgY2FuIHNlbGwgaW5mb3JtYXRpb24gdG8gdGhpcmQgcGFydGllcyB0aGF0IGNhbiBmdXJ0aGVyIHNlbGwsIGFnZ3JlZ2F0ZSwgb3Igc2hhcmUgdGhlIGRhdGEsIGFsbCB0aGUgd2hpbGUgdGhlIGluZGl2aWR1YWwgbmV2ZXIgcHJvdmlkZWQgY29uc2VudCBmb3IgdGhlaXIgaW5mb3JtYXRpb24gdG8gYmUgcHJvbGlmZXJhdGVkIHRocm91Z2hvdXQgdGhlIHB1YmxpYyBkb21haW4uIEZpbmFsbHksIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGxhd3MgcmVxdWlyaW5nIG5vbmRpc2NyaW1pbmF0b3J5IGFuZCB1bmJpYXNlZCBkYXRhLCBtb2RlbHMgY2FuIGZyZXF1ZW50bHkgY3JlYXRlIGJpYXNlZCBhbmQgaW5hY2N1cmF0ZSBzeXN0ZW1zIHRoYXQgcmVzdWx0IGluIGFjdHVhbCBoYXJtIHRocm91Z2hvdXQgc29jaWV0eS4gV2l0aG91dCByb2J1c3QgbGVnaXNsYXRpb24gcmVxdWlyaW5nIG9yZ2FuaXphdGlvbnMgdG8gYmUgbGVnYWxseSBib3VuZCB0byBtYW5hZ2UgZGF0YSBldGhpY2FsbHksIHRoZXJlIGlzIGEgY29uY3JldGUgY2VydGFpbnR5IHRoYXQgbW9kZWxzIHdpbGwgYmUgY3JlYXRlZCB0aGF0IGVuYWJsZSBvcmdhbml6YXRpb25zIHRvIHByaW9yaXRpemUgcHJvZml0IG9yIGluc2lnaHRzIG92ZXIgdGhlIHByaXZhY3kgYW5kIGFub255bWl0eSBvZiB0aGUgY29uc3VtZXIgb3IgY2l0aXplbi4KCiMjIyBGYWNpYWwgUmVjb2duaXRpb24gZnJvbSBCaWFzZWQgRGF0YQoKVG8gYWRkcmVzcyBkYXRhIHByaXZhY3kgaXNzdWVzIHJlZ2FyZGluZyBmYWNpYWwgcmVjb2duaXRpb24gc29mdHdhcmUsIHRoaXMgcGFwZXIgZXhhbWluZWQgdGhlIHByb2plY3QgYnkgR2FydmllLCBmcm9tIDIwMTkuIFRoZSBhcnRpY2xlIHByZXNlbnRzIHZpZ25ldHRlcyB0aGF0IHNob3cgY29tbW9uIHBpdGZhbGxzIGZyb20gdGhlIG1pc3VzZSwgYmlhcywgYW5kIHBpdGZhbGxzIG9mIGZhY2lhbCByZWNvZ25pdGlvbiBhcHBsaWNhdGlvbnMuIFdoaWxlIHRoZSByZXBvcnQgcHJlc2VudHMgb3RoZXIgZGF0YSBldGhpY3MgY29uY2VybnMsIHN1Y2ggYXMgaW5mb3JtZWQgY29uc2VudCBvZiBob3cgb3VyIGRhdGEgaXMgc2hhcmVkIGFuZCBwcm92aWRlcyBleGFtcGxlcyBvZiBnZW5lcmFsIGFub255bWl0eSBjb25jZXJucywgdGhlIGZvY3VzIGlzIGhvdyBsYXcgZW5mb3JjZW1lbnQgbGV2ZXJhZ2VzIGZhY2lhbCByZWNvZ25pdGlvbiB0ZWNobm9sb2d5IGZyb20gcGhvdG9zIGNvbGxlY3RlZCB3aGVuIEFtZXJpY2FucyBhcHBseSBmb3IgYSBkcml2ZXLigJlzIGxpY2Vuc2UuIFVuYmVrbm93bnN0IHRvIG1hbnkgY2l0aXplbnMsIG91ciBwaWN0dXJlcyB0aGF0IHdlcmUgdGFrZW4gd2hlbiB3ZSBhcHBsaWVkIGZvciBkcml2ZXLigJlzIGxpY2Vuc2VzIGhhdmUgYmVlbiB1c2VkIHRvIGNvbnN0cnVjdCB0cmFpbmluZyBzZXRzIGZvciBmYWNpYWwgcmVjb2duaXRpb24gc3lzdGVtcyBjdXJyZW50bHkgZW1wbG95ZWQgYnkgdGhlIHBvbGljZS4gV2hlbiB0aGUgc3lzdGVtIGlzIGVtcGxveWVkLCB0aGUgcG9zc2liaWxpdHkgZXhpc3RzIHRoYXQgaXQgd2lsbCBkcmF3IGFuIGluY29ycmVjdCBjb25jbHVzaW9uIGFuZCBhdHRyaWJ1dGUgYSBjcmltaW5hbCBhY3QgdG8gYW4gaW5ub2NlbnQgY2l0aXplbiBkdWUgdG8gYSBiaWFzZWQgbW9kZWwuIEFkZGl0aW9uYWxseSwgYnkgdGhlIGluY2x1c2lvbiBvZiB0aGVzZSBwaG90b3MgaW50byBsYXcgZW5mb3JjZW1lbnQgZGF0YWJhc2VzLCB0aGUgcmlnaHQgdG8gcHJpdmFjeSBpcyBzZXJpb3VzbHkgaW5mcmluZ2VkIHVwb24gYnkgdGhlIGdvdmVybm1lbnQuICAKCkV2ZW4gdGhvdWdoIHRoZSBtb3JlIG9idmlvdXMgZGFuZ2VyIHRoYXQgY2FuIGFyaXNlIGZyb20gcG9saWNlIHVzaW5nIGZhY2lhbCByZWNvZ25pdGlvbiBzb2Z0d2FyZSBpcyBpbmNvcnJlY3QgY29uY2x1c2lvbnMsIG90aGVyIGhhemFyZHMgY2hhbGxlbmdlIHRoZSBsZWdpdGltYWN5IG9mIHRoZSBzb2Z0d2FyZSBmb3IgcG9saWNlIHVzZS4gQXMgcHJldmlvdXNseSBpZGVudGlmaWVkIGluIHRoaXMgcGFwZXIsIHRoZXJlIGFyZSBzaWduaWZpY2FudCBpbXBhY3RzIG9uIHBhcnRpY3VsYXIgZ3JvdXBzIHdpdGhvdXQgcmVndWxhdGlvbnMgdG8gZ292ZXJuIGhvdyBNTCBzeXN0ZW1zIGFyZSBjcmVhdGVkIGFuZCBlbXBsb3llZC4gVGhlIHJhY2lhbCBiaWFzIHJlbWFpbnMgYSBwZXJzaXN0ZW50IGlzc3VlIGluIG1hbnkgZmFjaWFsIHJlY29nbml0aW9uIHN5c3RlbXMgZHVlIHRvIGEgbGFjayBvZiB0cmFuc3BhcmVuY3kgb24gd2hhdCBpbmZvcm1hdGlvbiBjcmVhdGVkIHRoZSBtb2RlbC4gTWFueSB0ZWNobm9sb2dpZXMgcHJvdmlkZSB2ZXJ5IGhpZ2ggbGV2ZWxzIG9mIGFjY3VyYWN5IGluIGFjY3VyYXRlbHkgaWRlbnRpZnlpbmcgbWlkZGxlLWFnZWQgd2hpdGUgbWFsZXMgYnV0IHN1ZmZlciB0byBkZWxpdmVyIGFjY3VyYXRlIGNvbmNsdXNpb25zIHdpdGggb3RoZXIgZ2VuZGVycyBhbmQgcmFjaWFsIGdyb3Vwcy4gSW4gYSBzdHVkeSBjb25kdWN0ZWQgaW4gMjAxOCBlbnRpdGxlZCB0aGUgR2VuZGVyIFNoYWRlcyBQcm9qZWN0LCBpdCB3YXMgZm91bmQgdGhhdCBieSBldmFsdWF0aW5nIGZhY2lhbCByZWNvZ25pdGlvbiBzeXN0ZW1zIGJ5IElCTSBhbmQgTWljcm9zb2Z0LCBlcnJvciByYXRlcyB3ZXJlIHVwIHRvIDM0JSBoaWdoZXIgZm9yIGRhcmtlci1za2lubmVkIGZlbWFsZXMgdGhhbiBmb3IgbGlnaHQtc2tpbm5lZCBtYWxlcyAoTmFqaWJpLCAyMDIwKS4gQnkgZW1wbG95aW5nIGZhY2lhbCByZWNvZ25pdGlvbiBzeXN0ZW1zIHRoYXQgZmFpbCB0byBhY2hpZXZlIGFuIGVxdWFsIGxldmVsIG9mIGFjY3VyYWN5IGFjcm9zcyBhbGwgZ3JvdXBzIGluIHRoZSBjaXRpemVucnksIG5lZ2F0aXZlIHJlcGVyY3Vzc2lvbnMgdG8gdGhvc2UgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCB3aWxsIHByb3ZlIGluZXZpdGFibGUuCgpUaGUgc291cmNlIG9mIGhhcm0gaW4gbWFueSBpbmFjY3VyYXRlIGZhY2lhbCByZWNvZ25pdGlvbiBzeXN0ZW1zIGNvbWVzIGZyb20gYSByZXByZXNlbnRhdGlvbiBiaWFzLiBUcmFpbmluZyBzZXRzIHVzZWQgdG8gY3JlYXRlIHRoZSBtb2RlbHMgZXNzZW50aWFsbHkgY29tcHJpc2UgbWlkZGxlLWFnZWQgd2hpdGUgbWFsZSBpbWFnZXMuIFdoaWxlIHRoZSBzeXN0ZW1zIGFyZSB2ZXJ5IGFjY3VyYXRlIHdpdGggdGhlIHBpY3R1cmVzIGl0IGhhcyBiZWVuIHRyYWluZWQgdG8gaWRlbnRpZnksIGl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgbGFyZ2VyIHVzZSBwb3B1bGF0aW9uIChTdXJlc2gsIDIwMjEpLiBCeSBjb25zdHJ1Y3RpbmcgdGhlIHRyYWluaW5nIHNldHMgdXNpbmcgYWR2ZXJzYXJpYWwgbGVhcm5pbmcgYW5kIGNvdW50ZXJmYWN0dWFsIG1vZGVscyBhcyBzZWVuIGluIG90aGVyIE1MIHN5c3RlbXMgdG8gY3JlYXRlIGZhaXIgY29uY2x1c2lvbnMgcmVnYXJkbGVzcyBvZiB0aGUgaW5jbHVzaW9uIG9mIHNlbnNpdGl2ZSB2YXJpYWJsZXMgc3VjaCBhcyByYWNlIGFuZCBnZW5kZXIsIGZhY2lhbCByZWNvZ25pdGlvbiBzeXN0ZW1zIHRyYWluaW5nIHNldHMgY2FuIGJlIHB1cnBvc2VmdWxseSBidWlsdCB0byBiZWNvbWUgbW9yZSBlcXVpdGFibGUgYW5kIHJlcHJlc2VudGF0aXZlIG9mIHRoZWlyIHVzZSBwb3B1bGF0aW9uLiBBZGRpdGlvbmFsbHksIGJ5IHBlcmZvcm1pbmcgZXRoaWNhbCBhdWRpdGluZyBieSBpbmRlcGVuZGVudCBzb3VyY2VzLCBmYWNpYWwgcmVjb2duaXRpb24gc3lzdGVtcyBjYW4gYmUgaGVsZCBhY2NvdW50YWJsZSBmb3IgbWV0aG9kb2xvZ2ljYWwgYmlhc2VzIChOYWppYmksIDIwMjApLgoKV2hlbiBrbm93biBiaWFzIGV4aXN0cyBpbiB0aGUgdHJhaW5pbmcgZGF0YSBzZXQgZm9yIGZhY2lhbCByZWNvZ25pdGlvbiBhbmQgaXMgbGV2ZXJhZ2VkIGZvciBwb2xpY2UgdXNlLCBhbiBBcnRpZmljaWFsIEludGVsbGlnZW5jZSAoQUkpIHJlY29tbWVuZGF0aW9uIHN5c3RlbSBjb3VsZCBiZSBlbXBsb3llZCB0byBlbnN1cmUgb3V0cHV0cyBkbyBub3QgbmVnYXRpdmVseSBpbXBhY3Qgc3BlY2lmaWMgcG9wdWxhdGlvbiBncm91cHMuIEZvciBleGFtcGxlLCBhbiBBSSBzeXN0ZW0gY291bGQgYmUgdHJhaW5lZCB0byBpZGVudGlmeSB3aGVuIGl0IGlzIHF1ZXJpZWQgdG8gcHJvZHVjZSByZXN1bHRzIGJlbG93LXNwZWNpZmllZCBhY2N1cmFjeSBsZXZlbHMuIFdoZXRoZXIgdGhlIGVycm9yIGNvbWVzIGZyb20gYSByZXByZXNlbnRhdGlvbiwgbGVhcm5pbmcsIG9yIGFnZ3JlZ2F0aW9uIGJpYXMgd2l0aGluIHRoZSBkYXRhLCBhIHN5c3RlbSBkZXNpZ25lZCB0byBjcmVhdGUgYW4gb3V0cHV0IGFuZCBhdWRpdCBpdHNlbGYgd291bGQgYmVuZWZpdCBmYWNpYWwgcmVjb2duaXRpb24gc3lzdGVtcy4gSW4gcHJhY3RpY2UsIHRoZSBzeXN0ZW0gY291bGQgYmUgcXVlcmllZCB0byBwcm92aWRlIGEgbWF0Y2ggZnJvbSBhbiBpbWFnZSB3aGlsZSBzaW11bHRhbmVvdXNseSBhc3Nlc3NpbmcgdGhlIGxldmVsIG9mIGFjY3VyYWN5IHByZWRpY3RlZCBiYXNlZCBvbiB0aGUgcGljdHVyZSBwcm92aWRlZC4gVGhlIHRvb2wgY291bGQgcHJvdmlkZSBhbiBhbGVydCB0byBlbnN1cmUgaHVtYW4gaW52b2x2ZW1lbnQgd2l0aGluIHRoZSBkZWNpc2lvbi1tYWtpbmcgbG9vcCB3aGVuIGl0IGhhcyBiZWVuIGFza2VkIHRvIGlkZW50aWZ5IGluZGl2aWR1YWxzIHdpdGggbG93LWFjY3VyYWN5IHByZWRpY3Rpb25zLiBCeSBjcmVhdGluZyBhIHN5c3RlbSB0aGF0IGNhbiByZWNvZ25pemUgYXJlYXMgd2hlcmUgaXQgc3RydWdnbGVzIHRvIHByb3ZpZGUgYWNjdXJhdGUgY29uY2x1c2lvbnMgd2hpbGUgdGFraW5nIGFkZGl0aW9uYWwgc3RlcHMgdG8gY3JlYXRlIG1vcmUgcmVwcmVzZW50YXRpdmUgdHJhaW5pbmcgZGF0YSBzZXRzLCBmYWNpYWwgcmVjb2duaXRpb24gc3lzdGVtcyB3b3VsZCBtYWtlIG1vcmUgZmFpciBjb25jbHVzaW9ucyBmb3IgYWxsIGdyb3Vwcy4gCgojIyMgR2Vub21pYyBQcml2YWN5CgpXaXRoIHRoZSBwcm9saWZlcmF0aW9uIG9mIGNvbXBhbmllcyBvZmZlcmluZyBnZW5vbWljIHNlcXVlbmNpbmcgc2VydmljZXMgdG8gc2NyZWVuIGZvciBkaXNlYXNlIGFuZCBpbGx1bWluYXRlIGEgZmFtaWx54oCZcyBnZW5lYWxvZ3ksIHByaXZhY3kgY29uY2VybnMgaGF2ZSBhcmlzZW4uIEluIFRoZSBOZXcgWW9yayBUaW1lcyBQcml2YWN5IFByb2plY3QgdGFja2xpbmcgdGhpcyBpc3N1ZSwgQmFsYSBwcm92aWRlcyBudW1lcm91cyBleGFtcGxlcyBvZiB0aGUgZGFuZ2VycyBvZiBlbmxpc3RpbmcgZGlyZWN0LXRvLWNvbnN1bWVyIGdlbmV0aWMgc2VxdWVuY2luZyBzZXJ2aWNlcyBhbmQgdGhlIGltcGFjdCB0aGF0IGl0IGNhbiBoYXZlIG9uIHRoZSBjdXN0b21lcuKAmXMgZmFtaWx5LiBUaGUgdHJvdWJsZXMgYXJpc2UgZnJvbSB0aGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGdhdGhlcmVkIGZyb20gb25lIHBlcnNvbuKAmXMgZ2VuZXRpYyBjb2RlLiBXaGVuIHRoZSBzYWxpdmEgc2FtcGxlIGlzIHByb3ZpZGVkIHRvIHRoZSBjb21wYW55LCB0aGUgY3VzdG9tZXIgY29uc2VudGVkIHRvIHNoYXJlIHByaXZhdGUgaGVhbHRoIGRhdGEgZm9yIG5vdCBvbmx5IHRoZW1zZWx2ZXMgYnV0IHRoZWlyIGVudGlyZSBmYW1pbHkuIEluIG9uZSBleGFtcGxlLCBpZiBhIHBhcmVudCBzaGFyZXMgdGhlaXIgY2hpbGRyZW7igJlzIGdlbmV0aWMgaW5mb3JtYXRpb24gb24gcHVibGljIHdlYnNpdGVzLCBwYXJlbnRzIGFyZSBmb3JldmVyIGV4cG9zaW5nIHRoZWlyIHBlcnNvbmFsIGhlYWx0aCBkYXRhIHdlbGwgYmVmb3JlIHRoZSBhZ2Ugb2YgY29uc2VudCAoQmFsYSwgMjAyMCkuIEJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgcmVndWxhdGlvbnMgZ292ZXJuaW5nIGRlLWlkZW50aWZpY2F0aW9uIHByYWN0aWNlcywgYW4gZW52aXJvbm1lbnQgZXhpc3RzIHdoZXJlIGdlbm9taWMgcHJpdmFjeSBpcyBhbG1vc3QgdW5hdHRhaW5hYmxlIHRvIHRob3NlIHdobyBoYXZlIG9wdGVkIHRvIHNoYXJlIHRoZWlyIGdlbmV0aWMgc2VxdWVuY2UuIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpdCBpcyBhIGNlcnRhaW50eSB0aGF0IHRoZSByZW1haW5kZXIgb2YgdGhlIGV4dGVuZGVkIGZhbWlseSBkaWQgbm90IGNvbnNlbnQgdG8gaGF2ZSB0aGVpciBnZW5ldGljIGNvZGUgc2hhcmVkIHdoZW4gdGhlIHBhcmVudHMgZGVjaWRlZCB0byBjb25kdWN0IGdlbmV0aWMgdGVzdGluZyBvbiB0aGVpciBjaGlsZC4gTm90IG9ubHkgZG8gY3VycmVudCByZWd1bGF0aW9ucyBsYWNrIHRoZSBtYW5kYXRlIHRvIGFkZXF1YXRlbHkgZGUtaWRlbnRpZnkgY29uc3VtZXJzLCBidXQgdGhleSBhbHNvIGZhaWwgdG8gZW5hY3QgcG9saWNpZXMgdGhhdCBlbnN1cmUgYWxsIHBlcnNvbnMgaWRlbnRpZmllZCB0aHJvdWdoIHRlc3RpbmcgcHJvdmlkZSBjb25zZW50LgoKQmFsYSBjb250aW51ZXMgdGhlIHByb2plY3QgYnkgaWxsdXN0cmF0aW5nIHRoZSBuZWdhdGl2ZSByZXBlcmN1c3Npb25zIG9mIG92ZXJzaGFyaW5nIGNoaWxkcmVuJ3MgcGVyc29uYWwgaW5mb3JtYXRpb24uIFVuZm9ydHVuYXRlbHksIHdoZW4gcGFyZW50cyBzaGFyZSB0aGUgY2hpbGQncyBnZW5ldGljIGluZm9ybWF0aW9uLCB0aGV5IGhhdmUgdGFrZW4gdGhlIHJpZ2h0IHRvIHByaXZhY3kgYXdheSBmcm9tIHRoZSBjaGlsZCBhbmQgdGhlIHJpZ2h0IG5vdCB0byBrbm93IGNlcnRhaW4gaW5mb3JtYXRpb24uIFJlZmVyZW5jaW5nIHRoZSAxOTc3IFdoYWxlbiB2cy4gUm9lIGRlY2lzaW9uLCBCYWxlIG91dGxpbmVzIHR3byBjcml0aWNhbCBjb21wb25lbnRzIG9mIHRoZSByaWdodCB0byBwcml2YWN5OyB0aGUgaW5kaXZpZHVhbCBpbnRlcmVzdCBpbiBhdm9pZGluZyBkaXNjbG9zdXJlIG9mIHBlcnNvbmFsIG1hdHRlcnMgYW5kIHRoZSBpbnRlcmVzdCBpbiBpbmRlcGVuZGVuY2UgaW4gbWFraW5nIGNlcnRhaW4ga2luZHMgb2YgaW1wb3J0YW50IGRlY2lzaW9ucyAoQmFsZSwgMjAyMCkuIFdoaWxlIGl0IG1heSBiZSBiZW5lZmljaWFsIGZvciBhIHBhcmVudCB0byB1bmRlcnN0YW5kIGlmIHRoZWlyIGNoaWxkcmVuIGNhcnJ5IGhlcmVkaXRhcnkgZ2VuZXMgbGlua2VkIHRvIGRpc2Vhc2UsIHRoZSBwYXJlbnRzIGhhdmUgcmVtb3ZlZCB0aGUgcmlnaHQgdG8gcHJpdmFjeSBmcm9tIHRoZSBjaGlsZCBieSBzaGFyaW5nIHRoZSBnZW5ldGljIHNlcXVlbmNlLiBGdXJ0aGVybW9yZSwgd2hlbiBhIGdlbmV0aWMgc2VxdWVuY2UgaXMgc2hhcmVkIHdpdGggdGhlIGNvbXBhbnksIGluZm9ybWF0aW9uIGNhbiBiZSBnYXRoZXJlZCBvbiB0aGUgY3VzdG9tZXIncyBlbnRpcmUgZmFtaWx5LCBwcmVzZW50aW5nIGNoYWxsZW5nZXMgdG8gaW5mb3JtZWQgY29uc2VudC4gIAoKVGhlIHNvdXJjZSBvZiBoYXJtIGluIHRoZSB1c2Ugb2YgY29tcGFuaWVzIGxpa2UgMjNhbmRNZSwgTXlIZXJpdGFnZSwgYW5kIEdFRG1hdGNoIGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpbmhlcmVudCBiaWFzIHdpdGhpbiBhIG1vZGVsIG9yIGRhdGFiYXNlLiBJbnN0ZWFkLCBpdCBpbGx1c3RyYXRlcyBob3cgYSBsYWNrIG9mIHJlZ3VsYXRpb24gZ292ZXJuaW5nIHRoZSByaWdodCB0byBwcml2YWN5IHJldmVyYmVyYXRlcyB0aHJvdWdoIGdlbmVyYXRpb25zIG9mIGNpdGl6ZW5zLiBUaGUgVW5pdGVkIFN0YXRlcyBmb2xsb3dzIGEgdHJhZGl0aW9uIG9mIGFsbG93aW5nIHBhcmVudHMgdG8gbWFrZSBsZWdhbCBkZWNpc2lvbnMgb24gYmVoYWxmIG9mIHRoZWlyIGNoaWxkcmVuLiBIb3dldmVyLCB3aGF0IGhhcHBlbnMgd2hlbiBubyByZWd1bGF0aW9uIG9yIGxhdyBkaWN0YXRlcyB3aGF0IGluZm9ybWF0aW9uIGEgcGFyZW50IGNhbiBzaGFyZSBhYm91dCB0aGVpciBjaGlsZD8gSW4gY291bnRyaWVzIGxpa2UgRnJhbmNlIGFuZCBBdXN0cmlhLCBjaGlsZHJlbiBjYW4gc3VlIHRoZWlyIHBhcmVudHMgZm9yIG92ZXJzaGFyaW5nIHBlcnNvbmFsIGluZm9ybWF0aW9uLiBJbiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlcmUgYXJlIG5vIHN1Y2ggcmVndWxhdGlvbnMuIEV2ZW4gdGhvdWdoIHRoZSBBbWVyaWNhbiBBY2FkZW15IG9mIFBlZGlhdHJpY3MgYW5kIEFtZXJpY2FuIENvbGxlZ2Ugb2YgTWVkaWNhbCBHZW5ldGljcyBhbmQgR2Vub21pY3Mgc3Ryb25nbHkgZGlzY291cmFnZSBob21lLWtpdCBnZW5ldGljIHRlc3Rpbmcgb24gY2hpbGRyZW4sIHRoZSBwcmFjdGljZSBjb250aW51ZXMuIFBlcnNvbmFsIG1lZGljYWwgaW5mb3JtYXRpb24gaXMgc2hhcmVkLCBhbmFseXplZCwgYW5kIHNvbGQsIGZvcmV2ZXIgc2hhcmluZyBwcml2YXRlIGluZm9ybWF0aW9uIHdpdGggdGhlIHdvcmxkIChCYWxlLCAyMDIwKS4KCiMjIFBhcnQgVHdvCgojIyMgQ3VycmVudCBTdGF0ZSBvZiBSZWd1bGF0b3J5IFNob3J0ZmFsbHMgYXMgc2VlbiBpbiBTb3JyZWxsIHYuIElNUyBIZWFsdGgKClByZXZpb3VzbHkgaWRlbnRpZmllZCBpbiB0aGlzIHBhcGVyIGFyZSBpbnN0YW5jZXMgd2hlcmUgdGhlIG5lZWQgZm9yIHJlZ3VsYXRpb25zIHdpdGhpbiB0aGUgY3VycmVudCBVbml0ZWQgU3RhdGVzIGNpdmlsIGNvZGUgYWxsb3dzIGZvciBjb21wYW5pZXMgdG8gYmVoYXZlIGluIHRoZWlyIGJlc3QgaW50ZXJlc3QgcmF0aGVyIHRoYW4gd2l0aCBhIHByaW9yaXR5IHBsYWNlZCBvbiBkYXRhIHByaXZhY3kuIFRoZSBwcml2YWN5IGxhYiBwcm9qZWN0IHRoYXQgYWRkcmVzc2VzIGhvdyB0aGUgY3VycmVudCBmcmFtZXdvcmsgb2YgVW5pdGVkIFN0YXRlcyBwcml2YWN5IHByb3RlY3Rpb24gbGF3cyBhcmUgYXQgdGhlIGRpc2NyZXRpb24gb2YgU3RhdGUgcmVndWxhdG9yeSBhZ2VuY2llcyBjdXJ0YWlsZWQgYnkgYSBwYXRjaHdvcmsgb2YgTmF0aW9uYWwgQWN0cyBhbmQgcnVsZXMgaXMgYW4gZXZhbHVhdGlvbiBvZiBVLlMuIFN1cHJlbWUgQ291cnQgQ2FzZSBTb3JyZWxsIHYuIElNUyBIZWFsdGggSW5jLiBUaGUgcHJvamVjdCBleHBsb3JlcyBpc3N1ZXMgdGhhdCBoYXZlIGFyaXNlbiBmcm9tIHRoZSBISVBBQSAxOTkwcyBzdHlsZWQgcHJvdGVjdGlvbiBhbmQgcmVmZXJlbmNlcyBob3cgbW9yZSBlZmZvcnQgY2FuIGJlIHRha2VuIGZyb20gb3JnYW5pemF0aW9ucyB0aGF0IGNvbGxlY3QgbWVkaWNhbCBpbmZvcm1hdGlvbiB0byBzdGlsbCByZWFwIGJlbmVmaXQgZnJvbSB0aGUgY29sbGVjdGVkIGRhdGEgd2hpbGUgcHJvdGVjdGluZyB0aGUgcGF0aWVudOKAmXMgcHJpdmFjeSAoU3dlZW5leSwgbi5kKS4gIAoKVGhlIGNvdXJ0IGNhc2UgcHJlc2VudHMgYW4gYXJndW1lbnQgZnJvbSBTb3JyZWxsICh0aGUgUGV0aXRpb25lcikgdGhhdCBJTVMgSGVhbHRoICh0aGUgUmVzcG9uZGVudCkgZmFpbHMgdG8gcHJvcGVybHkgZGUtaWRlbnRpZnkgcGF0aWVudCBpbmZvcm1hdGlvbiB1bmRlciBlc3RhYmxpc2hlZCBWZXJtb250IFN0YXRlIGFuZCBGZWRlcmFsIEhJUEFBIHJlZ3VsYXRpb25zLiBVbmRlciBWZXJtb250IFN0YXRlIExhdyBhbmQgSElQQUEgcmVndWxhdGlvbnMsIGFsbCBwYXRpZW50IGRhdGEgbXVzdCBiZSBzdWZmaWNpZW50bHkgZGUtaWRlbnRpZmllZCBiZWZvcmUgc2hhcmluZyBpdCBiZXlvbmQgdGhlIHBoYXJtYWN5IHRoYXQgY29sbGVjdGVkIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY2FyZSBvZiB0aGUgcGF0aWVudCAoU3dlZW5leSwgbi5kLikuIER1cmluZyB0aGUgaGVhcmluZywgdGhlIFBldGl0aW9uZXIgYXJndWVzIHRoYXQgdGhlIGRlLWlkZW50aWZpY2F0aW9uIGFwcHJvYWNoIHVzZWQgYnkgSU1TIGRvZXMgbm90IGFkZXF1YXRlbHkgcHJvdGVjdCB0aGUgcGF0aWVudCdzIGlkZW50aXR5LiBQYXRpZW50IGRhdGEgc2hhcmVkIGJ5IElNUyBoZWFsdGggaW5jbHVkZSB0aGUgcHJlc2NyaWJlcidzIG5hbWUgYW5kIGFkZHJlc3MsIHRoZSBuYW1lLCBkb3NhZ2UsIGFuZCBxdWFudGl0eSBvZiB0aGUgZHJ1ZyBwcmVzY3JpYmVkLCB0aGUgZGF0ZSBhbmQgbG9jYXRpb24gYXQgd2hpY2ggdGhlIHByZXNjcmlwdGlvbiB3YXMgZmlsbGVkLCBhbmQgdGhlIHBhdGllbnQncyBhZ2UgYW5kIGdlbmRlciAoU3dlZW5leSwgbi5kLikuIFRocm91Z2ggbW9kZXJuIHByYWN0aWNlcywgcmUtaWRlbnRpZmljYXRpb24gb2YgdGhlIHBhdGllbnRzIHdhcyBwb3NzaWJsZSwgYW5kIHRoZSBjb3VydCB3YXMgcHJlc2VudGVkIGV4YW1wbGVzIHdoZXJlIFN3ZWVuZXkgd2FzIGFibGUgdG8gYWNjdXJhdGVseSBpZGVudGlmeSAyMCBvdXQgb2YgMjIgcGFydGljaXBhbnRzIGluIGEgZGF0YSBzZXQgdGFrZW4gZnJvbSBzaW1pbGFyIGluZm9ybWF0aW9uIHRoYXQgSU1TIEhlYWx0aCByZWxlYXNlZCAoU3dlZW5leSwgbi5kLikuCgpPdmVyYWxsLCB0aGUgY2FzZSBpbGx1c3RyYXRlcyB3ZWFrIHByaXZhY3kgcmVndWxhdGlvbnMnIGltcGFjdCBvbiBwcml2YWN5IHByb3RlY3Rpb24uIEFzIHRoZSBtb25ldGFyeSB2YWx1ZSBmcm9tIGRhdGEgYW5hbHlzaXMgYW5kIGN1c3RvbWVyIGluZm9ybWF0aW9uIGJlY29tZXMgbW9yZSB2YWx1YWJsZSwgYWRkaXRpb25hbCBydWxlcyBhcmUgcmVxdWlyZWQgdG8gZW5zdXJlIGN1c3RvbWVyIGFuZCBwYXRpZW50IGFub255bWl0eSB3aGlsZSBtYWludGFpbmluZyB0aGUgYmVuZWZpdCBmcm9tIHJlc2VhcmNoLiBVbmZvcnR1bmF0ZWx5LCBjdXJyZW50IEhJUEFBIHJlZ3VsYXRpb25zIGFuZCBVLlMuIFN0YXRlIGd1aWRlbGluZXMgZm9yIGRlLWlkZW50aWZpY2F0aW9uIGhhdmUgcHJvdmVuIHRvIGJlIGluYWRlcXVhdGUgaW4gZW5zdXJpbmcgdGhhdCBjb21wYW5pZXMgY29uZHVjdCBkYXRhIHNoYXJpbmcgYW5kIGRhdGEgc2FsZXMgdG8gdGhpcmQgcGFydGllcyBhY2hpZXZpbmcgYW5vbnltaXR5IG9mIHRoZSBwYXJ0aWNpcGFudHMgaW4gdGhlIGRhdGEgc2V0LgoKIyMjIEZhY2lhbCBSZWNvZ25pdGlvbiBEZS1JZGVudGlmaWNhdGlvbiBFZmZvcnRzCgpQYXJ0IG9uZSBvZiB0aGlzIHBhcGVyIHByZXNlbnRlZCBwcm9qZWN0cyBpbGx1bWluYXRpbmcgdGhlIGhhcm0gdGhhdCBjYW4gb2NjdXIgZnJvbSBiaWFzZWQgZmFjaWFsIHJlY29nbml0aW9uIHN5c3RlbXMgYXMgdGhlIHRlY2hub2xvZ3kgZ2FpbnMgYWNjZXB0YW5jZSBkZXNwaXRlIGl0cyBwcml2YWN5IHNob3J0ZmFsbHMuIEhvd2V2ZXIsIGZhY2lhbCByZWNvZ25pdGlvbiBzeXN0ZW1zIGFuZCB2aWRlbyBzdXJ2ZWlsbGFuY2UgaXNzdWVzIGNhbiBiZSBzb2x2ZWQgYnkgZW1wbG95aW5nIG5vdmVsIHRlY2hub2xvZ2llcy4gVG8gcHJvdGVjdCB0aGUgcHJpdmFjeSBvZiBpbmRpdmlkdWFscywgaW1hZ2VzIGNhcHR1cmVkIGluIHN0YW5kYXJkIHN1cnZlaWxsYW5jZSBzeXN0ZW1zIHNob3VsZCBiZSBkZS1pZGVudGlmaWVkLiBXaGVuIGNvdXBsZWQgd2l0aCBmYWNpYWwgcmVjb2duaXRpb24gc29mdHdhcmUsIGEgc3lzdGVtIHRoYXQgZmFpbHMgdG8gZGUtaWRlbnRpZnkgaW5kaXZpZHVhbHMgaW4gYSBjaXR5LXdpZGUgc3VydmVpbGxhbmNlIHN5c3RlbSBjb3VsZCBlZmZlY3RpdmVseSB0cmFjayBzaW5nbGUgaW5kaXZpZHVhbHMgdGhyb3VnaG91dCB0aGUgY292ZXJhZ2UgYXJlYSAoTmV3dG9uLCAyMDAzKS4gV2hpbGUgdGhlIE5ldyBZb3JrIFRpbWVzIHByb2plY3QgaW4gcGFydCBvbmUgZGVzY3JpYmVzIHdoYXQgY291bGQgb2NjdXIgZnJvbSBpbmFjY3VyYXRlIHN5c3RlbXMsIG90aGVyIGVmZm9ydHMgZXhpc3QgdG8gZW5zdXJlIHRoYXQgdW5pbmZvcm1lZCBjaXRpemVuc+KAmSBwcml2YWN5IGFuZCBhbm9ueW1pdHkgYXJlIGFjaGlldmVkIHRocm91Z2ggZGUtaWRlbnRpZmljYXRpb24gZnJvbSBzdGFuZGFyZCB2aWRlbyBzdXJ2ZWlsbGFuY2UgcHJhY3RpY2VzLiBUaGUgdGVjaG5pcXVlIHByZXNlbnRlZCBieSBOZXd0b24gaW4gdGhlIGRhdGEgcHJpdmFjeSBsYWIgcHJvamVjdCBpbGx1c3RyYXRlcyBob3cgZmFjaWFsIHJlY29nbml0aW9uIHN5c3RlbXMgY2FuIGNvbnRpbnVlIHRvIGJlIHVzZWQgd2l0aG91dCBpbmZyaW5naW5nIG9uIHRoZSByaWdodCB0byBwcml2YWN5IG9mIHRoZSBjaXRpemVucnkgKE5ld3RvbiwgMjAwMykuCgpJbiB0aGUgcHJpdmFjeSBsYWIgcHJvamVjdCwgTmV3dG9uIG1ha2VzIGEgcG9pbnQgdG8gcmVpdGVyYXRlIHRoZSB2YWx1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3lzdGVtcy4gVGhlIHN5c3RlbXMgcHJvcG9zZWQgYXR0ZW1wdCB0byBlbmFibGUgdGhlIHNoYXJpbmcgb2YgdmlkZW8gZGF0YSB3aXRoIHNjaWVudGlmaWMgYXNzdXJhbmNlcyBvZiBwcml2YWN5IHByb3RlY3Rpb24gd2hpbGUga2VlcGluZyB0aGUgZGF0YSBwcmFjdGljYWxseSB1c2VmdWwgKE5ld3RvbiwgMjAwMykuIFRoZSBwcm9qZWN0J3MgZ29hbCB3YXMgdG8gZGUtaWRlbnRpZnkgdGhlIGZhY2lhbCBmZWF0dXJlcyB0byBhIGxldmVsIHdoZXJlIGFub255bWl0eSBpcyBhY2hpZXZlZCB3aGlsZSBsZWF2aW5nIGtleSBkZWZpbmluZyBjaGFyYWN0ZXJpc3RpY3Mgd2hpbGUgc2ltdWx0YW5lb3VzbHkgZW5jcnlwdGluZyB0aGUgaW1hZ2UgZm9yIHJlLWlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLiBQcmV2aW91c2x5IGF0dGVtcHRlZCB0ZWNobmlxdWVzLCBzdWNoIGFzIGNvdmVyaW5nIHRoZSBleWVzIG9yIGFsdGVyaW5nIHBpeGVsIGNvbG9ycywgZmFpbGVkIHRvIGFkZXF1YXRlbHkgcHJvdGVjdCBpbWFnZXMgZnJvbSBmYWNpYWwgcmVjb2duaXRpb24gc29mdHdhcmUuCgpUaGVyZSB3b3VsZCBiZSBzZXZlcmFsIHByaXZhY3kgaW1wbGljYXRpb25zIGlmIE5ld3RvbidzIHRlY2huaXF1ZXMgd2VyZSB3aWRlbHkgYWRvcHRlZC4gRmlyc3QsIHRoZXJlIGlzIGEgZGVjcmVhc2VkIHJpc2sgdGhhdCBhbiBpbmRpdmlkdWFsIGNvdWxkIGJlIGRpc2NyaW1pbmF0ZWQgYWdhaW5zdCB0aHJvdWdoIGluYWNjdXJhdGUgZmFjaWFsIHJlY29nbml0aW9uIHNvZnR3YXJlIHJ1bm5pbmcgYWdhaW5zdCBjb21tb24gdmlkZW8gc3VydmVpbGxhbmNlLiBBcyBwcmVzZW50ZWQgaW4gcGFydCBvbmUgb2YgdGhpcyBwYXBlciwgc2lnbmlmaWNhbnQgYWNjdXJhY3kgaXNzdWVzIG5lZ2F0aXZlbHkgaW1wYWN0IHNwZWNpZmljIGdyb3Vwcy4gTmV4dCwgd2hlbiBkZS1pZGVudGlmaWNhdGlvbiBpcyBjb25kdWN0ZWQgYmVmb3JlIGFuYWx5c2lzIGluIGZhY2lhbCByZWNvZ25pdGlvbiBzb2Z0d2FyZSBzeXN0ZW1zLCBhbm90aGVyIGxheWVyIG9mIHByb3RlY3Rpb24gaXMgYWZmb3JkZWQgdG8gdGhlIHByaXZhY3kgb2YgaGlzdG9yaWNhbGx5IGluZnJpbmdlZCBncm91cHMuIEZpbmFsbHksIGNpdGl6ZW5zIGFyZSBub3cgYWZmb3JkZWQgdGhlIHJpZ2h0IHRvIHByaXZhY3kuIFdoZW4gZGF0YSBzZXRzIGFyZSBzaGFyZWQgY29udGFpbmluZyBpbWFnZXMgdXNpbmcgTmV3dG9uJ3MgdGVjaG5pcXVlIG9mIHByZS1wcm9jZXNzaW5nIGZhY2lhbCBpbWFnZXMgYmVmb3JlIHRoZSBmYWNlcyBhcmUgaW5jbHVkZWQgaW4gYSBkYXRhIHNldCwgdGhlIHBlb3BsZSBpbiB0aGUgZGF0YSBzZXQgYXJlIHNhZmUgZnJvbSByZS1pZGVudGlmaWNhdGlvbiB3aXRob3V0IGFuIGVuY3J5cHRpb24ga2V5LiBUaGUgb3duZXIgb2YgdGhlIGRhdGEgc2V0IG9mIGZhY2lhbCBpbWFnZXMgd2lsbCBub3cgYmUgZnJlZSB0byBzaGFyZSB0aGUgZW5jcnlwdGVkIGltYWdlcyB3aXRob3V0IHZpb2xhdGluZyBwYXJ0aWNpcGFudHMnIHByaXZhY3kuICAKCiMjIyBHZW5vbWljIFByaXZhY3kgUHJvdGVjdGlvbiBFZmZvcnRzCgpXb3JrIGJ5IE1hbGluIGluY2x1ZGVkIGluIHRoZSBkYXRhIHByaXZhY3kgcHJvamVjdCBhaW1zIHRvIGlsbHVzdHJhdGUgaG93IGN1cnJlbnQgZGUtaWRlbnRpZmljYXRpb24gcHJvdG9jb2xzIHdoZW4gYW5vbnltaXppbmcgZ2Vub21pYyBkYXRhIGZhaWxzIHRvIGZ1bGx5IHByb3RlY3QgZnJvbSByZS1pZGVudGlmaWNhdGlvbi4gQXMgcHJldmlvdXNseSBtZW50aW9uZWQgaW4gdGhpcyBwYXBlciwgbWVkaWNhbCBpbmZvcm1hdGlvbiBpcyBwcm90ZWN0ZWQgdXNpbmcgSElQUEEgcmVndWxhdGlvbnMuIFN0aWxsLCBhcyBzZWVuIHRocm91Z2ggcHJldmlvdXMgY291cnQgY2FzZXMgc3VjaCBhcyBTb3JyZWxsIHYuIElNUyBIZWFsdGgsIHRob3NlIHBvbGljaWVzIGFyZSBpbmVmZmVjdGl2ZSBlbm91Z2ggaW4gdG9kYXnigJlzIGRhdGEtcmljaCBlbnZpcm9ubWVudCB3aGVyZSBnZW5ldGljIGluZm9ybWF0aW9uIGlzIHJlYWRpbHkgc2hhcmVkIGZvciBzY2llbnRpZmljIGFuZCBtZWRpY2FsIGJlbmVmaXQuIEFsdGhvdWdoIGFkdm9jYXRlcyBvZiBkZS1pZGVudGlmaWNhdGlvbiBhZGRyZXNzIHRoZSBpc3N1ZSBvZiBtYWludGFpbmluZyBwcml2YWN5IHdpdGggdGhlIGJlc3QgaW50ZW50aW9ucyB3aGVuIGd1aWRlZCBvbmx5IGJ5IEhJUFBBIHJlZ3VsYXRpb25zLCB0aGV5IG9mdGVuIGZhaWwgdG8gbWFpbnRhaW4gYW5vbnltaXR5LCBhbmQgcGFydGljaXBhbnRzIGNhbiBiZSByZS1pZGVudGlmaWVkIChNYWxpbiwgMjAwMykuIEFkZGl0aW9uYWxseSwgd2hlbiBmb2xsb3dpbmcgZGUtaWRlbnRpZmljYXRpb24gZ3VpZGVsaW5lcywgYW5vbnltaXplZCBkYXRhIGNhbiBiZSByZWxhdGVkIHRvIHB1YmxpY2x5IGF2YWlsYWJsZSBpbmZvcm1hdGlvbiB0byBpZGVudGlmeSBzcGVjaWZpYyBpbmRpdmlkdWFscyAoQnJhdW4sIDIwMDkpLgoKTWFsaW4gcHJvdmVzIHRoYXQgZXZlbiB3aGVuIHVzaW5nIHNldmVyYWwga25vd24gZGUtaWRlbnRpZmljYXRpb24gbWV0aG9kcywgcmUtaWRlbnRpZmljYXRpb24gY2FuIHN0aWxsIGJlIGFjaGlldmVkLiBUaHJvdWdoIGV2YWx1YXRpbmcgdGhlIGJyZWFkdGggb2YgZGFuZ2VycyBkZXNjcmliZWQgaW4gdGhlIE5ldyBZb3JrIFRpbWVzIFByaXZhY3kgcHJvamVjdCBzaG93aW5nIHRoZSBoYXphcmRzIGZyb20gdGhlIG92ZXJzaGFyaW5nIG9mIHBlcnNvbmFsIGdlbmV0aWMgaW5mb3JtYXRpb24sIGl0IGlzIGFwcGFyZW50IHRoYXQgZnVydGhlciByZXNlYXJjaCBhbmQgcmVndWxhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHByb3RlY3QgaW5kaXZpZHVhbCBpZGVudGl0aWVzLiBOb3Qgb25seSBkbyByZXNlYXJjaGVycyBuZWVkIHRvIGVzdGFibGlzaCBlZmZlY3RpdmUgdGVjaG5pcXVlcyB0byBkZS1pZGVudGlmeSBnZW5ldGljIGluZm9ybWF0aW9uLCBidXQgY2FyZWZ1bCBjb25zaWRlcmF0aW9uIHNob3VsZCBhbHNvIGJlIHRha2VuIHRvIGRldGVybWluZSBpZiBkaXJlY3QtdG8tY29uc3VtZXIgZ2VuZXRpYyBzZXJ2aWNlcyBhcmUgYmVuZWZpY2lhbCBlbm91Z2ggdG8gd2FycmFudCB0aGUgaW5oZXJlbnQgbG9zcyBvZiBwcml2YWN5LiAgCgojIyMgQ29uY2x1c2lvbgoKVGhyb3VnaG91dCB0aGlzIHBhcGVyLCBzZXZlcmFsIGtleSBwcml2YWN5IGlzc3VlcyB3ZXJlIGlsbHVzdHJhdGVkIGJ5IGNvbXBhcmluZyBleGlzdGluZyBwcml2YWN5IHByb2plY3RzIGZyb20gdGhlIE5ldyBZb3JrIFRpbWVzIGFnYWluc3Qgb25nb2luZyBhY2FkZW1pYyBhbmQgc2NpZW50aWZpYyBlZmZvcnRzIHRvIGFkZHJlc3MgZXhpc3RpbmcgZGF0YSBwcml2YWN5IGlzc3Vlcy4gIEFzIHRoZSBkYXRhIGVjb25vbXkgZXhwYW5kcywgZW5zdXJpbmcgaW5kaXZpZHVhbCBwcml2YWN5IHdpbGwgcmVtYWluIGEgY29uc3RhbnQgaHVyZGxlLiAgVGhpcyBwYXBlciBoYXMgc2hvd24gaG93IHRoZSBuZWVkIGZvciBhIGZvdW5kYXRpb24gb2YgcHJpdmFjeSBhbmQgZXRoaWNhbCBtYW5hZ2VtZW50IG9mIGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiB3aWxsIG9ubHkgYmUgYWNoaWV2ZWQgdGhyb3VnaCBhZGRpdGlvbmFsIHJlZ3VsYXRpb25zIGdvdmVybmluZyBob3cgZGF0YSBpcyBwcm90ZWN0ZWQgYW5kIHNlY3VyZWQuICBPbmx5IGFmdGVyIHRob3NlIHJlZ3VsYXRpb25zIGFyZSBjcmVhdGVkIHRoYXQgYWRkcmVzcyBjdXJyZW50IHRlY2hub2xvZ2ljYWwgYWR2YW5jZW1lbnRzIHdpbGwgaW5kaXZpZHVhbHMgYmUgc2FmZSBmcm9tIHJlLWlkZW50aWZpY2F0aW9uIGZyb20gZ2Vub21pYyBpbmZvcm1hdGlvbiBhbmQgcHJvdGVjdGVkIGZyb20gaW5hY2N1cmF0ZSBjb25jbHVzaW9ucyBkcmF3biBmcm9tIGJpYXNlZCBmYWNpYWwgcmVjb2duaXRpb24gcHJvZ3JhbXMuCgojIyMgUmVmZXJlbmNlcwoKQmFsYSwgTi4gKDIwMjApLiAqV2h5IEFyZSBZb3UgU2hhcmluZyBZb3VyIENoaWxk4oCZcyBETkEgSW5mb3JtYXRpb24/Ki4gTmV3IFlvcmsgVGltZXMuIFJldHJpZXZlZCBKYW51YXJ5IDI4LCAyMDIzIGZyb20gaHR0cHM6Ly93d3cubnl0aW1lcy5jb20vMjAyMC8wMS8wMi9vcGluaW9uL2RuYS10ZXN0LXByaXZhY3ktY2hpbGRyZW4uaHRtbAoKQnJhdW4sIFIuLCBSb3dlLCBXLiwgU2NoYWZlciwgQy4sIFpoYW5nLCBKLiwgQnVldG93LCBLLiAoMjAwNSkuICpOZWVkbGVzIGluIHRoZSBIYXlzdGFjazogSWRlbnRpZnlpbmcgSW5kaXZpZHVhbHMgUHJlc2VudCBpbiBQb29sZWQgR2Vub21pYyBEYXRhKi4gUExvcyBHZW5ldGljcy4gUmV0cmlldmVkIEZlYnJ1YXJ5IDIyLCAyMDIzIGZyb20gaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wbWMvYXJ0aWNsZXMvUE1DMjc0NzI3My8gCgpCdXJnZXNzLCBNLiAoMjAyMCkuICpXaGF0IGlzIHRoZSBHRFBSPyBUaGUgU3VtbWFyeSBHdWlkZSB0byBDb21wbGlhbmNlIGluIHRoZSBVSyouIFdpcmVkLiBSZXRyaWV2ZWQgRmVicnVhcnkgMTgsIDIwMjMgZnJvbSBodHRwczovL3d3dy53aXJlZC5jby51ay9hcnRpY2xlL3doYXQtaXMtZ2Rwci11ay1ldS1sZWdpc2xhdGlvbi1jb21wbGlhbmNlLXN1bW1hcnktZmluZXMtMjAxOCAKCkdhcnZpZSwgQy4gKDIwMTkpLiAqWW914oCZcmUgSW4gQSBQb2xpY2UgTGluZXVwIFJpZ2h0IE5vdyouIE5ldyBZb3JrIFRpbWVzLiBSZXRyaWV2ZWQgSmFudWFyeSAyNywgMjAyMyBmcm9tIGh0dHBzOi8vd3d3Lm55dGltZXMuY29tLzIwMTkvMTAvMTUvb3Bpbmlvbi9mYWNpYWwtcmVjb2duaXRpb24tcG9saWNlLmh0bWwKCktsb3Nvd3NraSwgVC4gKDIwMjEpLiAqVGhlIFN0YXRlIG9mIENvbnN1bWVyIERhdGEgUHJpdmFjeSBQcm90ZWN0aW9uIExhd3MgaW4gdGhlIFVTIChBbnkgV2h5IGl0IE1hdHRlcnMpKi4gV2lyZWN1dHRlci4gUmV0cmlldmVkIEZlYnJ1YXJ5IDE1LCAyMDIzIGZyb20gaHR0cHM6Ly93d3cubnl0aW1lcy5jb20vd2lyZWN1dHRlci9ibG9nL3N0YXRlLW9mLXByaXZhY3ktbGF3cy1pbi11cy8gCgpNYWxpbiwgQi4gKDIwMDMpLiAqV2h5IFBzZXVkb255bXMgRG9u4oCZdCBBbm9ueW1pemU6IEEgQ29tcHV0YXRpb25hbCBSZS1pZGVudGlmaWNhdGlvbiBBbmFseXNpcyBvZiBHZW5vbWljIERhdGEgUHJpdmFjeSBQcm90ZWN0aW9uIFN5c3RlbXMqLiBDYXJuZWdpZSBNZWxvbiBVbml2ZXJzaXR5LiBSZXRyaWV2ZWQgSmFudWFyeSAyOCwgMjAyMyBmcm9tIGh0dHBzOi8vZGF0YXByaXZhY3lsYWIub3JnL2RhdGFwcml2YWN5L3Byb2plY3RzL2xpbmthZ2UvbGlkYXAtd3AxOS5wZGYKCk5hamliaSwgQS4gKDIwMjApLiAqUmFjaWFsIERpc2NyaW1pbmF0aW9uIGluIEZhY2UgUmVjb2duaXRpb24gVGVjaG5vbG9neSouIEhhcnZhcmQgVW5pdmVyc2l0eS4gUmV0cmlldmVkIEZlYnJ1YXJ5IDIwLCAyMDIzIGZyb20gaHR0cHM6Ly9zaXRuLmhtcy5oYXJ2YXJkLmVkdS9mbGFzaC8yMDIwL3JhY2lhbC1kaXNjcmltaW5hdGlvbi1pbi1mYWNlLXJlY29nbml0aW9uLXRlY2hub2xvZ3kvIAoKTmV3dG9uLCBFLiwgU3dlZW5leSwgTC4sIE1hbGluLCBCLiAoMjAwMykuICpQcmVzZXJ2aW5nIFByaXZhY3kgYnkgRGUtSWRlbnRpZnlpbmcgRmFjaWFsIEltYWdlcyouIENhcm5lZ2llIE1lbG9uIFVuaXZlcnNpdHkuIFJldHJpZXZlZCBKYW51YXJ5IDI3LCAyMDIzIGZyb20gaHR0cHM6Ly9kYXRhcHJpdmFjeWxhYi5vcmcvZGF0YXByaXZhY3kvcHJvamVjdHMvdmlkZW8vcGFwZXIucGRmCgpTaW5nZXIsIE4uICgyMDE5KS4gKlRoZSBHb3Zlcm5tZW50IFByb3RlY3RzIG91dCBGb29kIGFuZCBDYXJzLiBXaHkgTm90IE91ciBEYXRhPyouIE5ldyBZb3JrIFRpbWVzLiBSZXRyaWV2ZWQgSmFudWFyeSAyNiwgMjAyMyBmcm9tIGh0dHBzOi8vd3d3Lm55dGltZXMuY29tLzIwMTkvMTEvMDIvc3VuZGF5LXJldmlldy9kYXRhLXByb3RlY3Rpb24tcHJpdmFjeS5odG1sCgpTdXJlc2gsIEguLCBHdXR0YWcsIEouICgyMDIxKS4gKkEgRnJhbWV3b3JrIGZvciBVbmRlcnN0YW5kaW5nIFNvdXJjZXMgb2YgSGFybSBUaHJvdWdob3V0IHRoZSBNYWNoaW5lIExlYXJuaW5nIExpZmUgQ3ljbGUqLiBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LiBSZXRyaWV2ZWQgRmVicnVhcnkgMjAsIDIwMjMgZnJvbSBodHRwczovL3Vjd3YubXJvb21zMy5uZXQvcGx1Z2luZmlsZS5waHAvMTI4NTc4My9tb2RfcGFnZS9jb250ZW50LzEvQSUyMEZyYW1ld29yayUyMGZvciUyMFVuZGVyc3RhbmRpbmclMjBTb3VyY2VzJTIwb2YlMjBIYXJtLnBkZiAKClN3ZWVuZXksIEwuIChuLmQuKS4gKlBhdGllbnQgUHJpdmFjeSBSaXNrcyBpbiBVLlMuIFN1cHJlbWUgQ291cnQgQ2FzZSBTb3JyZWxsIHZzLiBJTVMgSGVhbHRoKi4gUHJpdmFjeSBMYWIgUHJvamVjdC4gUmV0cmlldmVkIEphbnVhcnkgMjYsIGZyb20gaHR0cHM6Ly9kYXRhcHJpdmFjeWxhYi5vcmcvcHJvamVjdHMvaWRlbnRpZmlhYmlsaXR5L3BoYXJtYTIucGRmCg==