Last Updated: 09/07/2024
Course Title
PSY:3170 – Fantasy Football: Predictive Analytics and Empiricism
(Fall 2025)
Course Meeting Time and
Place
INSERT
Course Home
The College of Liberal Arts and Sciences (CLAS) is the home of this
course, and CLAS governs the add and drop deadlines, academic misconduct
policies, and other policies and procedures. Other UI colleges may have
different policies.
Instructor Contact
Information
Professor
Petersen
Office: 175 Psychological and Brain Sciences Building (PBSB)
E-mail: isaac-t-petersen@uiowa.edu
Office Phone: 467-1014
Student drop-in hours: INSERT
Note: I’m here to help you learn and succeed. Please come to my office
hours to ask questions about course material, assignments, exams, or
professional development (career-related issues), for instance. I
welcome you to discuss any concerns you might have about the class. I am
also available to meet with you by appointment, although I would
appreciate your making every effort to see me during office hours. The
best way to reach me outside of class is by email.
Prerequisites
The Department of Psychological and Brain Sciences has a hierarchical
course structure that requires students to complete certain prerequisite
courses before taking upper-level courses. This course requires
successful completion (C- or higher) of any of the following statistics
courses (or AP Statistics from high school): PSY 2811, PSQF 1020, PSQF
4143, STAT 1010, STAT 1015, STAT 1020, STAT 1030, STAT 3510, STAT 4143
The department will check student records to ensure completion of course
prerequisites.
Any of the following courses with a minimum grade of C- (or AP stats
from high school): PSY 2811, PSQF 1020, PSQF 4143, STAT 1010, STAT 1015,
STAT 1020, STAT 1030, STAT 3510, STAT 4143
Description of
Course
How can we use information to make predictions about uncertain
events? This course is about empiricism (basing theories on observed
data) and judgment, prediction, and decision making in the context of
uncertainty. Students will be introduced to modern analytical techniques
used to make informed predictions, test theories, and draw conclusions
from a given dataset. But this is no ordinary course…
Rather than memorizing these empirical approaches in abstraction,
students will employ these methods in the active, immersive, hands-on
learning laboratory of Fantasy Football. In this way, the course will
weave together two contiguous threads: an introductory overview of data
analysis techniques, and a captivating application of these techniques
through a semester-long experience in Fantasy Football with their
classmates.
The class involves reading primary source material, applying
statistical programming (using R
software), conducting data
analysis, and composing written work on a weekly basis.
To be clear, this is a statistics and empiricism course. It
merely uses fantasy football as a lens and application through which to
learn about statistics and empiricism. The class does not assume that
students know anything about (or care about) football or fantasy
football. The class is welcome to all, assuming the student meets the
prerequisites and that they are interested in learning about empiricism
(basing theories on observed data), statistics, and judgment,
prediction, and decision making in the context of uncertainty.
Take this class if:
- you want to learn more advanced skills in 1) empiricism, 2)
statistics, 3) programming (using
R
software), and 4)
judgment, prediction, and decision making in the context of
uncertainty;
- you are interested in learning statistics through the lens of a fun
sports domain (fantasy football); or
- you are interested in applying psychological and statistical
concepts to fantasy football, to gain a strong understanding of critical
thinking and decision making in sports.
Do not take this class if:
- you are just looking for an “easy” class (the class is not
easy);
- you are reluctant to examine fantasy football topics in a scientific
manner;
- you do not want to write public blog articles as part of the class;
or
- you do not want to learn statistics and programming, and do not want
to persist through inevitable challenges along the way.
Learning
Objectives
By the end of the course, successful students will be able to:
- Apply empirical inference and appreciate the value it provides over
speculative supposition.
- Ask educated questions when confronted with decisions in the face of
uncertainty.
- Understand human decision making, including common heuristics and
cognitive biases and how to mitigate them analytically.
- Engage in critical thinking about causality, including devising
plausible alternative explanations for observed effects.
- Understand causal inference including confounding, causal pathways,
and counterfactuals.
- Think empirically about human behavior and performance.
- Describe the strengths and weaknesses of humans versus computers in
prediction scenarios.
- Apply basic skills in statistical programming using
R
to manipulate and summarize datasets and to conduct data analysis.
- Critically evaluate the strengths and limitations of different
statistical models and methodologies used in predicting uncertain
events, enhancing their understanding of statistical inference and model
selection.
- Use various analytical techniques for predicting the outcome of
uncertain events, and for uncovering latent causes of patterns in
observed data.
- Interpret findings from various statistical approaches and evaluate
the accuracy of predictions.
- Engage in iterative problem-solving processes, refining analytical
approaches based on feedback and outcomes, and adapting strategies
accordingly.
- Communicate statistical findings and analyses in both written and
oral formats, demonstrating proficiency in presenting complex
information to diverse audiences.
- Make sense of big data.
- Use practical analytical skills that can be applied in future
research and job settings.
Textbook
The cost of textbooks has become so high that I do not feel
comfortable requiring students to purchase a textbook. Thus, I created a
textbook for this course. The textbook for this course is available
for free online: https://isaactpetersen.github.io/Fantasy-Football-Analytics-Textbook
Required
Materials
For the class, you will be required to have access to a computer that
allows you to install and run software (including R
,
git
, and GitHub Desktop
). A laptop is
preferable, so you can bring it to class and work through examples in
class.
Academic Honesty and
Misconduct
All students in CLAS courses are expected to abide by the college’s
standards of academic honesty. Academic misconduct must be reported
by instructors to CLAS according to these
procedures. Please note that collaboration with other classmates on
quizzes, writing assignments, and during exams is not permitted.
However, I do encourage you to collaborate with classmates to to learn
R
, statistics, and programming, and to prepare for
exams (e.g., informal study groups). Because writing, analytical, and
critical thinking skills are part of the learning outcomes of this
course, all work submitted by students should be prepared by the
student. Developing strong competencies in these domains will prepare
you for a competitive workplace. Therefore, AI-generated submissions are
not permitted and will be treated as plagiarism.
Course Requirements
and Policies
Lecture
We will meet two times weekly for lectures, at the time and location
described above. My powerpoint presentations
for the lectures will be posted on ICON no later than noon on the day
before the lecture (though I may continue to refine the slides up until
the time of lecture). Please note: powerpoint presentations are
an outline of my points. It is your responsibility to take notes
during class. If you have questions about the lecture notes or need
clarification of any of the points, please ask in class or meet with
Professor Petersen during office hours. If you miss a lecture, get and
review notes with a peer and watch the lecture recording. Then, come to
office hours if you have specific questions.
Lecture
Recordings
My intention is to record lectures so that you may review them.
Recorded lectures will be posted on the “UICapture” tab in ICON. However, please do not count
on recordings being available, in case I accidentally forget to
initiate the recording or there is a technical malfunction.
Attendance and
Participation
Attendance at lectures is required and will be factored into final
grades (see grading section below). There
are 29 lectures during the semester (excluding the examinations). You
will receive one point for attendance at each lecture up to 27 points
(i.e., you will not receive extra credit for attending all 29 lectures).
Thus, you will not be penalized for missing up to 2 lectures.
However, you will be responsible for learning any material missed for
quizzes and exams, and I strongly encourage you to attend all lectures.
Poor lecture attendance is likely to affect the quality of students’
work and success in the course.
Students who miss more than 2 lectures due to participation in
University activities must give the instructor a statement before the
absence signed by a responsible official that specifies the dates
and times the student will miss class. Authorized activities include
participation in athletic teams, the marching band or pep band, debate
teams, and other recognized University groups, as well as participation
in University field trips, service with the National Guard, and jury
duty. Absences due to illnesses or emergencies (that go over 2 lectures)
must be documented with the University of Iowa Absence
Explanation Form and sent to Professor Petersen within 48 hours of
the absence. Per university policy, if a student will be absent 5 or
more consecutive days and the absence is due to illness or other
emergency, please contact the Registrar Service Center at (319)
384-4300 or registrar@uiowa.edu.
Blog Articles
As part of the class, you will post blog articles (see the course schedule for deadlines). The blog articles
are public; do not take this course if you do not feel
comfortable posting blog articles with your full name in a public
forum. There will be a penalty of 20% for all blog articles turned
in late. Your lowest score will be dropped. A blog article is not
considered “submitted” until you (a) post the blog article so that it is
live and publicly available, AND (b) submit the assignment on ICON with the URL link to your blog
article. All blog articles should be submitted to ICON by 11:59 p.m. on the due
date.
You are encouraged to submit your blog article well before the
deadline. You can expect to run into technical issues (e.g.,
errors when running your code, issues getting the blog post to compile
etc.). Thus, you should give yourself plenty of time to troubleshoot (see below) so that you can
submit your blog article on time.
Troubleshooting
If you run into issues related to R
,
GitHub
, or your code, I encourage you to try one (or more)
of the following:
- Perform a Google search for the error/issue
- Ask a peer
- Post on forums
dedicated to
R
- Come to office hours
I am quite busy, and I appreciate your making every effort to solve
the issue on your own or using one of the aforementioned ways before
emailing me. I do not often respond to emails during evenings or
weekends, and I cannot be expected to solve last-minute issues that you
could have solved earlier.
Readings &
Quizzes
Readings and other materials will be posted on ICON. You are expected to do the
readings before class. You will have an online quiz on the readings to
complete in ICON, on your own,
before each lecture. The quizzes are meant to help you come to
class prepared to contribute so you are best-positioned to learn and to
help others learn. The quizzes are not timed (you can spend as much time
as you need on each quiz up until the deadline). The deadline for each
quiz is 30 minutes before class starts. Late responses and multiple
submissions will not be accepted. Your lowest quiz score will be
dropped. We will not accept excused absences for quizzes because (a) you
have a week to complete the quiz (and can submit it at any point during
that week), and (b) we drop your lowest quiz score. Each quiz will be
weighted the same in the final grade. Quiz answers will be viewable at
the end of the week (i.e., after the last discussion section has taken
their quiz).
Past experience has shown that in order to do well in this class, you
should read the required material, participate actively in class, and go
over your notes each week. There is too much material being
covered in this class to try to study only by frantic preparation
immediately before exams. Note that lecture will not cover all
relevant material for the course; you will be expected to know the
required readings for exams.
Workload
This is a 3 semester hour course. Students should therefore expect to
spend 6
additional hours per week (outside of class) reading the articles,
reviewing material from lecture and discussion section, and preparing
for quizzes and exams.
Examinations
There will be 2 exams; one mid-term exam and one non-cumulative final
exam. Each exam will emphasize information presented for the half of the
class that precedes it. However, some integration of information across
sections will be required for questions on the second and third exams.
The exams will include multiple-choice questions. Exam questions can
come from any of the following sources: lectures or required
readings. For suggested study tips for this class, meet with
Professor Petersen during office hours.
Missing Exams
University
regulations require that students be allowed to make up examinations
that have been missed due to illness, religious holy days, military
service obligations (including service-related medical appointments), or
other unavoidable circumstances or University-sponsored activities.
Students with UI-authorized activities must discuss their absences with
the instructor as soon as possible. Religious obligations must be
communicated within the first three weeks of classes. See below for the
documentation necessary for an absence to be excused and to be eligible
to take a make-up exam.
Students are allowed to make up exams that have been missed due to
illness, mandatory religious observations, official University
activities, or other unavoidable circumstances. Note: the format of the
make-up exam may differ from the original exam. If you know that you
must be away at the time of an exam for one of these reasons, Professor
Petersen must be contacted in advance whenever possible to schedule a
make-up exam. In order to take a make-up exam, you must provide
acceptable documentation to be eligible to take it: including
documentation for any report of illness; any other circumstances must be
documented by the University of Iowa Absence
Explanation Form and must be approved by Professor Petersen. In
sum, to be eligible for a make-up exam, Professor Petersen must be
contacted before the examination whenever possible, and you must send
acceptable form of documentation to Professor Petersen.
Grading
Final grades will be assigned at the end of semester on the basis of
your total percentage of points earned on exams, quizzes, attendance,
and writing assignments, as detailed below. Grades will be assigned on
an absolute scale (criterion-referenced grading); course grades will not
be curved. Please note: As a matter of fairness to all students, I
assign grades based on performance and do not negotiate grades. Final
grades will be assigned based on the following ranges:
A+ |
97–100% |
A |
93–96 |
A- |
90–92 |
B+ |
87–89 |
B |
83–86 |
B- |
80–82 |
C+ |
75–79 |
C |
70–74 |
C- |
65–69 |
D+ |
60–64 |
D |
55–59 |
D- |
50–54 |
F |
< 50% |
I round up from .5 when determining final grades. For example, a
course percent of 79.50 would receive a B-, whereas a course percent of
79.49 would receive a C+.
Course Grades
Final course grades will be assessed based on your performance in the
activities below. The relative contribution of each component to your
final grade is as follows:
- 25% Examination #1
- 25% Examination #2 (administered only during the class’s Final Exam
time slot)
- 10% Attendance/Participation
- 10% Reading Quizzes
- 30% Writing Assignments
Tentative Course
Outline (exam dates fixed)
This is a tentative course outline. Changes will be
discussed in class. There are 15 weeks in the semester, and class meets
twice per week (30 sections). We will have one exam during the semester
and one final exam during finals week.
1 |
T |
08/26 |
Overview of Class; Overview of Fantasy Football |
Ch 1–2 |
|
2 |
Th |
08/28 |
Statistical Programming: Using R for
Statistical Analysis |
Ch 3 |
|
3 |
T |
09/02 |
Player Evaluation |
Ch 6; Den Hartigh et al. (2018) |
Set up blog; post welcome article |
4 |
Th |
09/04 |
The Draft |
Ch 7; Lee & Liu (2022) |
|
5 |
T |
09/09 |
Statistical Programming in R |
Ch 4 |
|
6 |
Th |
09/11 |
Basic Statistics |
Ch 8–9 |
Blog article 1 due! |
7 |
T |
09/16 |
Data Visualization and Interpretation |
Ch 5; Schwabish (2021) |
|
8 |
Th |
09/18 |
Correlation Analysis |
Ch 10; Goodwin & Leech (2006) |
Blog article 2 due! |
9 |
T |
09/23 |
Multiple Regression and Mixed Models |
Ch 11–12; Osborne & Waters (2002) |
|
10 |
Th |
09/25 |
Mixed Models |
Ch 13; Brauer & Kurtin (2018) |
|
11 |
T |
09/30 |
Causal Inference |
Ch 13; D’Onofrio et al. (2020) |
Blog article 3 due! |
12 |
Th |
10/02 |
Heuristics and Cognitive Biases in Prediction |
Ch 14; Tversky & Kahneman (1974) |
|
13 |
T |
10/07 |
Human Judgment vs Actuarial Approaches to
Prediction |
Ch 15; Grove et al. (2000) |
|
14 |
Th |
10/09 |
Base Rates |
Ch 16 |
Blog article 4 due! |
15 |
T |
10/14 |
Midterm Exam |
|
|
16 |
Th |
10/16 |
Evaluation of Prediction/Forecasting Accuracy: Binary
Classification |
Ch 17 (Section 17.1–17.16.5) |
|
17 |
T |
10/21 |
Evaluation of Prediction/Forecasting Accuracy: Binary
Classification |
Ch 17 (Section 17.6.6–17.6.8) |
|
18 |
Th |
10/23 |
Evaluation of Prediction/Forecasting Accuracy:
Continuous Outcomes |
Ch 17 (Section 17.7–end of chapter) |
Blog article 5 due! |
19 |
T |
10/28 |
Calibration Accuracy: Overconfidence Bias |
Kahneman & Tversky (1996); Massey & Thaler
(2013) |
|
20 |
Th |
10/30 |
Machine Learning |
Ch 19 |
Blog article 6 due! |
21 |
T |
11/04 |
Mythbusters: Putting Fantasy Football Beliefs/Anecdotes
to the Test |
Ch 18; White & Sheldon (2014) |
|
22 |
Th |
11/06 |
Modern Portfolio Theory |
Ch 20 |
Blog article 7 due! |
23 |
T |
11/11 |
Cluster Analysis |
Ch 21 |
|
24 |
Th |
11/13 |
Factor Analysis |
Ch 22 |
Blog article 8 due! |
25 |
T |
11/18 |
Data Reduction: Principal Component Analysis |
Ch 23 |
|
26 |
Th |
11/20 |
Simulation and the Monte Carlo Method |
Ch 24 |
Blog article 9 due! |
|
|
11/24–11/27 |
FALL BREAK – NO CLASSES |
|
|
27 |
T |
12/02 |
Time Series Analysis |
Ch 25 |
|
28 |
Th |
12/04 |
Decision Making in the Context of Uncertainty |
Ch 26; Larrick et al. (2024) |
Blog article 10 due! |
29 |
T |
12/09 |
Sports and Cognitive Psychology: Coaching and Risk
Aversion |
Ch 27 |
|
30 |
Th |
12/11 |
Sports and Cognitive Psychology: Psychological Factors
in Player Performance; Expert Performance and Automaticity |
Ch 27 |
Blog article 11 due! |
Finals Week |
|
TBD (week of 12/15) |
Final Exam |
|
|
Date and Time of the
Final Exam
The final
examination date and time will be announced by the Registrar
generally by the fifth week of classes, and it will be announced on the
course ICON site once it is known. Do not plan your end of the
semester travel plans until the final exam schedule is made public. It
is your responsibility to know the date, time, and place of the final
exam. According to Registrar’s final exam policy, students have a
maximum of two weeks after the announced final exam schedule to
request a change if an exam conflict exists or if a student has more
than two exams in one day (see the policy
here).
Course Resources
There are many course resources available to help you succeed in the
class, including:
Drop Deadline for this
Course
You may drop an individual course before the drop deadline; after
this deadline you will need collegiate approval. You can look up the
drop deadline for this course here. When you
drop a course, a “W” will appear on your transcript. The mark of “W” is
a neutral mark that does not affect your GPA. To discuss how dropping
(or staying in) a course might affect your academic goals, please
contact your Academic Advisor. Directions for adding or dropping a
course and other registration changes can be found on the Registrar’s
website. Students can find policies on dropping CLAS courses here.
Students should adhere to the academic deadlines
and policies set by the Graduate College.
Feedback about the
Course
I welcome feedback at any point during the class. If you have
comments on the class or my teaching, please feel free to meet with me
during office hours.
Student
Complaints
Students with a complaint about a grade or a related matter should
first discuss the situation with the instructor, finally with the DEO
(Chair) of the department, school or program offering the course.
Sometimes students will be referred to the department or program’s
Director of Undergraduate Studies (DUS) or Director of Graduate Studies
(DGS). Students should contact CLAS
Undergraduate Programs for support when the matter is not resolved
at the previous level.
Communication: UI
Email
Students are responsible for all official correspondences sent to
their UI email address (uiowa.edu) and must use this address for any
communication with instructors or staff in the UI community. For the
privacy and the protection of student records, UI faculty and staff can
only correspond with UI email addresses.
Other Expectations
of Student Performance
Students have the right to a distraction-free learning environment.
You have the responsibility to help create such a classroom environment.
Please treat other students in the class and the instructor with
respect. Students are expected to help each other learn and to
contribute overall to the learning environment of the course. Arriving
prepared for class is part of this expectation.
University
Policies
University
Policies
Accommodations
for Students with Disabilities
The University is committed to providing an educational experience that
is accessible to all students. If a student has a diagnosed disability
or other disabling condition that may impact the student’s ability to
complete the course requirements as stated in the syllabus, the student
may seek accommodations through Student Disability
Services (SDS). SDS is responsible for making Letters of
Accommodation (LOA) available to the student. The student must
provide an LOA to the instructor as early in the semester as possible,
but requests not made at least two weeks prior to the scheduled activity
for which an accommodation is sought may not be accommodated. The
LOA will specify what reasonable course accommodations the student is
eligible for and those the instructor should provide.
Where to Get Academic
Support for This Course
Mental Health
Resources and Student Support
Students are encouraged to be mindful of their mental health and seek
help as a preventive measure or if feeling overwhelmed and/or struggling
to meet course expectations. Students are encouraged to talk to their
instructor for assistance with course-related concerns. For additional
mental health support, please see the guidance and resources at mentalhealth.uiowa.edu,
including the 24-7 UI
Support and Crisis Line.
Additionally, the Office of the Dean of Students can help students
navigate personal crisis situations. They can provide one-on-one
support, help with identifying options, and access to basic needs resources (such as food,
rent, childcare, etc.). Student Care and Assistance: 132 IMU, dos-assistance@uiowa.edu, or
319-335-1162 and more info: dos.uiowa.edu/assistance
If you feel that you or someone you know may be struggling with an
academic, emotional, or psychological problem, the following
organizations are available for assistance:
University of Iowa Academic Advising Center |
353-5700, https://advisingcenter.uiowa.edu |
University Counseling Services |
335-7294, https://www.uiowa.edu/ucs |
Student Health Service - Mental Health |
335-8394, https://studenthealth.uiowa.edu/services/psychiatry |
University of Iowa Hospitals and Clinics Adult
Psychiatry Services Clinic |
353-6314, https://www.uihealthcare.org/Psychiatry |
Seashore Clinic (in the UI Department of Psychological
and Brain Sciences) |
335-2467, https://psychology.uiowa.edu/resources/seashore-clinic |
Women’s Resource and Action Center |
335-1486, https://wrac.uiowa.edu |
Rape Victim Advocacy Program |
319-335-6000 or 800-228-1625, https://www.uiowa.edu/~rvap |
Office of Sexual Misconduct |
319-335-6200, https://osmrc.uiowa.edu |
CommUnity |
855-325-4296, https://builtbycommunity.org/crisis |
Community & Family Resources |
351-4357, https://www.cfrhelps.org/ |
If you or someone you know is contemplating suicide, either
call or text the Suicide and Crisis Lifeline at 988, or call 911.
Disclosures
I am the Owner of Fantasy Football Analytics, LLC, which operates https://fantasyfootballanalytics.net. I do not require
or encourage students to use my website, and I do not promote or endorse
any specific content or services offered by Fantasy Football
Analytics.
Disclaimer
“This material probably won’t win you fantasy football
championships. You could take what we learn and apply it to fantasy
football and you might become 5 percent more likely to win. Or… Consider
the broader relevance of this. You could learn data analysis and figure
out ways to apply it to other systems. And you could be making a
six-figure salary within the next five years.” – Benjamin Motz,
Ph.D.
This syllabus is subject to change. Any changes will be discussed in
class, via email, and/or on ICON.
LS0tCnRpdGxlOiAiQ291cnNlIFN5bGxhYnVzIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAiIikKYGBgCgpMYXN0IFVwZGF0ZWQ6IGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJW0vJWQvJVkiKWAKCiMgQ291cnNlIFRpdGxlIHsjdGl0bGV9CgpQU1k6MzE3MCDigJMgRmFudGFzeSBGb290YmFsbDogUHJlZGljdGl2ZSBBbmFseXRpY3MgYW5kIEVtcGlyaWNpc20gKEZhbGwgMjAyNSkKCiMgQ291cnNlIE1lZXRpbmcgVGltZSBhbmQgUGxhY2UgeyNsZWN0dXJlVGltZX0KCjxtYXJrPklOU0VSVDwvbWFyaz4KCiMgQ291cnNlIFdlYnNpdGUgeyN3ZWJzaXRlfQoKaHR0cHM6Ly9pY29uLnVpb3dhLmVkdQoKVG8gYWNjZXNzIHRoZSBjb3Vyc2Ugc2l0ZSwgbG9nIGludG8gW0lvd2EgQ291cnNlcyBPbmxpbmUgKElDT04pXShodHRwczovL2ljb24udWlvd2EuZWR1KSB1c2luZyB5b3VyIEhhd2sgSUQgYW5kIHBhc3N3b3JkLgoKIyBDb3Vyc2UgSG9tZSB7I2hvbWV9CgpUaGUgQ29sbGVnZSBvZiBMaWJlcmFsIEFydHMgYW5kIFNjaWVuY2VzIChDTEFTKSBpcyB0aGUgaG9tZSBvZiB0aGlzIGNvdXJzZSwgYW5kIENMQVMgZ292ZXJucyB0aGUgYWRkIGFuZCBkcm9wIGRlYWRsaW5lcywgYWNhZGVtaWMgbWlzY29uZHVjdCBwb2xpY2llcywgYW5kIG90aGVyIHBvbGljaWVzIGFuZCBwcm9jZWR1cmVzLgpPdGhlciBVSSBjb2xsZWdlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgcG9saWNpZXMuCgojIEluc3RydWN0b3IgQ29udGFjdCBJbmZvcm1hdGlvbiB7I2luc3RydWN0b3J9CgpbUHJvZmVzc29yIFBldGVyc2VuXShodHRwczovL3BzeWNob2xvZ3kudWlvd2EuZWR1L3Blb3BsZS9pc2FhYy1wZXRlcnNlbilcCk9mZmljZTogMTc1IFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIEJ1aWxkaW5nIChQQlNCKVwKRS1tYWlsOiBbaXNhYWMtdC1wZXRlcnNlbkB1aW93YS5lZHVdKG1haWx0bzppc2FhYy10LXBldGVyc2VuQHVpb3dhLmVkdSlcCk9mZmljZSBQaG9uZTogNDY3LTEwMTRcClN0dWRlbnQgZHJvcC1pbiBob3VyczogPG1hcms+SU5TRVJUPC9tYXJrPlwKTm90ZTogSSdtIGhlcmUgdG8gaGVscCB5b3UgbGVhcm4gYW5kIHN1Y2NlZWQuClBsZWFzZSBjb21lIHRvIG15IG9mZmljZSBob3VycyB0byBhc2sgcXVlc3Rpb25zIGFib3V0IGNvdXJzZSBtYXRlcmlhbCwgYXNzaWdubWVudHMsIGV4YW1zLCBvciBwcm9mZXNzaW9uYWwgZGV2ZWxvcG1lbnQgKGNhcmVlci1yZWxhdGVkIGlzc3VlcyksIGZvciBpbnN0YW5jZS4KSSB3ZWxjb21lIHlvdSB0byBkaXNjdXNzIGFueSBjb25jZXJucyB5b3UgbWlnaHQgaGF2ZSBhYm91dCB0aGUgY2xhc3MuCkkgYW0gYWxzbyBhdmFpbGFibGUgdG8gbWVldCB3aXRoIHlvdSBieSBhcHBvaW50bWVudCwgYWx0aG91Z2ggSSB3b3VsZCBhcHByZWNpYXRlIHlvdXIgbWFraW5nIGV2ZXJ5IGVmZm9ydCB0byBzZWUgbWUgZHVyaW5nIG9mZmljZSBob3Vycy4KVGhlIGJlc3Qgd2F5IHRvIHJlYWNoIG1lIG91dHNpZGUgb2YgY2xhc3MgaXMgYnkgZW1haWwuCgojIERlcGFydG1lbnRhbCBSZXNvdXJjZXMgeyNkZXB0UmVzb3VyY2VzfQoKRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlczogW2h0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHVdKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUpXApEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIE1haW4gT2ZmaWNlOiBHNjAgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKDMzNS0yNDA2KVwKQ29vcmRpbmF0b3Igb2YgVW5kZXJncmFkdWF0ZSBTdHVkaWVzOiBQcm9mZXNzb3IgV2luZHNjaGl0bCAoW3BhdWwtd2luZHNjaGl0bEB1aW93YS5lZHVdKG1haWx0bzpwYXVsLXdpbmRzY2hpdGxAdWlvd2EuZWR1KTsgMzM1LTM2ODEpXApBY2FkZW1pYyBDb29yZGluYXRvcjogSmFuZWlsIFBhZ2UtSmFtaXNvbiAoW2phbmVpbC1wYWdlQHVpb3dhLmVkdV0obWFpbHRvOmphbmVpbC1wYWdlQHVpb3dhLmVkdSk7IDM4NC0zNjU3KVwKQ2hhaXIgb2YgRGVwYXJ0bWVudDogUHJvZmVzc29yIEJsdW1iZXJnIChbbWFyay1ibHVtYmVyZ0B1aW93YS5lZHVdKG1haWx0bzptYXJrLWJsdW1iZXJnQHVpb3dhLmVkdSk7IDMzNS0yNDI0KQoKIyBQcmVyZXF1aXNpdGVzIHsjcHJlcmVxc30KClRoZSBEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIGhhcyBhIGhpZXJhcmNoaWNhbCBjb3Vyc2Ugc3RydWN0dXJlIHRoYXQgcmVxdWlyZXMgc3R1ZGVudHMgdG8gY29tcGxldGUgY2VydGFpbiBwcmVyZXF1aXNpdGUgY291cnNlcyBiZWZvcmUgdGFraW5nIHVwcGVyLWxldmVsIGNvdXJzZXMuClRoaXMgY291cnNlIHJlcXVpcmVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiAoQy0gb3IgaGlnaGVyKSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGNvdXJzZXMgKG9yIEFQIFN0YXRpc3RpY3MgZnJvbSBoaWdoIHNjaG9vbCk6ClBTWSAyODExLCBQU1FGIDEwMjAsIFBTUUYgNDE0MywgU1RBVCAxMDEwLCBTVEFUIDEwMTUsIFNUQVQgMTAyMCwgU1RBVCAxMDMwLCBTVEFUIDM1MTAsIFNUQVQgNDE0MwpUaGUgZGVwYXJ0bWVudCB3aWxsIGNoZWNrIHN0dWRlbnQgcmVjb3JkcyB0byBlbnN1cmUgY29tcGxldGlvbiBvZiBjb3Vyc2UgcHJlcmVxdWlzaXRlcy4KCkFueSBvZiB0aGUgZm9sbG93aW5nIGNvdXJzZXMgd2l0aCBhIG1pbmltdW0gZ3JhZGUgb2YgQy0gKG9yIEFQIHN0YXRzIGZyb20gaGlnaCBzY2hvb2wpOgpQU1kgMjgxMSwgUFNRRiAxMDIwLCBQU1FGIDQxNDMsIFNUQVQgMTAxMCwgU1RBVCAxMDE1LCBTVEFUIDEwMjAsIFNUQVQgMTAzMCwgU1RBVCAzNTEwLCBTVEFUIDQxNDMKCiMgRGVzY3JpcHRpb24gb2YgQ291cnNlIHsjZGVzY3JpcHRpb259CgpIb3cgY2FuIHdlIHVzZSBpbmZvcm1hdGlvbiB0byBtYWtlIHByZWRpY3Rpb25zIGFib3V0IHVuY2VydGFpbiBldmVudHM/ClRoaXMgY291cnNlIGlzIGFib3V0IGVtcGlyaWNpc20gKGJhc2luZyB0aGVvcmllcyBvbiBvYnNlcnZlZCBkYXRhKSBhbmQganVkZ21lbnQsIHByZWRpY3Rpb24sIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gdGhlIGNvbnRleHQgb2YgdW5jZXJ0YWludHkuClN0dWRlbnRzIHdpbGwgYmUgaW50cm9kdWNlZCB0byBtb2Rlcm4gYW5hbHl0aWNhbCB0ZWNobmlxdWVzIHVzZWQgdG8gbWFrZSBpbmZvcm1lZCBwcmVkaWN0aW9ucywgdGVzdCB0aGVvcmllcywgYW5kIGRyYXcgY29uY2x1c2lvbnMgZnJvbSBhIGdpdmVuIGRhdGFzZXQuCkJ1dCB0aGlzIGlzIG5vIG9yZGluYXJ5IGNvdXJzZS4uLgoKUmF0aGVyIHRoYW4gbWVtb3JpemluZyB0aGVzZSBlbXBpcmljYWwgYXBwcm9hY2hlcyBpbiBhYnN0cmFjdGlvbiwgc3R1ZGVudHMgd2lsbCBlbXBsb3kgdGhlc2UgbWV0aG9kcyBpbiB0aGUgYWN0aXZlLCBpbW1lcnNpdmUsIGhhbmRzLW9uIGxlYXJuaW5nIGxhYm9yYXRvcnkgb2YgRmFudGFzeSBGb290YmFsbC4KSW4gdGhpcyB3YXksIHRoZSBjb3Vyc2Ugd2lsbCB3ZWF2ZSB0b2dldGhlciB0d28gY29udGlndW91cyB0aHJlYWRzOiBhbiBpbnRyb2R1Y3Rvcnkgb3ZlcnZpZXcgb2YgZGF0YSBhbmFseXNpcyB0ZWNobmlxdWVzLCBhbmQgYSBjYXB0aXZhdGluZyBhcHBsaWNhdGlvbiBvZiB0aGVzZSB0ZWNobmlxdWVzIHRocm91Z2ggYSBzZW1lc3Rlci1sb25nIGV4cGVyaWVuY2UgaW4gRmFudGFzeSBGb290YmFsbCB3aXRoIHRoZWlyIGNsYXNzbWF0ZXMuW15hZGFwdGVkXQoKVGhlIGNsYXNzIGludm9sdmVzIHJlYWRpbmcgcHJpbWFyeSBzb3VyY2UgbWF0ZXJpYWwsIGFwcGx5aW5nIHN0YXRpc3RpY2FsIHByb2dyYW1taW5nICh1c2luZyBgUmAgc29mdHdhcmUpLCBjb25kdWN0aW5nIGRhdGEgYW5hbHlzaXMsIGFuZCBjb21wb3Npbmcgd3JpdHRlbiB3b3JrIG9uIGEgd2Vla2x5IGJhc2lzLgoKVG8gYmUgY2xlYXIsIDx1PnRoaXMgaXMgYSBzdGF0aXN0aWNzIGFuZCBlbXBpcmljaXNtIGNvdXJzZTwvdT4uCkl0IG1lcmVseSB1c2VzIGZhbnRhc3kgZm9vdGJhbGwgYXMgYSBsZW5zIGFuZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHdoaWNoIHRvIGxlYXJuIGFib3V0IHN0YXRpc3RpY3MgYW5kIGVtcGlyaWNpc20uClRoZSBjbGFzcyBkb2VzIG5vdCBhc3N1bWUgdGhhdCBzdHVkZW50cyBrbm93IGFueXRoaW5nIGFib3V0IChvciBjYXJlIGFib3V0KSBmb290YmFsbCBvciBmYW50YXN5IGZvb3RiYWxsLgpUaGUgY2xhc3MgaXMgd2VsY29tZSB0byBhbGwsIGFzc3VtaW5nIHRoZSBzdHVkZW50IG1lZXRzIHRoZSBwcmVyZXF1aXNpdGVzIGFuZCB0aGF0IHRoZXkgYXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgYWJvdXQgZW1waXJpY2lzbSAoYmFzaW5nIHRoZW9yaWVzIG9uIG9ic2VydmVkIGRhdGEpLCBzdGF0aXN0aWNzLCBhbmQganVkZ21lbnQsIHByZWRpY3Rpb24sIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gdGhlIGNvbnRleHQgb2YgdW5jZXJ0YWludHkuCgpUYWtlIHRoaXMgY2xhc3MgaWY6CgotIHlvdSB3YW50IHRvIGxlYXJuIG1vcmUgYWR2YW5jZWQgc2tpbGxzIGluIDEpIGVtcGlyaWNpc20sIDIpIHN0YXRpc3RpY3MsIDMpIHByb2dyYW1taW5nICh1c2luZyBgUmAgc29mdHdhcmUpLCBhbmQgNCkganVkZ21lbnQsIHByZWRpY3Rpb24sIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gdGhlIGNvbnRleHQgb2YgdW5jZXJ0YWludHk7Ci0geW91IGFyZSBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIHN0YXRpc3RpY3MgdGhyb3VnaCB0aGUgbGVucyBvZiBhIGZ1biBzcG9ydHMgZG9tYWluIChmYW50YXN5IGZvb3RiYWxsKTsgb3IKLSB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYXBwbHlpbmcgcHN5Y2hvbG9naWNhbCBhbmQgc3RhdGlzdGljYWwgY29uY2VwdHMgdG8gZmFudGFzeSBmb290YmFsbCwgdG8gZ2FpbiBhIHN0cm9uZyB1bmRlcnN0YW5kaW5nIG9mIGNyaXRpY2FsIHRoaW5raW5nIGFuZCBkZWNpc2lvbiBtYWtpbmcgaW4gc3BvcnRzLgoKKkRvIG5vdCB0YWtlIHRoaXMgY2xhc3MgaWYqOgoKLSB5b3UgYXJlIGp1c3QgbG9va2luZyBmb3IgYW4gImVhc3kiIGNsYXNzICh0aGUgY2xhc3MgaXMgbm90IGVhc3kpOwotIHlvdSBhcmUgcmVsdWN0YW50IHRvIGV4YW1pbmUgZmFudGFzeSBmb290YmFsbCB0b3BpY3MgaW4gYSBzY2llbnRpZmljIG1hbm5lcjsKLSB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgcHVibGljIGJsb2cgYXJ0aWNsZXMgYXMgcGFydCBvZiB0aGUgY2xhc3M7IG9yCi0geW91IGRvIG5vdCB3YW50IHRvIGxlYXJuIHN0YXRpc3RpY3MgYW5kIHByb2dyYW1taW5nLCBhbmQgZG8gbm90IHdhbnQgdG8gcGVyc2lzdCB0aHJvdWdoIGluZXZpdGFibGUgY2hhbGxlbmdlcyBhbG9uZyB0aGUgd2F5LgoKW15hZGFwdGVkXToKICAgIEVsZW1lbnRzIG9mIHRoaXMgc3lsbGFidXMgYW5kIGNvdXJzZSB3ZXJlIGJvcnJvd2VkIGFuZCBhZGFwdGVkICh3aXRoIHBlcm1pc3Npb24pIGZyb20gYSBzaW1pbGFyIGNvdXJzZSBieSBCZW5qYW1pbiBNb3R6LgoKIyMgV2hhdCBpcyBGYW50YXN5IEZvb3RiYWxsPyBBbmQgV2h5IEZvY3VzIG9uIEZhbnRhc3kgRm9vdGJhbGw/IHsjZmFudGFzeUZvb3RiYWxsfQoKRmFudGFzeSBmb290YmFsbCBpcyBhbiBvbmxpbmUgZ2FtZSB3aGVyZSBwYXJ0aWNpcGFudHMgYXNzZW1ibGUgKGkuZS4sICJkcmFmdCIpIGltYWdpbmFyeSB0ZWFtcyBjb21wb3NlZCBvZiByZWFsLWxpZmUgTmF0aW9uYWwgRm9vdGJhbGwgTGVhZ3VlIChORkwpIHBsYXllcnMuCkluIHRoZSBnYW1lIG9mIGZhbnRhc3kgZm9vdGJhbGwsIHBhcnRpY2lwYW50cyBjb21wZXRlIGFnYWluc3Qgb3RoZXJzLCBhY2N1bXVsYXRpbmcgImZhbnRhc3kiIHBvaW50cyBiYXNlZCBvbiBwbGF5ZXJzJyBhY3R1YWwgc3RhdGlzdGljYWwgcGVyZm9ybWFuY2VzIGluIGdhbWVzIChhbmQgdGhlIGdvYWwgaXMgdG8gb3V0c2NvcmUgb25l4oCZcyBvcHBvbmVudCBlYWNoIHdlZWsgdG8gd2luIG1hdGNoZXMgYW5kIHVsdGltYXRlbHkgY2xhaW0gdmljdG9yeSBpbiB0aGUgbGVhZ3VlKS4KRmFudGFzeSBmb290YmFsbCByZWxpZXMgaGVhdmlseSBvbiBwcmVkaWN0aW9u4oCUdHJ5aW5nIHRvIHByZWRpY3Qgd2hpY2ggcGxheWVycyB3aWxsIHBlcmZvcm0gYmVzdCBhbmQgc2VsZWN0aW5nIHRoZW0gYWNjb3JkaW5nbHkuCkluIHRoaXMgd2F5LCBmYW50YXN5IGZvb3RiYWxsIHByb3ZpZGVzIGEgcGxldGhvcmEgb2YgZGVjaXNpb24gbWFraW5nIG9wcG9ydHVuaXRpZXMgaW4gdGhlIGZhY2Ugb2YgdW5jZXJ0YWludHksIGFuZCBhIHdlYWx0aCBvZiBkYXRhIGZvciBhbmFseXppbmcgdGhlc2UgZGVjaXNpb25zLgpIb3dldmVyLCB1bmxpa2UgbWFueSBvdGhlciBhcHBsaWVkIGRvbWFpbnMgaW4gcHN5Y2hvbG9neSwgZmFudGFzeSBmb290YmFsbCAoMSkgYWxsb3dzIGEgcGVyc29uIHRvIHNlZSB0aGUgYWNjdXJhY3kgb2YgdGhlaXIgcHJlZGljdGlvbnMgb24gYSB0aW1lbHkgYmFzaXMgYW5kICgyKSBwcm92aWRlcyBhIHNhZmUgZW52aXJvbm1lbnQgZm9yIGZyaWVuZGx5IGNvbXBldGl0aW9uLgpUaHVzLCBpdCBwcm92aWRlcyBhIHVuaXF1ZSBkb21haW4gdG8gZXZhbHVhdGXigJRhbmQgaW1wcm92ZeKAlHRoZSBhY2N1cmFjeSBvZiB2YXJpb3VzIHByZWRpY3Rpb24gbW9kZWxzLgoKIyBMZWFybmluZyBPYmplY3RpdmVzIHsjb2JqZWN0aXZlc30KCkJ5IHRoZSBlbmQgb2YgdGhlIGNvdXJzZSwgc3VjY2Vzc2Z1bCBzdHVkZW50cyB3aWxsIGJlIGFibGUgdG86CgotIEFwcGx5IGVtcGlyaWNhbCBpbmZlcmVuY2UgYW5kIGFwcHJlY2lhdGUgdGhlIHZhbHVlIGl0IHByb3ZpZGVzIG92ZXIgc3BlY3VsYXRpdmUgc3VwcG9zaXRpb24uCi0gQXNrIGVkdWNhdGVkIHF1ZXN0aW9ucyB3aGVuIGNvbmZyb250ZWQgd2l0aCBkZWNpc2lvbnMgaW4gdGhlIGZhY2Ugb2YgdW5jZXJ0YWludHkuCi0gVW5kZXJzdGFuZCBodW1hbiBkZWNpc2lvbiBtYWtpbmcsIGluY2x1ZGluZyBjb21tb24gaGV1cmlzdGljcyBhbmQgY29nbml0aXZlIGJpYXNlcyBhbmQgaG93IHRvIG1pdGlnYXRlIHRoZW0gYW5hbHl0aWNhbGx5LgotIEVuZ2FnZSBpbiBjcml0aWNhbCB0aGlua2luZyBhYm91dCBjYXVzYWxpdHksIGluY2x1ZGluZyBkZXZpc2luZyBwbGF1c2libGUgYWx0ZXJuYXRpdmUgZXhwbGFuYXRpb25zIGZvciBvYnNlcnZlZCBlZmZlY3RzLgotIFVuZGVyc3RhbmQgY2F1c2FsIGluZmVyZW5jZSBpbmNsdWRpbmcgY29uZm91bmRpbmcsIGNhdXNhbCBwYXRod2F5cywgYW5kIGNvdW50ZXJmYWN0dWFscy4KLSBUaGluayBlbXBpcmljYWxseSBhYm91dCBodW1hbiBiZWhhdmlvciBhbmQgcGVyZm9ybWFuY2UuCi0gRGVzY3JpYmUgdGhlIHN0cmVuZ3RocyBhbmQgd2Vha25lc3NlcyBvZiBodW1hbnMgdmVyc3VzIGNvbXB1dGVycyBpbiBwcmVkaWN0aW9uIHNjZW5hcmlvcy4KLSBBcHBseSBiYXNpYyBza2lsbHMgaW4gc3RhdGlzdGljYWwgcHJvZ3JhbW1pbmcgdXNpbmcgYFJgIHRvIG1hbmlwdWxhdGUgYW5kIHN1bW1hcml6ZSBkYXRhc2V0cyBhbmQgdG8gY29uZHVjdCBkYXRhIGFuYWx5c2lzLgotIENyaXRpY2FsbHkgZXZhbHVhdGUgdGhlIHN0cmVuZ3RocyBhbmQgbGltaXRhdGlvbnMgb2YgZGlmZmVyZW50IHN0YXRpc3RpY2FsIG1vZGVscyBhbmQgbWV0aG9kb2xvZ2llcyB1c2VkIGluIHByZWRpY3RpbmcgdW5jZXJ0YWluIGV2ZW50cywgZW5oYW5jaW5nIHRoZWlyIHVuZGVyc3RhbmRpbmcgb2Ygc3RhdGlzdGljYWwgaW5mZXJlbmNlIGFuZCBtb2RlbCBzZWxlY3Rpb24uCi0gVXNlIHZhcmlvdXMgYW5hbHl0aWNhbCB0ZWNobmlxdWVzIGZvciBwcmVkaWN0aW5nIHRoZSBvdXRjb21lIG9mIHVuY2VydGFpbiBldmVudHMsIGFuZCBmb3IgdW5jb3ZlcmluZyBsYXRlbnQgY2F1c2VzIG9mIHBhdHRlcm5zIGluIG9ic2VydmVkIGRhdGEuCi0gSW50ZXJwcmV0IGZpbmRpbmdzIGZyb20gdmFyaW91cyBzdGF0aXN0aWNhbCBhcHByb2FjaGVzIGFuZCBldmFsdWF0ZSB0aGUgYWNjdXJhY3kgb2YgcHJlZGljdGlvbnMuCi0gRW5nYWdlIGluIGl0ZXJhdGl2ZSBwcm9ibGVtLXNvbHZpbmcgcHJvY2Vzc2VzLCByZWZpbmluZyBhbmFseXRpY2FsIGFwcHJvYWNoZXMgYmFzZWQgb24gZmVlZGJhY2sgYW5kIG91dGNvbWVzLCBhbmQgYWRhcHRpbmcgc3RyYXRlZ2llcyBhY2NvcmRpbmdseS4KLSBDb21tdW5pY2F0ZSBzdGF0aXN0aWNhbCBmaW5kaW5ncyBhbmQgYW5hbHlzZXMgaW4gYm90aCB3cml0dGVuIGFuZCBvcmFsIGZvcm1hdHMsIGRlbW9uc3RyYXRpbmcgcHJvZmljaWVuY3kgaW4gcHJlc2VudGluZyBjb21wbGV4IGluZm9ybWF0aW9uIHRvIGRpdmVyc2UgYXVkaWVuY2VzLgotIE1ha2Ugc2Vuc2Ugb2YgYmlnIGRhdGEuCi0gVXNlIHByYWN0aWNhbCBhbmFseXRpY2FsIHNraWxscyB0aGF0IGNhbiBiZSBhcHBsaWVkIGluIGZ1dHVyZSByZXNlYXJjaCBhbmQgam9iIHNldHRpbmdzLgoKIyBUZXh0Ym9vayB7I3RleHRib29rfQoKVGhlIGNvc3Qgb2YgdGV4dGJvb2tzIGhhcyBiZWNvbWUgc28gaGlnaCB0aGF0IEkgZG8gbm90IGZlZWwgY29tZm9ydGFibGUgcmVxdWlyaW5nIHN0dWRlbnRzIHRvIHB1cmNoYXNlIGEgdGV4dGJvb2suClRodXMsIEkgY3JlYXRlZCBhIHRleHRib29rIGZvciB0aGlzIGNvdXJzZS4KVGhlIHRleHRib29rIGZvciB0aGlzIGNvdXJzZSBpcyBhdmFpbGFibGUgPHU+Zm9yIGZyZWU8L3U+IG9ubGluZToKaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2sKCiMgUmVxdWlyZWQgTWF0ZXJpYWxzIHsjcmVxdWlyZWRNYXRlcmlhbHN9CgpGb3IgdGhlIGNsYXNzLCB5b3Ugd2lsbCBiZSByZXF1aXJlZCB0byBoYXZlIGFjY2VzcyB0byBhIGNvbXB1dGVyIHRoYXQgYWxsb3dzIHlvdSB0byBpbnN0YWxsIGFuZCBydW4gc29mdHdhcmUgKGluY2x1ZGluZyBgUmAsIGBnaXRgLCBhbmQgYEdpdEh1YiBEZXNrdG9wYCkuCkEgbGFwdG9wIGlzIHByZWZlcmFibGUsIHNvIHlvdSBjYW4gYnJpbmcgaXQgdG8gY2xhc3MgYW5kIHdvcmsgdGhyb3VnaCBleGFtcGxlcyBpbiBjbGFzcy4KCiMgQWNhZGVtaWMgSG9uZXN0eSBhbmQgTWlzY29uZHVjdCB7I2FjYWRlbWljSG9uZXN0eX0KCkFsbCBzdHVkZW50cyBpbiBDTEFTIGNvdXJzZXMgYXJlIGV4cGVjdGVkIHRvIGFiaWRlIGJ5IHRoZSBbY29sbGVnZSdzIHN0YW5kYXJkcyBvZiBhY2FkZW1pYyBob25lc3R5XShodHRwczovL2NsYXMudWlvd2EuZWR1L3N0dWRlbnRzL2hhbmRib29rL2FjYWRlbWljLWZyYXVkLWhvbm9yLWNvZGUpLgpBY2FkZW1pYyBtaXNjb25kdWN0IG11c3QgYmUgcmVwb3J0ZWQgYnkgaW5zdHJ1Y3RvcnMgdG8gQ0xBUyBhY2NvcmRpbmcgdG8gW3RoZXNlIHByb2NlZHVyZXNdKGh0dHBzOi8vcG9saWN5LmNsYXMudWlvd2EuZWR1L2NsYXMtcG9saWNpZXMtYW5kLXByb2NlZHVyZXMvdW5kZXJncmFkdWF0ZS1lZHVjYXRpb24vYWNhZGVtaWMtbWlzY29uZHVjdC11bmRlcmdyYWR1YXRlKS4KUGxlYXNlIG5vdGUgdGhhdCBjb2xsYWJvcmF0aW9uIHdpdGggb3RoZXIgY2xhc3NtYXRlcyBvbiA8dT5xdWl6emVzLCB3cml0aW5nIGFzc2lnbm1lbnRzLCBhbmQgZHVyaW5nIGV4YW1zPC91PiBpcyBub3QgcGVybWl0dGVkLgpIb3dldmVyLCBJIGRvIGVuY291cmFnZSB5b3UgdG8gY29sbGFib3JhdGUgd2l0aCBjbGFzc21hdGVzIHRvIHRvIGxlYXJuIGBSYCwgc3RhdGlzdGljcywgYW5kIHByb2dyYW1taW5nLCBhbmQgdG8gKnByZXBhcmUqIGZvciBleGFtcyAoZS5nLiwgaW5mb3JtYWwgc3R1ZHkgZ3JvdXBzKS4KQmVjYXVzZSB3cml0aW5nLCBhbmFseXRpY2FsLCBhbmQgY3JpdGljYWwgdGhpbmtpbmcgc2tpbGxzIGFyZSBwYXJ0IG9mIHRoZSBsZWFybmluZyBvdXRjb21lcyBvZiB0aGlzIGNvdXJzZSwgYWxsIHdvcmsgc3VibWl0dGVkIGJ5IHN0dWRlbnRzIHNob3VsZCBiZSBwcmVwYXJlZCBieSB0aGUgc3R1ZGVudC4KRGV2ZWxvcGluZyBzdHJvbmcgY29tcGV0ZW5jaWVzIGluIHRoZXNlIGRvbWFpbnMgd2lsbCBwcmVwYXJlIHlvdSBmb3IgYSBjb21wZXRpdGl2ZSB3b3JrcGxhY2UuClRoZXJlZm9yZSwgQUktZ2VuZXJhdGVkIHN1Ym1pc3Npb25zIGFyZSBub3QgcGVybWl0dGVkIGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXMgcGxhZ2lhcmlzbS4KCiMgQ291cnNlIFJlcXVpcmVtZW50cyBhbmQgUG9saWNpZXMgeyNyZXF1aXJlbWVudHN9CgojIyBMZWN0dXJlIHsjbGVjdHVyZX0KCldlIHdpbGwgbWVldCB0d28gdGltZXMgd2Vla2x5IGZvciBsZWN0dXJlcywgYXQgdGhlIHRpbWUgYW5kIGxvY2F0aW9uIGRlc2NyaWJlZCBbYWJvdmVdKCNsZWN0dXJlVGltZSkuCk15IHBvd2VycG9pbnQgcHJlc2VudGF0aW9ucyBmb3IgdGhlIGxlY3R1cmVzIHdpbGwgYmUgcG9zdGVkIG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBubyBsYXRlciB0aGFuIG5vb24gb24gdGhlIGRheSBiZWZvcmUgdGhlIGxlY3R1cmUgKHRob3VnaCBJIG1heSBjb250aW51ZSB0byByZWZpbmUgdGhlIHNsaWRlcyB1cCB1bnRpbCB0aGUgdGltZSBvZiBsZWN0dXJlKS4KPHU+UGxlYXNlIG5vdGU6PC91PiBwb3dlcnBvaW50IHByZXNlbnRhdGlvbnMgYXJlIGFuIG91dGxpbmUgb2YgbXkgcG9pbnRzLiAKPHU+SXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byB0YWtlIG5vdGVzIGR1cmluZyBjbGFzcy48L3U+CklmIHlvdSBoYXZlIHF1ZXN0aW9ucyBhYm91dCB0aGUgbGVjdHVyZSBub3RlcyBvciBuZWVkIGNsYXJpZmljYXRpb24gb2YgYW55IG9mIHRoZSBwb2ludHMsIHBsZWFzZSBhc2sgaW4gY2xhc3Mgb3IgbWVldCB3aXRoIFByb2Zlc3NvciBQZXRlcnNlbiBkdXJpbmcgb2ZmaWNlIGhvdXJzLgpJZiB5b3UgbWlzcyBhIGxlY3R1cmUsIGdldCBhbmQgcmV2aWV3IG5vdGVzIHdpdGggYSBwZWVyIGFuZCB3YXRjaCB0aGUgbGVjdHVyZSByZWNvcmRpbmcuClRoZW4sIGNvbWUgdG8gb2ZmaWNlIGhvdXJzIGlmIHlvdSBoYXZlIHNwZWNpZmljIHF1ZXN0aW9ucy4KCiMjIyBMZWN0dXJlIFJlY29yZGluZ3MgeyNyZWNvcmRpbmdzfQoKTXkgaW50ZW50aW9uIGlzIHRvIHJlY29yZCBsZWN0dXJlcyBzbyB0aGF0IHlvdSBtYXkgcmV2aWV3IHRoZW0uClJlY29yZGVkIGxlY3R1cmVzIHdpbGwgYmUgcG9zdGVkIG9uIHRoZSAiVUlDYXB0dXJlIiB0YWIgaW4gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpLgpIb3dldmVyLCA8dT5wbGVhc2UgZG8gbm90IGNvdW50IG9uIHJlY29yZGluZ3MgYmVpbmcgYXZhaWxhYmxlPC91PiwgaW4gY2FzZSBJIGFjY2lkZW50YWxseSBmb3JnZXQgdG8gaW5pdGlhdGUgdGhlIHJlY29yZGluZyBvciB0aGVyZSBpcyBhIHRlY2huaWNhbCBtYWxmdW5jdGlvbi4KCiMjIEF0dGVuZGFuY2UgYW5kIFBhcnRpY2lwYXRpb24geyNhdHRlbmRhbmNlUGFydGljaXBhdGlvbn0KCkF0dGVuZGFuY2UgYXQgbGVjdHVyZXMgaXMgcmVxdWlyZWQgYW5kIHdpbGwgYmUgZmFjdG9yZWQgaW50byBmaW5hbCBncmFkZXMgKHNlZSBncmFkaW5nIHNlY3Rpb24gW2JlbG93XSgjY291cnNlR3JhZGVzKSkuClRoZXJlIGFyZSAyOSBsZWN0dXJlcyBkdXJpbmcgdGhlIHNlbWVzdGVyIChleGNsdWRpbmcgdGhlIGV4YW1pbmF0aW9ucykuCllvdSB3aWxsIHJlY2VpdmUgb25lIHBvaW50IGZvciBhdHRlbmRhbmNlIGF0IGVhY2ggbGVjdHVyZSB1cCB0byAyNyBwb2ludHMgKGkuZS4sIHlvdSB3aWxsIG5vdCByZWNlaXZlIGV4dHJhIGNyZWRpdCBmb3IgYXR0ZW5kaW5nIGFsbCAyOSBsZWN0dXJlcykuCjx1PlRodXMsIHlvdSB3aWxsIG5vdCBiZSBwZW5hbGl6ZWQgZm9yIG1pc3NpbmcgdXAgdG8gMiBsZWN0dXJlcy4KSG93ZXZlciwgeW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGxlYXJuaW5nIGFueSBtYXRlcmlhbCBtaXNzZWQgZm9yIHF1aXp6ZXMgYW5kIGV4YW1zLCBhbmQgSSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGF0dGVuZCBhbGwgbGVjdHVyZXMuClBvb3IgbGVjdHVyZSBhdHRlbmRhbmNlIGlzIGxpa2VseSB0byBhZmZlY3QgdGhlIHF1YWxpdHkgb2Ygc3R1ZGVudHMnIHdvcmsgYW5kIHN1Y2Nlc3MgaW4gdGhlIGNvdXJzZS48L3U+CgpTdHVkZW50cyB3aG8gbWlzcyA8dT5tb3JlIHRoYW4gMiBsZWN0dXJlczwvdT4gZHVlIHRvIHBhcnRpY2lwYXRpb24gaW4gVW5pdmVyc2l0eSBhY3Rpdml0aWVzIG11c3QgZ2l2ZSB0aGUgaW5zdHJ1Y3RvciBhIHN0YXRlbWVudCA8dT5iZWZvcmUgdGhlIGFic2VuY2U8L3U+IHNpZ25lZCBieSBhIHJlc3BvbnNpYmxlIG9mZmljaWFsIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRlcyBhbmQgdGltZXMgdGhlIHN0dWRlbnQgd2lsbCBtaXNzIGNsYXNzLgpBdXRob3JpemVkIGFjdGl2aXRpZXMgaW5jbHVkZSBwYXJ0aWNpcGF0aW9uIGluIGF0aGxldGljIHRlYW1zLCB0aGUgbWFyY2hpbmcgYmFuZCBvciBwZXAgYmFuZCwgZGViYXRlIHRlYW1zLCBhbmQgb3RoZXIgcmVjb2duaXplZCBVbml2ZXJzaXR5IGdyb3VwcywgYXMgd2VsbCBhcyBwYXJ0aWNpcGF0aW9uIGluIFVuaXZlcnNpdHkgZmllbGQgdHJpcHMsIHNlcnZpY2Ugd2l0aCB0aGUgTmF0aW9uYWwgR3VhcmQsIGFuZCBqdXJ5IGR1dHkuCkFic2VuY2VzIGR1ZSB0byBpbGxuZXNzZXMgb3IgZW1lcmdlbmNpZXMgKHRoYXQgZ28gb3ZlciAyIGxlY3R1cmVzKSBtdXN0IGJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgVW5pdmVyc2l0eSBvZiBJb3dhIFtBYnNlbmNlIEV4cGxhbmF0aW9uIEZvcm1dKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LWF0dGVuZGFuY2UtYW5kLWFic2VuY2VzKSBhbmQgc2VudCB0byBQcm9mZXNzb3IgUGV0ZXJzZW4gd2l0aGluIDQ4IGhvdXJzIG9mIHRoZSBhYnNlbmNlLgpQZXIgdW5pdmVyc2l0eSBwb2xpY3ksIGlmIGEgc3R1ZGVudCB3aWxsIGJlIGFic2VudCA8dT41IG9yIG1vcmUgY29uc2VjdXRpdmUgZGF5cyBhbmQgdGhlIGFic2VuY2UgaXMgZHVlIHRvIGlsbG5lc3Mgb3Igb3RoZXIgZW1lcmdlbmN5PC91PiwgcGxlYXNlIGNvbnRhY3QgdGhlIFJlZ2lzdHJhciBTZXJ2aWNlIENlbnRlciBhdCAoMzE5KSAzODQtNDMwMCBvciByZWdpc3RyYXJAdWlvd2EuZWR1LgoKIyMgQmxvZyBBcnRpY2xlcyB7I2Jsb2dBcnRpY2xlc30KCkFzIHBhcnQgb2YgdGhlIGNsYXNzLCB5b3Ugd2lsbCBwb3N0IGJsb2cgYXJ0aWNsZXMgKHNlZSB0aGUgW2NvdXJzZSBzY2hlZHVsZV0oI291dGxpbmUpIGZvciBkZWFkbGluZXMpLgo8dT5UaGUgYmxvZyBhcnRpY2xlcyBhcmUgcHVibGljPC91PjsgPHU+ZG8gbm90IHRha2UgdGhpcyBjb3Vyc2UgaWYgeW91IGRvIG5vdCBmZWVsIGNvbWZvcnRhYmxlIHBvc3RpbmcgYmxvZyBhcnRpY2xlcyB3aXRoIHlvdXIgZnVsbCBuYW1lIGluIGEgcHVibGljIGZvcnVtPC91Pi4KVGhlcmUgd2lsbCBiZSBhIHBlbmFsdHkgb2YgMjAlIGZvciBhbGwgYmxvZyBhcnRpY2xlcyB0dXJuZWQgaW4gbGF0ZS4KWW91ciBsb3dlc3Qgc2NvcmUgd2lsbCBiZSBkcm9wcGVkLgpBIGJsb2cgYXJ0aWNsZSBpcyBub3QgY29uc2lkZXJlZCAic3VibWl0dGVkIiB1bnRpbCB5b3UgKGEpIHBvc3QgdGhlIGJsb2cgYXJ0aWNsZSBzbyB0aGF0IGl0IGlzIGxpdmUgYW5kIHB1YmxpY2x5IGF2YWlsYWJsZSwgQU5EIChiKSBzdWJtaXQgdGhlIGFzc2lnbm1lbnQgb24gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpIHdpdGggdGhlIFVSTCBsaW5rIHRvIHlvdXIgYmxvZyBhcnRpY2xlLgpBbGwgYmxvZyBhcnRpY2xlcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBieSAxMTo1OSBwLm0uIG9uIHRoZSBkdWUgZGF0ZS4KCllvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgeW91ciBibG9nIGFydGljbGUgPHU+d2VsbCBiZWZvcmU8L3U+IHRoZSBkZWFkbGluZS4KPHU+WW91IGNhbiBleHBlY3QgdG8gcnVuIGludG8gdGVjaG5pY2FsIGlzc3VlczwvdT4gKGUuZy4sIGVycm9ycyB3aGVuIHJ1bm5pbmcgeW91ciBjb2RlLCBpc3N1ZXMgZ2V0dGluZyB0aGUgYmxvZyBwb3N0IHRvIGNvbXBpbGUgZXRjLikuClRodXMsIHlvdSBzaG91bGQgZ2l2ZSB5b3Vyc2VsZiBwbGVudHkgb2YgdGltZSB0byBbdHJvdWJsZXNob290XSgjdHJvdWJsZXNob290aW5nKSAoc2VlIGJlbG93KSBzbyB0aGF0IHlvdSBjYW4gc3VibWl0IHlvdXIgYmxvZyBhcnRpY2xlIG9uIHRpbWUuCgojIyMgVHJvdWJsZXNob290aW5nIHsjdHJvdWJsZXNob290aW5nfQoKSWYgeW91IHJ1biBpbnRvIGlzc3VlcyByZWxhdGVkIHRvIGBSYCwgYEdpdEh1YmAsIG9yIHlvdXIgY29kZSwgSSBlbmNvdXJhZ2UgeW91IHRvIHRyeSBvbmUgKG9yIG1vcmUpIG9mIHRoZSBmb2xsb3dpbmc6CgotIFBlcmZvcm0gYSBHb29nbGUgc2VhcmNoIGZvciB0aGUgZXJyb3IvaXNzdWUKLSBBc2sgYSBwZWVyCi0gUG9zdCBvbiBbZm9ydW1zIGRlZGljYXRlZCB0byBgUmBdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2dldHRpbmctc3RhcnRlZC5odG1sI3NlYy1nZXR0aW5nSGVscFIpCi0gQ29tZSB0byBvZmZpY2UgaG91cnMKCkkgYW0gcXVpdGUgYnVzeSwgYW5kIEkgYXBwcmVjaWF0ZSB5b3VyIG1ha2luZyBldmVyeSBlZmZvcnQgdG8gc29sdmUgdGhlIGlzc3VlIG9uIHlvdXIgb3duIG9yIHVzaW5nIG9uZSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgd2F5cyBiZWZvcmUgZW1haWxpbmcgbWUuCkkgZG8gbm90IG9mdGVuIHJlc3BvbmQgdG8gZW1haWxzIGR1cmluZyBldmVuaW5ncyBvciB3ZWVrZW5kcywgYW5kIEkgY2Fubm90IGJlIGV4cGVjdGVkIHRvIHNvbHZlIGxhc3QtbWludXRlIGlzc3VlcyB0aGF0IHlvdSBjb3VsZCBoYXZlIHNvbHZlZCBlYXJsaWVyLgoKIyMgUmVhZGluZ3MgJiBRdWl6emVzIHsjcmVhZGluZ1F1aXp6ZXN9CgpSZWFkaW5ncyBhbmQgb3RoZXIgbWF0ZXJpYWxzIHdpbGwgYmUgcG9zdGVkIG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KS4KWW91IGFyZSBleHBlY3RlZCB0byBkbyB0aGUgcmVhZGluZ3MgYmVmb3JlIGNsYXNzLgpZb3Ugd2lsbCBoYXZlIGFuIG9ubGluZSBxdWl6IG9uIHRoZSByZWFkaW5ncyB0byBjb21wbGV0ZSBpbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSksIG9uIHlvdXIgb3duLCA8dT5iZWZvcmU8L3U+IGVhY2ggbGVjdHVyZS4KVGhlIHF1aXp6ZXMgYXJlIG1lYW50IHRvIGhlbHAgeW91IGNvbWUgdG8gY2xhc3MgcHJlcGFyZWQgdG8gY29udHJpYnV0ZSBzbyB5b3UgYXJlIGJlc3QtcG9zaXRpb25lZCB0byBsZWFybiBhbmQgdG8gaGVscCBvdGhlcnMgbGVhcm4uClRoZSBxdWl6emVzIGFyZSBub3QgdGltZWQgKHlvdSBjYW4gc3BlbmQgYXMgbXVjaCB0aW1lIGFzIHlvdSBuZWVkIG9uIGVhY2ggcXVpeiB1cCB1bnRpbCB0aGUgZGVhZGxpbmUpLgpUaGUgZGVhZGxpbmUgZm9yIGVhY2ggcXVpeiBpcyAzMCBtaW51dGVzIGJlZm9yZSBjbGFzcyBzdGFydHMuCkxhdGUgcmVzcG9uc2VzIGFuZCBtdWx0aXBsZSBzdWJtaXNzaW9ucyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4KWW91ciBsb3dlc3QgcXVpeiBzY29yZSB3aWxsIGJlIGRyb3BwZWQuCldlIHdpbGwgbm90IGFjY2VwdCBleGN1c2VkIGFic2VuY2VzIGZvciBxdWl6emVzIGJlY2F1c2UgKGEpIHlvdSBoYXZlIGEgd2VlayB0byBjb21wbGV0ZSB0aGUgcXVpeiAoYW5kIGNhbiBzdWJtaXQgaXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGF0IHdlZWspLCBhbmQgKGIpIHdlIGRyb3AgeW91ciBsb3dlc3QgcXVpeiBzY29yZS4KRWFjaCBxdWl6IHdpbGwgYmUgd2VpZ2h0ZWQgdGhlIHNhbWUgaW4gdGhlIGZpbmFsIGdyYWRlLgpRdWl6IGFuc3dlcnMgd2lsbCBiZSB2aWV3YWJsZSBhdCB0aGUgZW5kIG9mIHRoZSB3ZWVrIChpLmUuLCBhZnRlciB0aGUgbGFzdCBkaXNjdXNzaW9uIHNlY3Rpb24gaGFzIHRha2VuIHRoZWlyIHF1aXopLgoKUGFzdCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IGluIG9yZGVyIHRvIGRvIHdlbGwgaW4gdGhpcyBjbGFzcywgeW91IHNob3VsZCByZWFkIHRoZSByZXF1aXJlZCBtYXRlcmlhbCwgcGFydGljaXBhdGUgYWN0aXZlbHkgaW4gY2xhc3MsIGFuZCBnbyBvdmVyIHlvdXIgbm90ZXMgPHU+ZWFjaCB3ZWVrPC91Pi4KVGhlcmUgaXMgdG9vIG11Y2ggbWF0ZXJpYWwgYmVpbmcgY292ZXJlZCBpbiB0aGlzIGNsYXNzIHRvIHRyeSB0byBzdHVkeSBvbmx5IGJ5IGZyYW50aWMgcHJlcGFyYXRpb24gaW1tZWRpYXRlbHkgYmVmb3JlIGV4YW1zLgpOb3RlIHRoYXQgbGVjdHVyZSB3aWxsIDx1Pm5vdDwvdT4gY292ZXIgYWxsIHJlbGV2YW50IG1hdGVyaWFsIGZvciB0aGUgY291cnNlOyB5b3Ugd2lsbCBiZSBleHBlY3RlZCB0byBrbm93IHRoZSA8dT5yZXF1aXJlZDwvdT4gcmVhZGluZ3MgZm9yIGV4YW1zLgoKIyMgV29ya2xvYWQgeyN3b3JrbG9hZH0KClRoaXMgaXMgYSAzIHNlbWVzdGVyIGhvdXIgY291cnNlLgpTdHVkZW50cyBzaG91bGQgdGhlcmVmb3JlIGV4cGVjdCB0byBzcGVuZCBbNiBhZGRpdGlvbmFsIGhvdXJzIHBlciB3ZWVrXShodHRwczovL2NsYXMudWlvd2EuZWR1L2ZhY3VsdHkvc3R1ZGVudC13b3JrbG9hZC1ndWlkZWxpbmVzKSAob3V0c2lkZSBvZiBjbGFzcykgcmVhZGluZyB0aGUgYXJ0aWNsZXMsIHJldmlld2luZyBtYXRlcmlhbCBmcm9tIGxlY3R1cmUgYW5kIGRpc2N1c3Npb24gc2VjdGlvbiwgYW5kIHByZXBhcmluZyBmb3IgcXVpenplcyBhbmQgZXhhbXMuCgojIyBFeGFtaW5hdGlvbnMgeyNleGFtc30KClRoZXJlIHdpbGwgYmUgMiBleGFtczsgb25lIG1pZC10ZXJtIGV4YW0gYW5kIG9uZSBub24tY3VtdWxhdGl2ZSBmaW5hbCBleGFtLgpFYWNoIGV4YW0gd2lsbCBlbXBoYXNpemUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGZvciB0aGUgaGFsZiBvZiB0aGUgY2xhc3MgdGhhdCBwcmVjZWRlcyBpdC4KSG93ZXZlciwgc29tZSBpbnRlZ3JhdGlvbiBvZiBpbmZvcm1hdGlvbiBhY3Jvc3Mgc2VjdGlvbnMgd2lsbCBiZSByZXF1aXJlZCBmb3IgcXVlc3Rpb25zIG9uIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGV4YW1zLgpUaGUgZXhhbXMgd2lsbCBpbmNsdWRlIG11bHRpcGxlLWNob2ljZSBxdWVzdGlvbnMuCkV4YW0gcXVlc3Rpb25zIGNhbiBjb21lIGZyb20gPHU+YW55IG9mIHRoZSBmb2xsb3dpbmcgc291cmNlczogbGVjdHVyZXMgb3IgcmVxdWlyZWQgcmVhZGluZ3M8L3U+LgpGb3Igc3VnZ2VzdGVkIHN0dWR5IHRpcHMgZm9yIHRoaXMgY2xhc3MsIG1lZXQgd2l0aCBQcm9mZXNzb3IgUGV0ZXJzZW4gZHVyaW5nIG9mZmljZSBob3Vycy4KCiMjIyBNaXNzaW5nIEV4YW1zIHsjbWlzc2luZ0V4YW1zfQoKW1VuaXZlcnNpdHkgcmVndWxhdGlvbnMgcmVxdWlyZSB0aGF0IHN0dWRlbnRzIGJlIGFsbG93ZWQgdG8gbWFrZSB1cCBleGFtaW5hdGlvbnNdKGh0dHBzOi8vb3BzbWFudWFsLnVpb3dhLmVkdS9zdHVkZW50cy9hYnNlbmNlcy1jbGFzcykgdGhhdCBoYXZlIGJlZW4gbWlzc2VkIGR1ZSB0byBpbGxuZXNzLCByZWxpZ2lvdXMgaG9seSBkYXlzLCBtaWxpdGFyeSBzZXJ2aWNlIG9ibGlnYXRpb25zIChpbmNsdWRpbmcgc2VydmljZS1yZWxhdGVkIG1lZGljYWwgYXBwb2ludG1lbnRzKSwgb3Igb3RoZXIgdW5hdm9pZGFibGUgY2lyY3Vtc3RhbmNlcyBvciBVbml2ZXJzaXR5LXNwb25zb3JlZCBhY3Rpdml0aWVzLgpTdHVkZW50cyB3aXRoIFVJLWF1dGhvcml6ZWQgYWN0aXZpdGllcyBtdXN0IGRpc2N1c3MgdGhlaXIgYWJzZW5jZXMgd2l0aCB0aGUgaW5zdHJ1Y3RvciBhcyBzb29uIGFzIHBvc3NpYmxlLgpSZWxpZ2lvdXMgb2JsaWdhdGlvbnMgbXVzdCBiZSBjb21tdW5pY2F0ZWQgd2l0aGluIHRoZSBmaXJzdCB0aHJlZSB3ZWVrcyBvZiBjbGFzc2VzLgpTZWUgYmVsb3cgZm9yIHRoZSBkb2N1bWVudGF0aW9uIG5lY2Vzc2FyeSBmb3IgYW4gYWJzZW5jZSB0byBiZSBleGN1c2VkIGFuZCB0byBiZSBlbGlnaWJsZSB0byB0YWtlIGEgbWFrZS11cCBleGFtLgoKU3R1ZGVudHMgYXJlIGFsbG93ZWQgdG8gbWFrZSB1cCBleGFtcyB0aGF0IGhhdmUgYmVlbiBtaXNzZWQgZHVlIHRvIGlsbG5lc3MsIG1hbmRhdG9yeSByZWxpZ2lvdXMgb2JzZXJ2YXRpb25zLCBvZmZpY2lhbCBVbml2ZXJzaXR5IGFjdGl2aXRpZXMsIG9yIG90aGVyIHVuYXZvaWRhYmxlIGNpcmN1bXN0YW5jZXMuCk5vdGU6IHRoZSBmb3JtYXQgb2YgdGhlIG1ha2UtdXAgZXhhbSBtYXkgZGlmZmVyIGZyb20gdGhlIG9yaWdpbmFsIGV4YW0uCklmIHlvdSBrbm93IHRoYXQgeW91IG11c3QgYmUgYXdheSBhdCB0aGUgdGltZSBvZiBhbiBleGFtIGZvciBvbmUgb2YgdGhlc2UgcmVhc29ucywgUHJvZmVzc29yIFBldGVyc2VuIG11c3QgYmUgY29udGFjdGVkIGluIGFkdmFuY2Ugd2hlbmV2ZXIgcG9zc2libGUgdG8gc2NoZWR1bGUgYSBtYWtlLXVwIGV4YW0uCkluIG9yZGVyIHRvIHRha2UgYSBtYWtlLXVwIGV4YW0sIHlvdSBtdXN0IHByb3ZpZGUgYWNjZXB0YWJsZSBkb2N1bWVudGF0aW9uIHRvIGJlIGVsaWdpYmxlIHRvIHRha2UgaXQ6IGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcmVwb3J0IG9mIGlsbG5lc3M7IGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIG11c3QgYmUgZG9jdW1lbnRlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBJb3dhIFtBYnNlbmNlIEV4cGxhbmF0aW9uIEZvcm1dKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LWF0dGVuZGFuY2UtYW5kLWFic2VuY2VzKSBhbmQgbXVzdCBiZSBhcHByb3ZlZCBieSBQcm9mZXNzb3IgUGV0ZXJzZW4uCjx1PkluIHN1bSwgdG8gYmUgZWxpZ2libGUgZm9yIGEgbWFrZS11cCBleGFtLCBQcm9mZXNzb3IgUGV0ZXJzZW4gbXVzdCBiZSBjb250YWN0ZWQgYmVmb3JlIHRoZSBleGFtaW5hdGlvbiB3aGVuZXZlciBwb3NzaWJsZSwgYW5kIHlvdSBtdXN0IHNlbmQgYWNjZXB0YWJsZSBmb3JtIG9mIGRvY3VtZW50YXRpb24gdG8gUHJvZmVzc29yIFBldGVyc2VuPC91Pi4KCiMgR3JhZGluZyB7I2dyYWRpbmd9CgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIHNlbWVzdGVyIG9uIHRoZSBiYXNpcyBvZiB5b3VyIHRvdGFsIHBlcmNlbnRhZ2Ugb2YgcG9pbnRzIGVhcm5lZCBvbiBleGFtcywgcXVpenplcywgYXR0ZW5kYW5jZSwgYW5kIHdyaXRpbmcgYXNzaWdubWVudHMsIGFzIGRldGFpbGVkIGJlbG93LgpHcmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBvbiBhbiBhYnNvbHV0ZSBzY2FsZSAoY3JpdGVyaW9uLXJlZmVyZW5jZWQgZ3JhZGluZyk7IGNvdXJzZSBncmFkZXMgd2lsbCBub3QgYmUgY3VydmVkLgpQbGVhc2Ugbm90ZTogQXMgYSBtYXR0ZXIgb2YgZmFpcm5lc3MgdG8gYWxsIHN0dWRlbnRzLCBJIGFzc2lnbiBncmFkZXMgYmFzZWQgb24gcGVyZm9ybWFuY2UgYW5kIGRvIG5vdCBuZWdvdGlhdGUgZ3JhZGVzLgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJhbmdlczoKCnwgR3JhZGUgfCBQZXJjZW50IHwKfDotLS0tLS18Oi0tLS0tLS0tfAp8IEErICAgIHwgOTfigJMxMDAlIHwgCnwgQSAgICAgfCA5M+KAkzk2ICAgfAp8IEEtICAgIHwgOTDigJM5MiAgIHwKfCBCKyAgICB8IDg34oCTODkgICB8CnwgQiAgICAgfCA4M+KAkzg2ICAgfAp8IEItICAgIHwgODDigJM4MiAgIHwKfCBDKyAgICB8IDc14oCTNzkgICB8CnwgQyAgICAgfCA3MOKAkzc0ICAgfAp8IEMtICAgIHwgNjXigJM2OSAgIHwKfCBEKyAgICB8IDYw4oCTNjQgICB8CnwgRCAgICAgfCA1NeKAkzU5ICAgfAp8IEQtICAgIHwgNTDigJM1NCAgIHwKfCBGICAgICB8IDwgNTAlICAgfAoKSSByb3VuZCB1cCBmcm9tIC41IHdoZW4gZGV0ZXJtaW5pbmcgZmluYWwgZ3JhZGVzLgpGb3IgZXhhbXBsZSwgYSBjb3Vyc2UgcGVyY2VudCBvZiA3OS41MCB3b3VsZCByZWNlaXZlIGEgQi0sIHdoZXJlYXMgYSBjb3Vyc2UgcGVyY2VudCBvZiA3OS40OSB3b3VsZCByZWNlaXZlIGEgQysuCgojIENvdXJzZSBHcmFkZXMgeyNjb3Vyc2VHcmFkZXN9CgpGaW5hbCBjb3Vyc2UgZ3JhZGVzIHdpbGwgYmUgYXNzZXNzZWQgYmFzZWQgb24geW91ciBwZXJmb3JtYW5jZSBpbiB0aGUgYWN0aXZpdGllcyBiZWxvdy4KVGhlIHJlbGF0aXZlIGNvbnRyaWJ1dGlvbiBvZiBlYWNoIGNvbXBvbmVudCB0byB5b3VyIGZpbmFsIGdyYWRlIGlzIGFzIGZvbGxvd3M6CgogLSAyNSUJRXhhbWluYXRpb24gIzEKIC0gMjUlCUV4YW1pbmF0aW9uICMyIChhZG1pbmlzdGVyZWQgb25seSBkdXJpbmcgdGhlIGNsYXNzJ3MgRmluYWwgRXhhbSB0aW1lIHNsb3QpCiAtIDEwJSAJQXR0ZW5kYW5jZS9QYXJ0aWNpcGF0aW9uCiAtIDEwJSAJUmVhZGluZyBRdWl6emVzCiAtIDMwJSAgV3JpdGluZyBBc3NpZ25tZW50cwoKIyMgRXh0cmEgQ3JlZGl0IHsjZXh0cmFDcmVkaXR9CgpJIHdpbGwgZ2l2ZSB5b3UgMC41IHBvaW50IGV4dHJhIGNyZWRpdCBpZiB5b3UgMSkgaWRlbnRpZnkgYW4gaXNzdWUgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIG9yIDIpIG1ha2UgYSA8dT5zcGVjaWZpYzwvdT4gc3VnZ2VzdGlvbiBmb3IgYSB3YXkgdG8gaW1wcm92ZSB0aGUgW3RleHRib29rXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vaykgYW5kIGl0cyB1c2VmdWxuZXNzIHRvIHlvdSBvciBvdGhlciBzdHVkZW50cy4KRm9yIGluc3RhbmNlLCB0byBpZGVudGlmeSBhbiBpc3N1ZSB0aGF0IG5lZWRzIHRvIGJlIGFkZHJlc3NlZCwgeW91IGNvdWxkIGlkZW50aWZ5IGEgdHlwbywgbWlzc3BlbGxpbmcsIGdyYW1tYXRpY2FsIGlzc3VlLCBvciAoZ2FzcCksIGEgbWlzdGFrZS9lcnJvci4KVG8gcmVjZWl2ZSB0aGUgZXh0cmEgY3JlZGl0LCBbY3JlYXRlIGEgbmV3IGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vaXNhYWN0cGV0ZXJzZW4vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svaXNzdWVzKSBpbiB0aGUgW3RleHRib29rJ3MgR2l0SHViIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3RwZXRlcnNlbi9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vayksIGFuZCBlbWFpbCBtZSBhZnRlciBkb2luZyBzby4KSSB3aWxsIGdpdmUgeW91IGFuIGFkZGl0aW9uYWwgMC41IHBvaW50IGV4dHJhIGNyZWRpdCAoZm9yIDEtcG9pbnQgZXh0cmEgaW4gdG90YWwpIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGZpeGVzL3N1Z2dlc3Rpb25zIHlvdSBzcGVjaWZ5LgpUbyByZWNlaXZlIHRoZSBleHRyYSBjcmVkaXQgZm9yIGltcGxlbWVudGluZyB0aGUgZml4L3N1Z2dlc3Rpb24sIFtjcmVhdGUgYSBwdWxsIHJlcXVlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3RwZXRlcnNlbi9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9wdWxscykgd2l0aCB5b3VyIGNoYW5nZXMsIGFuZCBlbWFpbCBtZSBhZnRlciBkb2luZyBzby4KRm9yIGluc3RydWN0aW9ucyByZWdhcmRpbmcgaG93IHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCwgc2VlIFtoZXJlXShodHRwczovL2RldnBzeWxhYi5naXRodWIuaW8vRGF0YUFuYWx5c2lzL2dpdC5odG1sI3B1bGwtcmVxdWVzdCkuCklmIHlvdSBhcmUgZ29pbmcgdG8gaW1wbGVtZW50IGEgY2hhbmdlLCBJIHN0cm9uZ2x5IGVuY291cmFnZSB5b3UgdG8gZGlzY3VzcyB3aXRoIG1lIGJlZm9yZSBkb2luZyBzbywgc28gSSBjYW4gdmVyaWZ5IHRoYXQgdGhlIGNoYW5nZSBpcyB3b3J0aCBpbXBsZW1lbnRpbmcuCkkgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlICJmaXgiLCBzdWdnZXN0aW9uLCBvciBpbXBsZW1lbnRhdGlvbiB3YXJyYW50cyBleHRyYSBjcmVkaXQhClRoZSBleHRyYSBjcmVkaXQgbXVzdCBiZSBjb21wbGV0ZWQgYnkgdGhlIGxhc3QgZGF5IG9mIGNsYXNzLgoKSW4gYWRkaXRpb24sIHRoZSB3aW5uZXIocykgb2YgdGhlIGNsYXNzIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlIHdpbGwgZ2V0IDEgcG9pbnQgZXh0cmEgY3JlZGl0LgpObyBhZGRpdGlvbmFsIGV4dHJhLWNyZWRpdCBvcHBvcnR1bml0aWVzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY291cnNlLgoKIyBUZW50YXRpdmUgQ291cnNlIE91dGxpbmUgKGV4YW0gZGF0ZXMgZml4ZWQpIHsjb3V0bGluZX0KClRoaXMgaXMgYSAqdGVudGF0aXZlKiBjb3Vyc2Ugb3V0bGluZS4KQ2hhbmdlcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiBjbGFzcy4KVGhlcmUgYXJlIDE1IHdlZWtzIGluIHRoZSBzZW1lc3RlciwgYW5kIGNsYXNzIG1lZXRzIHR3aWNlIHBlciB3ZWVrICgzMCBzZWN0aW9ucykuCldlIHdpbGwgaGF2ZSBvbmUgZXhhbSBkdXJpbmcgdGhlIHNlbWVzdGVyIGFuZCBvbmUgZmluYWwgZXhhbSBkdXJpbmcgZmluYWxzIHdlZWsuCgp8ICoqU2VjdGlvbioqICAgICAgfCAqKkRheSoqIHwgKipEYXRlKiogfCAqKkNvbnRlbnQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVhZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBc3NpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfDotLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS18Oi0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgWzFdKCNzZWN0aW9uMSkgICB8IFQgICAgICAgfCAwOC8yNiAgICB8IE92ZXJ2aWV3IG9mIENsYXNzOyBPdmVydmlldyBvZiBGYW50YXN5IEZvb3RiYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAx4oCTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzJdKCNzZWN0aW9uMikgICB8IFRoICAgICAgfCAwOC8yOCAgICB8IFN0YXRpc3RpY2FsIFByb2dyYW1taW5nOiBVc2luZyBgUmAgZm9yIFN0YXRpc3RpY2FsIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgfCBDaCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFszXSgjc2VjdGlvbjMpICAgfCBUICAgICAgIHwgMDkvMDIgICAgfCBQbGF5ZXIgRXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggNjsgRGVuIEhhcnRpZ2ggZXQgYWwuICgyMDE4KSAgICAgfCAqKlNldCB1cCBibG9nOyBwb3N0IHdlbGNvbWUgYXJ0aWNsZSoqIHwKfCBbNF0oI3NlY3Rpb240KSAgIHwgVGggICAgICB8IDA5LzA0ICAgIHwgVGhlIERyYWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDc7IExlZSAmIExpdSAoMjAyMikgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzVdKCNzZWN0aW9uNSkgICB8IFQgICAgICAgfCAwOS8wOSAgICB8IFN0YXRpc3RpY2FsIFByb2dyYW1taW5nIGluIGBSYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFs2XSgjc2VjdGlvbjYpICAgfCBUaCAgICAgIHwgMDkvMTEgICAgfCBCYXNpYyBTdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggOOKAkzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqQmxvZyBhcnRpY2xlIDEgZHVlISoqICAgICAgICAgICAgICAgfAp8IFs3XSgjc2VjdGlvbjcpICAgfCBUICAgICAgIHwgMDkvMTYgICAgfCBEYXRhIFZpc3VhbGl6YXRpb24gYW5kIEludGVycHJldGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggNTsgU2Nod2FiaXNoICgyMDIxKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbOF0oI3NlY3Rpb244KSAgIHwgVGggICAgICB8IDA5LzE4ICAgIHwgQ29ycmVsYXRpb24gQW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDEwOyBHb29kd2luICYgTGVlY2ggKDIwMDYpICAgICAgIHwgKipCbG9nIGFydGljbGUgMiBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzldKCNzZWN0aW9uOSkgICB8IFQgICAgICAgfCAwOS8yMyAgICB8IE11bHRpcGxlIFJlZ3Jlc3Npb24gYW5kIE1peGVkIE1vZGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAxMeKAkzEyOyBPc2Jvcm5lICYgV2F0ZXJzICgyMDAyKSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzEwXSgjc2VjdGlvbjEwKSB8IFRoICAgICAgfCAwOS8yNSAgICB8IE1peGVkIE1vZGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAxMzsgQnJhdWVyICYgS3VydGluICgyMDE4KSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxMV0oI3NlY3Rpb24xMSkgfCBUICAgICAgIHwgMDkvMzAgICAgfCBDYXVzYWwgSW5mZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMTM7IEQnT25vZnJpbyBldCBhbC4gKDIwMjApICAgICAgfCAqKkJsb2cgYXJ0aWNsZSAzIGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbMTJdKCNzZWN0aW9uMTIpIHwgVGggICAgICB8IDEwLzAyICAgIHwgSGV1cmlzdGljcyBhbmQgQ29nbml0aXZlIEJpYXNlcyBpbiBQcmVkaWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDE0OyBUdmVyc2t5ICYgS2FobmVtYW4gKDE5NzQpICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzEzXSgjc2VjdGlvbjEzKSB8IFQgICAgICAgfCAxMC8wNyAgICB8IEh1bWFuIEp1ZGdtZW50IHZzIEFjdHVhcmlhbCBBcHByb2FjaGVzIHRvIFByZWRpY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAxNTsgR3JvdmUgZXQgYWwuICgyMDAwKSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxNF0oI3NlY3Rpb24xNCkgfCBUaCAgICAgIHwgMTAvMDkgICAgfCBCYXNlIFJhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkJsb2cgYXJ0aWNsZSA0IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbMTVdKCNzZWN0aW9uMTUpIHwgVCAgICAgICB8IDEwLzE0ICAgIHwgKipNaWR0ZXJtIEV4YW0qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE2XSgjc2VjdGlvbjE2KSB8IFRoICAgICAgfCAxMC8xNiAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQmluYXJ5IENsYXNzaWZpY2F0aW9uICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiAxNy4x4oCTMTcuMTYuNSkgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE3XSgjc2VjdGlvbjE3KSB8IFQgICAgICAgfCAxMC8yMSAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQmluYXJ5IENsYXNzaWZpY2F0aW9uICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiAxNy42LjbigJMxNy42LjgpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE4XSgjc2VjdGlvbjE4KSB8IFRoICAgICAgfCAxMC8yMyAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQ29udGludW91cyBPdXRjb21lcyAgICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiAxNy434oCTZW5kIG9mIGNoYXB0ZXIpIHwgKipCbG9nIGFydGljbGUgNSBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzE5XSgjc2VjdGlvbjE5KSB8IFQgICAgICAgfCAxMC8yOCAgICB8IENhbGlicmF0aW9uIEFjY3VyYWN5OiBPdmVyY29uZmlkZW5jZSBCaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLYWhuZW1hbiAmIFR2ZXJza3kgKDE5OTYpOyBNYXNzZXkgJiBUaGFsZXIgKDIwMTMpIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyMF0oI3NlY3Rpb24yMCkgfCBUaCAgICAgIHwgMTAvMzAgICAgfCBNYWNoaW5lIExlYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkJsb2cgYXJ0aWNsZSA2IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbMjFdKCNzZWN0aW9uMjEpIHwgVCAgICAgICB8IDExLzA0ICAgIHwgTXl0aGJ1c3RlcnM6IFB1dHRpbmcgRmFudGFzeSBGb290YmFsbCBCZWxpZWZzL0FuZWNkb3RlcyB0byB0aGUgVGVzdCAgICAgICAgICB8IENoIDE4OyBXaGl0ZSAmIFNoZWxkb24gKDIwMTQpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzIyXSgjc2VjdGlvbjIyKSB8IFRoICAgICAgfCAxMS8wNiAgICB8IE1vZGVybiBQb3J0Zm9saW8gVGhlb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqQmxvZyBhcnRpY2xlIDcgZHVlISoqICAgICAgICAgICAgICAgfAp8IFsyM10oI3NlY3Rpb24yMykgfCBUICAgICAgIHwgMTEvMTEgICAgfCBDbHVzdGVyIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjRdKCNzZWN0aW9uMjQpIHwgVGggICAgICB8IDExLzEzICAgIHwgRmFjdG9yIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipCbG9nIGFydGljbGUgOCBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzI1XSgjc2VjdGlvbjI1KSB8IFQgICAgICAgfCAxMS8xOCAgICB8IERhdGEgUmVkdWN0aW9uOiBQcmluY2lwYWwgQ29tcG9uZW50IEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyNl0oI3NlY3Rpb24yNikgfCBUaCAgICAgIHwgMTEvMjAgICAgfCBTaW11bGF0aW9uIGFuZCB0aGUgTW9udGUgQ2FybG8gTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkJsb2cgYXJ0aWNsZSA5IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8IDExLzI04oCTMTEvMjcgfCAqKkZBTEwgQlJFQUsg4oCTIE5PIENMQVNTRVMqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyN10oI3NlY3Rpb24yNykgfCBUICAgICAgIHwgMTIvMDIgICAgfCBUaW1lIFNlcmllcyBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjhdKCNzZWN0aW9uMjgpIHwgVGggICAgICB8IDEyLzA0ICAgIHwgRGVjaXNpb24gTWFraW5nIGluIHRoZSBDb250ZXh0IG9mIFVuY2VydGFpbnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIDI2OyBMYXJyaWNrIGV0IGFsLiAoMjAyNCkgICAgICAgIHwgKipCbG9nIGFydGljbGUgMTAgZHVlISoqICAgICAgICAgICAgICB8CnwgWzI5XSgjc2VjdGlvbjI5KSB8IFQgICAgICAgfCAxMi8wOSAgICB8IFNwb3J0cyBhbmQgQ29nbml0aXZlIFBzeWNob2xvZ3k6IENvYWNoaW5nIGFuZCBSaXNrIEF2ZXJzaW9uICAgICAgICAgICAgICAgICAgfCBDaCAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFszMF0oI3NlY3Rpb24zMCkgfCBUaCAgICAgIHwgMTIvMTEgICAgfCBTcG9ydHMgYW5kIENvZ25pdGl2ZSBQc3ljaG9sb2d5OiBQc3ljaG9sb2dpY2FsIEZhY3RvcnMgaW4gUGxheWVyIFBlcmZvcm1hbmNlOyBFeHBlcnQgUGVyZm9ybWFuY2UgYW5kIEF1dG9tYXRpY2l0eSB8IENoIDI3IHwgKipCbG9nIGFydGljbGUgMTEgZHVlISoqICAgICAgIHwKfCBGaW5hbHMgV2VlayAgICAgIHwgICAgICAgICB8IFRCRCAod2VlayBvZiAxMi8xNSkgfCAqKkZpbmFsIEV4YW0qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIERhdGUgYW5kIFRpbWUgb2YgdGhlIEZpbmFsIEV4YW0geyNmaW5hbEV4YW19CgpUaGUgW2ZpbmFsIGV4YW1pbmF0aW9uIGRhdGUgYW5kIHRpbWVdKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9maW5hbC1leGFtLXNjaGVkdWxlcykgd2lsbCBiZSBhbm5vdW5jZWQgYnkgdGhlIFJlZ2lzdHJhciBnZW5lcmFsbHkgYnkgdGhlIGZpZnRoIHdlZWsgb2YgY2xhc3NlcywgYW5kIGl0IHdpbGwgYmUgYW5ub3VuY2VkIG9uIHRoZSBjb3Vyc2UgSUNPTiBzaXRlIG9uY2UgaXQgaXMga25vd24uCjx1PkRvIG5vdCBwbGFuIHlvdXIgZW5kIG9mIHRoZSBzZW1lc3RlciB0cmF2ZWwgcGxhbnMgdW50aWwgdGhlIGZpbmFsIGV4YW0gc2NoZWR1bGUgaXMgbWFkZSBwdWJsaWMuCkl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8ga25vdyB0aGUgZGF0ZSwgdGltZSwgYW5kIHBsYWNlIG9mIHRoZSBmaW5hbCBleGFtLjwvdT4KQWNjb3JkaW5nIHRvIFJlZ2lzdHJhcidzIGZpbmFsIGV4YW0gcG9saWN5LCBzdHVkZW50cyA8dT5oYXZlIGEgbWF4aW11bSBvZiB0d28gd2Vla3MgYWZ0ZXIgdGhlIGFubm91bmNlZCBmaW5hbCBleGFtIHNjaGVkdWxlPC91PiB0byByZXF1ZXN0IGEgY2hhbmdlIGlmIGFuIGV4YW0gY29uZmxpY3QgZXhpc3RzIG9yIGlmIGEgc3R1ZGVudCBoYXMgbW9yZSB0aGFuIHR3byBleGFtcyBpbiBvbmUgZGF5IChzZWUgdGhlIFtwb2xpY3ldKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9tYWtldXAtZmluYWwtZXhhbWluYXRpb24tcG9saWNpZXMpIGhlcmUpLgoKIyBDb3Vyc2UgUmVzb3VyY2VzIHsjY291cnNlUmVzb3VyY2VzfQoKVGhlcmUgYXJlIG1hbnkgY291cnNlIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugc3VjY2VlZCBpbiB0aGUgY2xhc3MsIGluY2x1ZGluZzoKCi0gUG93ZXJwb2ludCBzbGlkZXMgZm9yIGxlY3R1cmUKLSBnZXR0aW5nIGFuZCByZXZpZXdpbmcgbWlzc2VkIG5vdGVzIGZyb20gYSBwZWVyCi0gW2xlY3R1cmUgcmVjb3JkaW5nc10oI3JlY29yZGluZ3MpCi0gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSBhbmQgYXNzaWduZWQgcmVhZGluZ3MKLSByZXZpZXcgeW91ciByZWFkaW5nIHF1aXp6ZXMgYW5kIHRoZSBhbnN3ZXJzCi0gaW5zdHJ1Y3RvciBvZmZpY2UgaG91cnMKLSBwZWVyIHN0dWR5IGdyb3VwcwotIFR1dG9yIElvd2E6IGh0dHBzOi8vdHV0b3IudWlvd2EuZWR1CgojIERyb3AgRGVhZGxpbmUgZm9yIHRoaXMgQ291cnNlIHsjZHJvcERlYWRsaW5lfQoKWW91IG1heSBkcm9wIGFuIGluZGl2aWR1YWwgY291cnNlIGJlZm9yZSB0aGUgZHJvcCBkZWFkbGluZTsgYWZ0ZXIgdGhpcyBkZWFkbGluZSB5b3Ugd2lsbCBuZWVkIGNvbGxlZ2lhdGUgYXBwcm92YWwuCllvdSBjYW4gbG9vayB1cCB0aGUgZHJvcCBkZWFkbGluZSBmb3IgdGhpcyBjb3Vyc2UgW2hlcmVdKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9jb3Vyc2UtZGVhZGxpbmVzKS4KV2hlbiB5b3UgZHJvcCBhIGNvdXJzZSwgYSAiVyIgd2lsbCBhcHBlYXIgb24geW91ciB0cmFuc2NyaXB0LgpUaGUgbWFyayBvZiAiVyIgaXMgYSBuZXV0cmFsIG1hcmsgdGhhdCBkb2VzIG5vdCBhZmZlY3QgeW91ciBHUEEuClRvIGRpc2N1c3MgaG93IGRyb3BwaW5nIChvciBzdGF5aW5nIGluKSBhIGNvdXJzZSBtaWdodCBhZmZlY3QgeW91ciBhY2FkZW1pYyBnb2FscywgcGxlYXNlIGNvbnRhY3QgeW91ciBBY2FkZW1pYyBBZHZpc29yLgpEaXJlY3Rpb25zIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgYSBjb3Vyc2UgYW5kIG90aGVyIHJlZ2lzdHJhdGlvbiBjaGFuZ2VzIGNhbiBiZSBmb3VuZCBvbiB0aGUgW1JlZ2lzdHJhcidzIHdlYnNpdGVdKGh0dHBzOi8vcmVnaXN0cmFyLnVpb3dhLmVkdS9jaGFuZ2UtcmVnaXN0cmF0aW9uLW15dWkpLgpTdHVkZW50cyBjYW4gZmluZCBwb2xpY2llcyBvbiBkcm9wcGluZyBDTEFTIGNvdXJzZXMgW2hlcmVdKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvc3R1ZGVudHMvc3R1ZGVudHMtYWNhZGVtaWMtcG9saWNpZXMvcmVnaXN0cmF0aW9uLXBvbGljaWVzI2Ryb3BwaW5nKS4KU3R1ZGVudHMgc2hvdWxkIGFkaGVyZSB0byB0aGUgW2FjYWRlbWljIGRlYWRsaW5lc10oaHR0cHM6Ly9ncmFkLnVpb3dhLmVkdS9hY2FkZW1pY3MvZGVhZGxpbmVzKSBhbmQgcG9saWNpZXMgc2V0IGJ5IHRoZSBHcmFkdWF0ZSBDb2xsZWdlLgoKIyBGZWVkYmFjayBhYm91dCB0aGUgQ291cnNlIHsjZmVlZGJhY2t9CgpJIHdlbGNvbWUgZmVlZGJhY2sgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgY2xhc3MuCklmIHlvdSBoYXZlIGNvbW1lbnRzIG9uIHRoZSBjbGFzcyBvciBteSB0ZWFjaGluZywgcGxlYXNlIGZlZWwgZnJlZSB0byBtZWV0IHdpdGggbWUgZHVyaW5nIG9mZmljZSBob3Vycy4KCiMjIFN0dWRlbnQgQ29tcGxhaW50cyB7I2NvbXBsYWludHN9CgpTdHVkZW50cyB3aXRoIGEgY29tcGxhaW50IGFib3V0IGEgZ3JhZGUgb3IgYSByZWxhdGVkIG1hdHRlciBzaG91bGQgZmlyc3QgZGlzY3VzcyB0aGUgc2l0dWF0aW9uIHdpdGggdGhlIGluc3RydWN0b3IsIGZpbmFsbHkgd2l0aCB0aGUgREVPIChDaGFpcikgb2YgdGhlIGRlcGFydG1lbnQsIHNjaG9vbCBvciBwcm9ncmFtIG9mZmVyaW5nIHRoZSBjb3Vyc2UuClNvbWV0aW1lcyBzdHVkZW50cyB3aWxsIGJlIHJlZmVycmVkIHRvIHRoZSBkZXBhcnRtZW50IG9yIHByb2dyYW0ncyBEaXJlY3RvciBvZiBVbmRlcmdyYWR1YXRlIFN0dWRpZXMgKERVUykgb3IgRGlyZWN0b3Igb2YgR3JhZHVhdGUgU3R1ZGllcyAoREdTKS4KU3R1ZGVudHMgc2hvdWxkIGNvbnRhY3QgW0NMQVMgVW5kZXJncmFkdWF0ZSBQcm9ncmFtc10oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zdHVkZW50cy9oYW5kYm9vay9zdHVkZW50LXJpZ2h0cy1yZXNwb25zaWJpbGl0aWVzI3JpZ2h0cykgZm9yIHN1cHBvcnQgd2hlbiB0aGUgbWF0dGVyIGlzIG5vdCByZXNvbHZlZCBhdCB0aGUgcHJldmlvdXMgbGV2ZWwuCgojIENvbW11bmljYXRpb246IFVJIEVtYWlsIHsjZW1haWx9CgpTdHVkZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGFsbCBvZmZpY2lhbCBjb3JyZXNwb25kZW5jZXMgc2VudCB0byB0aGVpciBVSSBlbWFpbCBhZGRyZXNzICh1aW93YS5lZHUpIGFuZCBtdXN0IHVzZSB0aGlzIGFkZHJlc3MgZm9yIGFueSBjb21tdW5pY2F0aW9uIHdpdGggaW5zdHJ1Y3RvcnMgb3Igc3RhZmYgaW4gdGhlIFVJIGNvbW11bml0eS4KRm9yIHRoZSBwcml2YWN5IGFuZCB0aGUgcHJvdGVjdGlvbiBvZiBzdHVkZW50IHJlY29yZHMsIFVJIGZhY3VsdHkgYW5kIHN0YWZmIGNhbiBvbmx5IGNvcnJlc3BvbmQgd2l0aCBVSSBlbWFpbCBhZGRyZXNzZXMuCgojIyBPdGhlciBFeHBlY3RhdGlvbnMgb2YgU3R1ZGVudCBQZXJmb3JtYW5jZSB7I290aGVyRXhwZWN0YXRpb25zfQoKU3R1ZGVudHMgaGF2ZSB0aGUgcmlnaHQgdG8gYSBkaXN0cmFjdGlvbi1mcmVlIGxlYXJuaW5nIGVudmlyb25tZW50LgpZb3UgaGF2ZSB0aGUgcmVzcG9uc2liaWxpdHkgdG8gaGVscCBjcmVhdGUgc3VjaCBhIGNsYXNzcm9vbSBlbnZpcm9ubWVudC4KUGxlYXNlIHRyZWF0IG90aGVyIHN0dWRlbnRzIGluIHRoZSBjbGFzcyBhbmQgdGhlIGluc3RydWN0b3Igd2l0aCByZXNwZWN0LgpTdHVkZW50cyBhcmUgZXhwZWN0ZWQgdG8gaGVscCBlYWNoIG90aGVyIGxlYXJuIGFuZCB0byBjb250cmlidXRlIG92ZXJhbGwgdG8gdGhlIGxlYXJuaW5nIGVudmlyb25tZW50IG9mIHRoZSBjb3Vyc2UuCkFycml2aW5nIHByZXBhcmVkIGZvciBjbGFzcyBpcyBwYXJ0IG9mIHRoaXMgZXhwZWN0YXRpb24uCgojIFVuaXZlcnNpdHkgUG9saWNpZXMgeyNVSW93YVBvbGljaWVzfQoKW1VuaXZlcnNpdHkgUG9saWNpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCgpbQWNjb21tb2RhdGlvbnMgZm9yIFN0dWRlbnRzIHdpdGggRGlzYWJpbGl0aWVzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNhY2NvbW1vZGF0aW9ucy1mb3Itc3R1ZGVudHMtd2l0aC1kaXNhYmlsaXRpZXMpXApUaGUgVW5pdmVyc2l0eSBpcyBjb21taXR0ZWQgdG8gcHJvdmlkaW5nIGFuIGVkdWNhdGlvbmFsIGV4cGVyaWVuY2UgdGhhdCBpcyBhY2Nlc3NpYmxlIHRvIGFsbCBzdHVkZW50cy4KSWYgYSBzdHVkZW50IGhhcyBhIGRpYWdub3NlZCBkaXNhYmlsaXR5IG9yIG90aGVyIGRpc2FibGluZyBjb25kaXRpb24gdGhhdCBtYXkgaW1wYWN0IHRoZSBzdHVkZW50J3MgYWJpbGl0eSB0byBjb21wbGV0ZSB0aGUgY291cnNlIHJlcXVpcmVtZW50cyBhcyBzdGF0ZWQgaW4gdGhlIHN5bGxhYnVzLCB0aGUgc3R1ZGVudCBtYXkgc2VlayBhY2NvbW1vZGF0aW9ucyB0aHJvdWdoIFtTdHVkZW50IERpc2FiaWxpdHkgU2VydmljZXNdKGh0dHBzOi8vc2RzLnN0dWRlbnRsaWZlLnVpb3dhLmVkdS9zdHVkZW50cykgKFNEUykuClNEUyBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIExldHRlcnMgb2YgQWNjb21tb2RhdGlvbiAoTE9BKSBhdmFpbGFibGUgdG8gdGhlIHN0dWRlbnQuCjx1PlRoZSBzdHVkZW50IG11c3QgcHJvdmlkZSBhbiBMT0EgdG8gdGhlIGluc3RydWN0b3IgYXMgZWFybHkgaW4gdGhlIHNlbWVzdGVyIGFzIHBvc3NpYmxlLCBidXQgcmVxdWVzdHMgbm90IG1hZGUgYXQgbGVhc3QgdHdvIHdlZWtzIHByaW9yIHRvIHRoZSBzY2hlZHVsZWQgYWN0aXZpdHkgZm9yIHdoaWNoIGFuIGFjY29tbW9kYXRpb24gaXMgc291Z2h0IG1heSBub3QgYmUgYWNjb21tb2RhdGVkLjwvdT4KVGhlIExPQSB3aWxsIHNwZWNpZnkgd2hhdCByZWFzb25hYmxlIGNvdXJzZSBhY2NvbW1vZGF0aW9ucyB0aGUgc3R1ZGVudCBpcyBlbGlnaWJsZSBmb3IgYW5kIHRob3NlIHRoZSBpbnN0cnVjdG9yIHNob3VsZCBwcm92aWRlLgoKLSBbRnJlZSBTcGVlY2ggYW5kIEV4cHJlc3Npb25dKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvdGVhY2hpbmctcmVzb3VyY2VzL2NvdXJzZS1zeWxsYWJpLWluZm9ybWF0aW9uI2ZyZWUtc3BlZWNoLWFuZC1leHByZXNzaW9uKQotIFtOb24tRGlzY3JpbWluYXRpb25dKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvdGVhY2hpbmctcmVzb3VyY2VzL2NvdXJzZS1zeWxsYWJpLWluZm9ybWF0aW9uI25vbi1kaXNjcmltaW5hdGlvbi1zdGF0ZW1lbnQpCi0gW0FjY29tbW9kYXRpb25zIGZvciBTdHVkZW50cyB3aXRoIERpc2FiaWxpdGllc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jYWNjb21tb2RhdGlvbnMtZm9yLXN0dWRlbnRzLXdpdGgtZGlzYWJpbGl0aWVzKQotIFtBYnNlbmNlcyBmcm9tIENsYXNzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNhYnNlbmNlcy1mcm9tLWNsYXNzKQotIFtBYnNlbmNlcyBmb3IgUmVsaWdpb3VzIEhvbHkgRGF5c10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jYWJzZW5jZXMtZm9yLXJlbGlnaW91cy1ob2x5LWRheXMpCi0gW0Fic2VuY2VzIGZvciBNaWxpdGFyeSBTZXJ2aWNlIE9ibGlnYXRpb25zXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNhYnNlbmNlcy1mb3ItbWlsaXRhcnktc2VydmljZS1vYmxpZ2F0aW9ucykKLSBbQ2xhc3Nyb29tIEV4cGVjdGF0aW9uc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jY2xhc3Nyb29tLWV4cGVjdGF0aW9ucykKLSBbU2V4dWFsIEhhcmFzc21lbnQvTWlzY29uZHVjdCBhbmQgU3VwcG9ydGl2ZSBNZWFzdXJlc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS90ZWFjaGluZy1yZXNvdXJjZXMvY291cnNlLXN5bGxhYmktaW5mb3JtYXRpb24jc2V4dWFsLWhhcmFzc21lbnQtLXNleHVhbC1taXNjb25kdWN0LWFuZC1zdXBwb3J0aXZlLW1lYXN1cmVzKQotIFtDb25mbGljdCBSZXNvbHV0aW9uXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNjb25mbGljdC1yZXNvbHV0aW9uKQotIFtNZW50YWwgSGVhbHRoXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNtZW50YWwtaGVhbHRoKQotIFtCYXNpYyBOZWVkcyBhbmQgU3R1ZGVudCBTdXBwb3J0XShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3RlYWNoaW5nLXJlc291cmNlcy9jb3Vyc2Utc3lsbGFiaS1pbmZvcm1hdGlvbiNiYXNpYy1uZWVkcy1hbmQtc3R1ZGVudC1zdXBwb3J0KQotIFtTaGFyaW5nIG9mIENsYXNzIFJlY29yZGluZ3NdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvdGVhY2hpbmctcmVzb3VyY2VzL2NvdXJzZS1zeWxsYWJpLWluZm9ybWF0aW9uI3NoYXJpbmctb2YtY2xhc3MtcmVjb3JkaW5ncy1pZi1hcHByb3ByaWF0ZSkKCiMgV2hlcmUgdG8gR2V0IEFjYWRlbWljIFN1cHBvcnQgZm9yIFRoaXMgQ291cnNlIHsjYWNhZGVtaWMtc3VwcG9ydH0KCi0gRHJvcC1pbiBzdHVkeSBncm91cHMgYW5kIG9uZS1vbi1vbmUgdHV0b3Jpbmc6IGRyb3AtaW4gc3R1ZGVudCBob3VycyBvZiB0aGUgPHU+dW5kZXJncmFkdWF0ZSBUQSwgZ3JhZHVhdGUgVEEsIGFuZDwvdT4gaW5zdHJ1Y3RvcgotIEZvcm1hbCB0dXRvcmluZzogVHV0b3IgSW93YTogaHR0cHM6Ly90dXRvci51aW93YS5lZHUKLSBVSSBXcml0aW5nIENlbnRlcjogaHR0cHM6Ly93cml0aW5nY2VudGVyLnVpb3dhLmVkdQotIEFjYWRlbWljIGFjY29tbW9kYXRpb25zOiBodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUKCiMgTWVudGFsIEhlYWx0aCBSZXNvdXJjZXMgYW5kIFN0dWRlbnQgU3VwcG9ydCB7I21lbnRhbC1oZWFsdGh9CgpTdHVkZW50cyBhcmUgZW5jb3VyYWdlZCB0byBiZSBtaW5kZnVsIG9mIHRoZWlyIG1lbnRhbCBoZWFsdGggYW5kIHNlZWsgaGVscCBhcyBhIHByZXZlbnRpdmUgbWVhc3VyZSBvciBpZiBmZWVsaW5nIG92ZXJ3aGVsbWVkIGFuZC9vciBzdHJ1Z2dsaW5nIHRvIG1lZXQgY291cnNlIGV4cGVjdGF0aW9ucy4KU3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gdGFsayB0byB0aGVpciBpbnN0cnVjdG9yIGZvciBhc3Npc3RhbmNlIHdpdGggY291cnNlLXJlbGF0ZWQgY29uY2VybnMuCkZvciBhZGRpdGlvbmFsIG1lbnRhbCBoZWFsdGggc3VwcG9ydCwgcGxlYXNlIHNlZSB0aGUgZ3VpZGFuY2UgYW5kIHJlc291cmNlcyBhdCBbbWVudGFsaGVhbHRoLnVpb3dhLmVkdV0oaHR0cDovL21lbnRhbGhlYWx0aC51aW93YS5lZHUpLCBpbmNsdWRpbmcgdGhlIDI0LTcgW1VJIFN1cHBvcnQgYW5kIENyaXNpcyBMaW5lXShodHRwczovL21lbnRhbGhlYWx0aC51aW93YS5lZHUvdWktc3VwcG9ydC1hbmQtY3Jpc2lzLWxpbmUpLiAgCgpBZGRpdGlvbmFsbHksIHRoZSBPZmZpY2Ugb2YgdGhlIERlYW4gb2YgU3R1ZGVudHMgY2FuIGhlbHAgc3R1ZGVudHMgbmF2aWdhdGUgcGVyc29uYWwgY3Jpc2lzIHNpdHVhdGlvbnMuClRoZXkgY2FuIHByb3ZpZGUgb25lLW9uLW9uZSBzdXBwb3J0LCBoZWxwIHdpdGggaWRlbnRpZnlpbmcgb3B0aW9ucywgYW5kIGFjY2VzcyB0byBbYmFzaWMgbmVlZHMgcmVzb3VyY2VzIChzdWNoIGFzIGZvb2QsIHJlbnQsIGNoaWxkY2FyZSwgZXRjLildKGh0dHA6Ly9iYXNpY25lZWRzLnVpb3dhLmVkdSkuClN0dWRlbnQgQ2FyZSBhbmQgQXNzaXN0YW5jZTogMTMyIElNVSwgW2Rvcy1hc3Npc3RhbmNlQHVpb3dhLmVkdV0obWFpbHRvOmRvcy1hc3Npc3RhbmNlQHVpb3dhLmVkdSksIG9yIDMxOS0zMzUtMTE2MiBhbmQgbW9yZSBpbmZvOiBbZG9zLnVpb3dhLmVkdS9hc3Npc3RhbmNlXShodHRwczovL2Rvcy51aW93YS5lZHUvYXNzaXN0YW5jZSkKCklmIHlvdSBmZWVsIHRoYXQgeW91IG9yIHNvbWVvbmUgeW91IGtub3cgbWF5IGJlIHN0cnVnZ2xpbmcgd2l0aCBhbiBhY2FkZW1pYywgZW1vdGlvbmFsLCBvciBwc3ljaG9sb2dpY2FsIHByb2JsZW0sIHRoZSBmb2xsb3dpbmcgb3JnYW5pemF0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhc3Npc3RhbmNlOgoKfCBTZXJ2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbnRhY3QgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgVW5pdmVyc2l0eSBvZiBJb3dhIEFjYWRlbWljIEFkdmlzaW5nIENlbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNTMtNTcwMCwgaHR0cHM6Ly9hZHZpc2luZ2NlbnRlci51aW93YS5lZHUgICAgICAgICAgICAgICAgICAgICAgIHwKfCBVbml2ZXJzaXR5IENvdW5zZWxpbmcgU2VydmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMzNS03Mjk0LCBodHRwczovL3d3dy51aW93YS5lZHUvdWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFN0dWRlbnQgSGVhbHRoIFNlcnZpY2UgLSBNZW50YWwgSGVhbHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTgzOTQsIGh0dHBzOi8vc3R1ZGVudGhlYWx0aC51aW93YS5lZHUvc2VydmljZXMvcHN5Y2hpYXRyeSAgICB8CnwgVW5pdmVyc2l0eSBvZiBJb3dhIEhvc3BpdGFscyBhbmQgQ2xpbmljcyBBZHVsdCBQc3ljaGlhdHJ5IFNlcnZpY2VzIENsaW5pYyAgfCAzNTMtNjMxNCwgaHR0cHM6Ly93d3cudWloZWFsdGhjYXJlLm9yZy9Qc3ljaGlhdHJ5ICAgICAgICAgICAgICAgIHwKfCBTZWFzaG9yZSBDbGluaWMgKGluIHRoZSBVSSBEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzKSB8IDMzNS0yNDY3LCBodHRwczovL3BzeWNob2xvZ3kudWlvd2EuZWR1L3Jlc291cmNlcy9zZWFzaG9yZS1jbGluaWMgfAp8IFdvbWVuJ3MgUmVzb3VyY2UgYW5kIEFjdGlvbiBDZW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTE0ODYsIGh0dHBzOi8vd3JhYy51aW93YS5lZHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgUmFwZSBWaWN0aW0gQWR2b2NhY3kgUHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMTktMzM1LTYwMDAgb3IgODAwLTIyOC0xNjI1LCBodHRwczovL3d3dy51aW93YS5lZHUvfnJ2YXAgICAgICAgIHwKfCBPZmZpY2Ugb2YgU2V4dWFsIE1pc2NvbmR1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMxOS0zMzUtNjIwMCwgaHR0cHM6Ly9vc21yYy51aW93YS5lZHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IENvbW1Vbml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgODU1LTMyNS00Mjk2LCBodHRwczovL2J1aWx0Ynljb21tdW5pdHkub3JnL2NyaXNpcyAgICAgICAgICAgICAgICB8CnwgQ29tbXVuaXR5ICYgRmFtaWx5IFJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNTEtNDM1NywgaHR0cHM6Ly93d3cuY2ZyaGVscHMub3JnLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCjx1PklmIHlvdSBvciBzb21lb25lIHlvdSBrbm93IGlzIGNvbnRlbXBsYXRpbmcgc3VpY2lkZTwvdT4sIGVpdGhlciBjYWxsIG9yIHRleHQgdGhlIFN1aWNpZGUgYW5kIENyaXNpcyBMaWZlbGluZSBhdCA5ODgsIG9yIGNhbGwgOTExLgoKIyBEaXNjbG9zdXJlcyB7I2Rpc2Nsb3N1cmVzfQoKSSBhbSB0aGUgT3duZXIgb2YgRmFudGFzeSBGb290YmFsbCBBbmFseXRpY3MsIExMQywgd2hpY2ggb3BlcmF0ZXMgaHR0cHM6Ly9mYW50YXN5Zm9vdGJhbGxhbmFseXRpY3MubmV0LgpJIGRvIG5vdCByZXF1aXJlIG9yIGVuY291cmFnZSBzdHVkZW50cyB0byB1c2UgbXkgd2Vic2l0ZSwgYW5kIEkgZG8gbm90IHByb21vdGUgb3IgZW5kb3JzZSBhbnkgc3BlY2lmaWMgY29udGVudCBvciBzZXJ2aWNlcyBvZmZlcmVkIGJ5IEZhbnRhc3kgRm9vdGJhbGwgQW5hbHl0aWNzLgoKIyBEaXNjbGFpbWVyIHsjZGlzY2xhaW1lcn0KCiIqVGhpcyBtYXRlcmlhbCBwcm9iYWJseSB3b24ndCB3aW4geW91IGZhbnRhc3kgZm9vdGJhbGwgY2hhbXBpb25zaGlwcy4KWW91IGNvdWxkIHRha2Ugd2hhdCB3ZSBsZWFybiBhbmQgYXBwbHkgaXQgdG8gZmFudGFzeSBmb290YmFsbCBhbmQgeW91IG1pZ2h0IGJlY29tZSA1IHBlcmNlbnQgbW9yZSBsaWtlbHkgdG8gd2luLgpPci4uLgpDb25zaWRlciB0aGUgYnJvYWRlciByZWxldmFuY2Ugb2YgdGhpcy4KWW91IGNvdWxkIGxlYXJuIGRhdGEgYW5hbHlzaXMgYW5kIGZpZ3VyZSBvdXQgd2F5cyB0byBhcHBseSBpdCB0byBvdGhlciBzeXN0ZW1zLgpBbmQgeW91IGNvdWxkIGJlIG1ha2luZyBhIHNpeC1maWd1cmUgc2FsYXJ5IHdpdGhpbiB0aGUgbmV4dCBmaXZlIHllYXJzLioiCuKAkyBCZW5qYW1pbiBNb3R6LCBQaC5ELgoKVGhpcyBzeWxsYWJ1cyBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KQW55IGNoYW5nZXMgd2lsbCBiZSBkaXNjdXNzZWQgaW4gY2xhc3MsIHZpYSBlbWFpbCwgYW5kL29yIG9uIElDT04uCg==