Introduction
This note outlines the relatively new interdisciplinary field of
data science which combines mathematics and statistics,
computer science, data and communication technologies, and domain
knowledge.
What Is Data Science? https://aws.amazon.com/what-is/data-science/#:~:text=Data%20science%20is%20an%20umbrella,%2C%20mathematics%2C%20and%20statistical%20analysis.
Data science is a multidisciplinary field that combines principles
and practices from the fields of mathematics, statistics, computer
science, and computer engineering to analyze large amounts of data. The
data in data science projects could be text, audio, video, image, etc.
Data science projects address questions like what happened, why it
happened, what will happen, and what can be done with the results.
History of Data Science
While the term data science is not new, the meanings and connotations
have changed over time. The word first appeared in the ’60s as an
alternative name for statistics.
1990s and early 2000s: We can clearly see that
data science has emerged as a recognized and specialized field. Several
data science academic journals began to circulate, and data science
proponents like Jeff Wu and William S. Cleveland continued to help
develop and expound upon the necessity and potential of data
science.
2005: Big data enters the scene. New data
technologies Hadoop, Sparks, Cassandra, etc are capable of processing
big data.
2014: Due to the increasing importance of data,
and organizations’ interest in finding patterns and making better
business decisions, demand for data scientists began to see dramatic
growth in different parts of the world.
2015: Machine learning, deep learning, and
Artificial Intelligence (AI) officially enter the realm of data science.
These technologies have driven innovations over the past decade
2018: New regulations in the field are perhaps
one of the biggest aspects of the evolution of data science.
2020s: We are seeing additional breakthroughs in
AI, machine learning, and an ever-more-increasing demand for qualified
professionals.
Data Science Role Outlook: The US Labor Statistics
recently released a job outlook in data science and statistics. https://www.bls.gov/ooh/math/data-scientists.htm#:~:text=Data%20scientists%20typically%20do%20the,and%20update%20algorithms%20and%20models
What Can Data Science
Do?
What Can Data Science
Do?
Data Science is a powerful field that can provide valuable insights
and drive decision-making across numerous industries. Here are some of
the things that data science can do:
- Identify Patterns and Trends
Using statistical techniques to find patterns and trends in datasets.
This can help uncover insights that were previously hidden.
By creating algorithms and data models, data scientists can predict
future outcomes based on historical data.
Using machine learning techniques to improve the quality of data or
product offerings.
The insights derived from data science can be used to guide
decision-making and strategic planning in an organization.
- Communicate Recommendations
Data scientists and statisticians play a crucial role in
communicating their findings to other teams and senior staff. This helps
the organization to make informed decisions.
- Stay on Top of Innovations
Data scientists and statisticians need to stay updated with the
latest innovations in the field of data science.
Using data tools such as Python, R, SAS, or SQL for data
analysis.
Types of Analyses in
Data Science
include_graphics("img/TypesAnalysisInDSCI.jpg")

1. Descriptive analysis
Descriptive analysis examines data to gain insights into what
happened or what is happening in the data environment. The primary tools
used in descriptive analysis are EDA and basic statistical
charts. It is characterized by data visualizations such as pie charts,
bar charts, line graphs, tables, or generated narratives.
Example: A flight booking service may record data
like the number of tickets booked each day. Descriptive analysis will
reveal booking spikes, booking slumps, and high-performing months for
this service.
2. Diagnostic analysis
Diagnostic analysis is a deep-dive or detailed data examination to
understand why something happened. It is characterized by techniques
such as drill-down, data discovery, data mining, and correlations.
Multiple data operations and transformations may be performed on a given
data set to discover unique patterns in each of these techniques.
Example: The flight service might drill down on a
particularly high-performing month to better understand the booking
spike. This may lead to the discovery that many customers visit a
particular city to attend a monthly sporting event.
3. Predictive analysis
Predictive analysis uses historical data to make accurate forecasts
about data patterns that may occur in the future. It is characterized by
techniques such as machine learning, forecasting, pattern matching, and
predictive modeling. In each of these techniques, computers are trained
to reverse engineer causality connections in the data.
Example: The flight service team might use data
science to predict flight booking patterns for the coming year at the
start of each year. The computer program or algorithm may look at past
data and predict booking spikes for certain destinations in May. Having
anticipated their customer’s future travel requirements, the company
could start targeted advertising for those cities in February.
4. Prescriptive analysis
Prescriptive analytics takes predictive data to the next level. It
not only predicts what is likely to happen but also suggests an optimum
response to that outcome. It can analyze the potential implications of
different choices and recommend the best course of action. It uses
visual analytics, simulation, complex event processing, neural networks,
and recommendation engines from machine learning.
Example: Prescriptive analysis could look at
historical marketing campaigns to maximize the advantage of the upcoming
booking spike. A data scientist could project booking outcomes for
different levels of marketing spend on various marketing channels. These
data forecasts would give the flight booking company greater confidence
in their marketing decisions.
Data Science
Process
A business problem typically initiates the data science process. A
data scientist will work with business stakeholders to understand what
business needs.
include_graphics("img/DsciWorkFlow.jpg")

Once the problem has been defined, the data scientist may solve it
using the OSEMN data science process:
Data can be pre-existing, newly acquired, or a data repository
downloadable from the internet. Data scientists can extract data from
internal or external databases, company CRM software, web server logs,
and social media or purchase it from trusted third-party sources.
Data scrubbing, or data cleaning, is the process of standardizing the
data according to a predetermined format. It includes handling missing
data, fixing data errors, and removing any data outliers. Some examples
of data scrubbing are:·
Changing all date values to a common standard format.·
Fixing spelling mistakes or additional spaces.·
Fixing mathematical inaccuracies or removing commas from large
numbers.
Data exploration is preliminary data analysis that is used for
planning further data modeling strategies. Data scientists gain an
initial understanding of the data using descriptive statistics and data
visualization tools. Then they explore the data to identify interesting
patterns that can be studied or actioned.
Software and machine learning algorithms are used to gain deeper
insights, predict outcomes, and prescribe the best course of action.
Machine learning techniques like association, classification, and
clustering are applied to the training data set. The model might be
tested against predetermined test data to assess result accuracy. The
data model can be fine-tuned many times to improve result outcomes.
Data scientists work together with analysts and businesses to convert
data insights into action. They make diagrams, graphs, and charts to
represent trends and predictions. Data summarization helps stakeholders
understand and implement results effectively.
What Data Science
Cannot Do?
While data science is a powerful tool, it does have its limitations.
Here are some things that data science cannot do:
Replace Subject Matter Experts: Data science can
provide insights and help make informed decisions, but it cannot replace
the expertise and judgment of subject matter experts.
Guarantee 100% Accuracy: Predictive models in
data science are based on probabilities and are therefore not always
100% accurate.
Eliminate Bias: If the data used in data science
is biased, the results will also be biased. Data scientists can try to
minimize bias, but it cannot be completely eliminated.
Replace Data Preparation: Data science cannot
bypass the data preparation stage. Raw data often needs to be cleaned
and transformed before it can be used for analysis.
Automate Data Collection: While data science can
analyze and draw insights from data, it cannot automate the process of
data collection.
Solve All Problems: Data science is a tool that
can help solve many problems, but not all. Some problems may require
other approaches or tools.
Work Without Clear Goals: Data science is most
effective when there are clear goals and questions to answer. Without
these, it can be difficult to extract meaningful insights from the
data.
Ensure Ethical Use of Data: Data science itself
cannot ensure the ethical use of data. This is the responsibility of the
data scientists and the organization they work for.
Function Without Infrastructure: Data science
requires a certain level of infrastructure, including data storage and
processing capabilities.
Replace Human Intuition and Creativity: While
data science can provide valuable insights, it cannot replace human
intuition and creativity.
Technologies for Data
Science
Computing
Technologies
Data science practitioners work with complex technologies such
as:
ML Tools: Machine learning models and related
software are used for predictive and prescriptive analysis.
Cloud computing: Cloud technologies have given
the flexibility and processing power required for advanced data
analytics.
Internet of things: IoT refers to various
devices that can automatically connect to the Internet. These devices
collect data for data science initiatives. They generate massive data
which can be used for data mining and data extraction.
High-Performance computing: Quantum computers
can perform complex calculations at high speed. Skilled data scientists
use them for building complex quantitative algorithms.
Data Science
Communication Technologies
Data Science Communication involves the use of various technologies
to effectively communicate data insights. Here are some key technologies
used in this field:
Tools like Tableau, Matplotlib in Python, and rich graphical
libraries in R are used to create visual representations of data, making
it easier to identify patterns, trends, and insights. Some powerful
emerging interactive technologies are also available due to the recent
development of various software programs such as plotly
and
RShiny
. These interactive technologies make visualization
and analytics easier to extract hidden information from data through
analytics.
RMarkdown/R Notebook and Jupyter Notebook are widely used for data
science communication. They allow for the creation of documents that
combine live code (such as Python or R) with visualizations and
narrative texts.
Markdown is used for formatting text, while LaTeX is used for
creating high-quality technical and scientific documentation. Both can
be used in RMarkdown/R Notebook and Jupyter Notebook to create
well-structured, readable documents. RMarkdown is also a powerful web
development tool to generate web-based reports with both static and
interactive visual content.
- GitHub - Version Control and Collaboration
GitHub is a platform for version control and collaboration. It allows
data scientists to work together and share their code and notebooks. It
is also convenient to host static web pages
- Presentation Software and technologies
Tools like our old friends Microsoft PowerPoint or Google Slides are
often used to present data science findings to non-technical
stakeholders.
- Platforms for Technical Communication
There are several key elements of technical communication that
require integrating different platforms to accomplish effective
technical communication.
Clarity and Conciseness: Technical communication
aims to make complex information clear and easily understandable for the
target audience. This involves using straightforward language, avoiding
unnecessary jargon, and organizing information logically to convey
information efficiently.
Purpose: Technical communication serves various
purposes, such as informing, instructing, persuading, or documenting.
The purpose guides the structure and content of the communication.
Document Design: Effective technical communication
often involves thoughtful document design. This includes the use of
headings, lists, graphics, and other visual elements to enhance
comprehension and make the information more accessible.
Medium Selection: Technical communication can take
various forms, including written documents, presentations, videos, and
interactive content. Choosing the appropriate medium for the message and
audience is crucial.
Platforms like Slack or Microsoft Teams are used for real-time
communication within a data science team. Other platforms such as
GitHub, Anaconda, RStudio, SAS Viya, etc. are
A data science platform is a software solution that enables data
scientists to effectively plan strategies, discover actionable insights
from interpreting data, and communicate their insights across the entire
organization—all within a single environment. They also allow for
collaborative data science work and include features for sharing and
presenting data science results. Popular platforms include AWS Sage
Maker, Microsoft Azure ML, Anaconda, etc.
Fields Related to Data
Science
Data science is an all-encompassing term for other data-related roles
and fields. We look at briefly these areas. In addition, we also point
out some of the challenges and some ML-specific tools.
Data Science and
Related Areas
We have mentioned that data science as an emerging multidisciplinary
field is built on four pillars: Mathematics and Statistics,
Computational Science (databases and programming), interactive
technologies and strategies for communication, and domain knowledge. We
next briefly describe the relationship between data science and the
related fields.
- data science and data analytics
While the terms may be used interchangeably, data analytics is a
subset of data science. Data science is an umbrella term for all aspects
of data processing—from the collection to modeling to insights. On the
other hand, data analytics is mainly concerned with statistics,
mathematics, and statistical analysis. It focuses on only data analysis,
while data science is related to the bigger picture around
organizational data. In most workplaces, data scientists and data
analysts work together towards common business goals. A data analyst may
spend more time on routine analysis, providing regular reports. A data
scientist may design the way data is stored, manipulated, and analyzed.
Simply put, a data analyst makes sense out of existing data, whereas a
data scientist creates new methods and tools to process data for use by
analysts.
- data science and business analytics
While there is an overlap between data science and business
analytics, the key difference is the use of technology in each field.
Data scientists work more closely with data technology than business
analysts. Business analysts bridge the gap between business and IT. They
define business cases, collect information from stakeholders, or
validate solutions. Data scientists, on the other hand, use technology
to work with business data. They may write programs, apply machine
learning techniques to create models and develop new algorithms. Data
scientists not only understand the problem but can also build a tool
that provides solutions to the problem. It’s not unusual to find
business analysts and data scientists working on the same team. Business
analysts take the output from data scientists and use it to tell a story
that the broader business can understand.
- data science and data engineering
Data engineers build and maintain the systems that allow data
scientists to access and interpret data. They work more closely with
underlying technology than a data scientist. The role generally involves
creating data models, building data pipelines, and overseeing extract,
transform, and load (ETL). Depending on the organization’s setup and
size, the data engineer may also manage related infrastructure like
big-data storage, streaming, and processing platforms like Amazon
S3.Data scientists use the data that data engineers have processed to
build and train predictive models. Data scientists may then hand over
the results to the analysts for further decision-making.
- data science and machine learning
Machine learning is the science of training machines to analyze and
learn from data the way humans do. It is one of the methods used in data
science projects to gain automated insights from data. Machine learning
engineers specialize in computing, algorithms, and coding skills
specific to machine learning methods. Data scientists might use machine
learning methods as a tool or work closely with other machine learning
engineers to process data.
- data science and statistics
Statistics is a mathematically-based field that seeks to collect and
interpret quantitative data. In contrast, data science is a
multidisciplinary field that uses scientific methods, processes, and
systems to extract knowledge from data in various forms. Data scientists
use methods from many disciplines, including statistics. However, the
fields differ in their processes and the problems they study.
Data Science
challenges
Different types of apps and tools generate data in various formats.
Data scientists have to clean and prepare data to make it consistent.
This can be tedious and time-consuming.
- Understanding the business problem
Data scientists have to work with multiple stakeholders and business
managers to define the problem to be solved. This can be
challenging—especially in large companies with multiple teams that have
varying requirements.
Machine learning tools are not completely accurate, and some
uncertainty or bias can exist as a result. Biases are imbalances in the
training data or prediction behavior of the model across different
groups, such as age or income bracket. For instance, if the tool is
trained primarily on data from middle-aged individuals, it may be less
accurate when making predictions involving younger and older people. The
field of machine learning provides an opportunity to address biases by
detecting them and measuring them in the data and model.
LS0tDQp0aXRsZTogIldoYXQgaXMgRGF0YSBTY2llbmNlPyINCmRhdGU6ICI4LzEwLzIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Kb3B0aW9ucyhyZXBvcyA9IGxpc3QoQ1JBTj0iaHR0cDovL2NyYW4ucnN0dWRpby5jb20vIikpDQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCg0KDQoNClwNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyBub3RlIG91dGxpbmVzIHRoZSByZWxhdGl2ZWx5IG5ldyBpbnRlcmRpc2NpcGxpbmFyeSBmaWVsZCBvZiAqKmRhdGEgc2NpZW5jZSoqIHdoaWNoIGNvbWJpbmVzIG1hdGhlbWF0aWNzIGFuZCBzdGF0aXN0aWNzLCBjb21wdXRlciBzY2llbmNlLCBkYXRhIGFuZCBjb21tdW5pY2F0aW9uIHRlY2hub2xvZ2llcywgYW5kIGRvbWFpbiBrbm93bGVkZ2UuICANCg0KDQoqKldoYXQgSXMgRGF0YSBTY2llbmNlPyoqIDxodHRwczovL2F3cy5hbWF6b24uY29tL3doYXQtaXMvZGF0YS1zY2llbmNlLyM6fjp0ZXh0PURhdGElMjBzY2llbmNlJTIwaXMlMjBhbiUyMHVtYnJlbGxhLCUyQyUyMG1hdGhlbWF0aWNzJTJDJTIwYW5kJTIwc3RhdGlzdGljYWwlMjBhbmFseXNpcy4+DQoNCkRhdGEgc2NpZW5jZSBpcyBhIG11bHRpZGlzY2lwbGluYXJ5IGZpZWxkIHRoYXQgY29tYmluZXMgcHJpbmNpcGxlcyBhbmQgcHJhY3RpY2VzIGZyb20gdGhlIGZpZWxkcyBvZiBtYXRoZW1hdGljcywgc3RhdGlzdGljcywgY29tcHV0ZXIgc2NpZW5jZSwgYW5kIGNvbXB1dGVyIGVuZ2luZWVyaW5nIHRvIGFuYWx5emUgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLiBUaGUgZGF0YSBpbiBkYXRhIHNjaWVuY2UgcHJvamVjdHMgY291bGQgYmUgdGV4dCwgYXVkaW8sIHZpZGVvLCBpbWFnZSwgZXRjLiBEYXRhIHNjaWVuY2UgcHJvamVjdHMgYWRkcmVzcyBxdWVzdGlvbnMgbGlrZSB3aGF0IGhhcHBlbmVkLCB3aHkgaXQgaGFwcGVuZWQsIHdoYXQgd2lsbCBoYXBwZW4sIGFuZCB3aGF0IGNhbiBiZSBkb25lIHdpdGggdGhlIHJlc3VsdHMuDQoNCg0KKipIaXN0b3J5IG9mIERhdGEgU2NpZW5jZSoqDQoNCg0KV2hpbGUgdGhlIHRlcm0gZGF0YSBzY2llbmNlIGlzIG5vdCBuZXcsIHRoZSBtZWFuaW5ncyBhbmQgY29ubm90YXRpb25zIGhhdmUgY2hhbmdlZCBvdmVyIHRpbWUuIFRoZSB3b3JkIGZpcnN0IGFwcGVhcmVkIGluIHRoZSDigJk2MHMgYXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3Igc3RhdGlzdGljcy4NCg0KKiAqKjE5OTBzIGFuZCBlYXJseSAyMDAwcyoqOiBXZSBjYW4gY2xlYXJseSBzZWUgdGhhdCBkYXRhIHNjaWVuY2UgaGFzIGVtZXJnZWQgYXMgYSByZWNvZ25pemVkIGFuZCBzcGVjaWFsaXplZCBmaWVsZC4gU2V2ZXJhbCBkYXRhIHNjaWVuY2UgYWNhZGVtaWMgam91cm5hbHMgYmVnYW4gdG8gY2lyY3VsYXRlLCBhbmQgZGF0YSBzY2llbmNlIHByb3BvbmVudHMgbGlrZSBKZWZmIFd1IGFuZCBXaWxsaWFtIFMuIENsZXZlbGFuZCBjb250aW51ZWQgdG8gaGVscCBkZXZlbG9wIGFuZCBleHBvdW5kIHVwb24gdGhlIG5lY2Vzc2l0eSBhbmQgcG90ZW50aWFsIG9mIGRhdGEgc2NpZW5jZS4NCg0KKiAqKjIwMDUqKjogQmlnIGRhdGEgZW50ZXJzIHRoZSBzY2VuZS4gTmV3IGRhdGEgdGVjaG5vbG9naWVzIEhhZG9vcCwgU3BhcmtzLCBDYXNzYW5kcmEsIGV0YyBhcmUgY2FwYWJsZSBvZiBwcm9jZXNzaW5nICoqYmlnIGRhdGEqKi4gDQoNCiogKioyMDE0Kio6IER1ZSB0byB0aGUgaW5jcmVhc2luZyBpbXBvcnRhbmNlIG9mIGRhdGEsIGFuZCBvcmdhbml6YXRpb25z4oCZIGludGVyZXN0IGluIGZpbmRpbmcgcGF0dGVybnMgYW5kIG1ha2luZyBiZXR0ZXIgYnVzaW5lc3MgZGVjaXNpb25zLCBkZW1hbmQgZm9yIGRhdGEgc2NpZW50aXN0cyBiZWdhbiB0byBzZWUgZHJhbWF0aWMgZ3Jvd3RoIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgd29ybGQuDQoNCiogKioyMDE1Kio6IE1hY2hpbmUgbGVhcm5pbmcsIGRlZXAgbGVhcm5pbmcsIGFuZCBBcnRpZmljaWFsIEludGVsbGlnZW5jZSAoQUkpIG9mZmljaWFsbHkgZW50ZXIgdGhlIHJlYWxtIG9mIGRhdGEgc2NpZW5jZS4gVGhlc2UgdGVjaG5vbG9naWVzIGhhdmUgZHJpdmVuIGlubm92YXRpb25zIG92ZXIgdGhlIHBhc3QgZGVjYWRlIA0KDQoqICoqMjAxOCoqOiBOZXcgcmVndWxhdGlvbnMgaW4gdGhlIGZpZWxkIGFyZSBwZXJoYXBzIG9uZSBvZiB0aGUgYmlnZ2VzdCBhc3BlY3RzIG9mIHRoZSBldm9sdXRpb24gb2YgZGF0YSBzY2llbmNlLg0KDQoqICoqMjAyMHMqKjogV2UgYXJlIHNlZWluZyBhZGRpdGlvbmFsIGJyZWFrdGhyb3VnaHMgaW4gQUksIG1hY2hpbmUgbGVhcm5pbmcsIGFuZCBhbiBldmVyLW1vcmUtaW5jcmVhc2luZyBkZW1hbmQgZm9yIHF1YWxpZmllZCBwcm9mZXNzaW9uYWxzLg0KDQoNCioqRGF0YSBTY2llbmNlIFJvbGUgT3V0bG9vayoqOiBUaGUgVVMgTGFib3IgU3RhdGlzdGljcyByZWNlbnRseSByZWxlYXNlZCBhIGpvYiBvdXRsb29rIGluIGRhdGEgc2NpZW5jZSBhbmQgc3RhdGlzdGljcy4NCjxodHRwczovL3d3dy5ibHMuZ292L29vaC9tYXRoL2RhdGEtc2NpZW50aXN0cy5odG0jOn46dGV4dD1EYXRhJTIwc2NpZW50aXN0cyUyMHR5cGljYWxseSUyMGRvJTIwdGhlLGFuZCUyMHVwZGF0ZSUyMGFsZ29yaXRobXMlMjBhbmQlMjBtb2RlbHM+DQoNCg0KDQojIFdoYXQgQ2FuIERhdGEgU2NpZW5jZSBEbz8gDQoNClwNCg0KIyMgV2hhdCBDYW4gRGF0YSBTY2llbmNlIERvPw0KDQpEYXRhIFNjaWVuY2UgaXMgYSBwb3dlcmZ1bCBmaWVsZCB0aGF0IGNhbiBwcm92aWRlIHZhbHVhYmxlIGluc2lnaHRzIGFuZCBkcml2ZSBkZWNpc2lvbi1tYWtpbmcgYWNyb3NzIG51bWVyb3VzIGluZHVzdHJpZXMuIEhlcmUgYXJlIHNvbWUgb2YgdGhlIHRoaW5ncyB0aGF0IGRhdGEgc2NpZW5jZSBjYW4gZG86DQoNCiogKipJZGVudGlmeSBQYXR0ZXJucyBhbmQgVHJlbmRzKiogDQoNClVzaW5nIHN0YXRpc3RpY2FsIHRlY2huaXF1ZXMgdG8gZmluZCBwYXR0ZXJucyBhbmQgdHJlbmRzIGluIGRhdGFzZXRzLiBUaGlzIGNhbiBoZWxwIHVuY292ZXIgaW5zaWdodHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuLg0KDQoqICoqRm9yZWNhc3QgT3V0Y29tZXMqKg0KDQpCeSBjcmVhdGluZyBhbGdvcml0aG1zIGFuZCBkYXRhIG1vZGVscywgZGF0YSBzY2llbnRpc3RzIGNhbiBwcmVkaWN0IGZ1dHVyZSBvdXRjb21lcyBiYXNlZCBvbiBoaXN0b3JpY2FsIGRhdGEuDQoNCiogKipJbXByb3ZlIERhdGEgUXVhbGl0eSoqIA0KDQpVc2luZyBtYWNoaW5lIGxlYXJuaW5nIHRlY2huaXF1ZXMgdG8gaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiBkYXRhIG9yIHByb2R1Y3Qgb2ZmZXJpbmdzLg0KDQoqICoqR3VpZGUgRGVjaXNpb24gTWFraW5nKioNCg0KVGhlIGluc2lnaHRzIGRlcml2ZWQgZnJvbSBkYXRhIHNjaWVuY2UgY2FuIGJlIHVzZWQgdG8gZ3VpZGUgZGVjaXNpb24tbWFraW5nIGFuZCBzdHJhdGVnaWMgcGxhbm5pbmcgaW4gYW4gb3JnYW5pemF0aW9uLg0KDQoqICoqQ29tbXVuaWNhdGUgUmVjb21tZW5kYXRpb25zKiogDQoNCkRhdGEgc2NpZW50aXN0cyBhbmQgc3RhdGlzdGljaWFucyBwbGF5IGEgY3J1Y2lhbCByb2xlIGluIGNvbW11bmljYXRpbmcgdGhlaXIgZmluZGluZ3MgdG8gb3RoZXIgdGVhbXMgYW5kIHNlbmlvciBzdGFmZi4gVGhpcyBoZWxwcyB0aGUgb3JnYW5pemF0aW9uIHRvIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zLg0KDQoNCiogKipTdGF5IG9uIFRvcCBvZiBJbm5vdmF0aW9ucyoqIA0KDQpEYXRhIHNjaWVudGlzdHMgYW5kIHN0YXRpc3RpY2lhbnMgbmVlZCB0byBzdGF5IHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IGlubm92YXRpb25zIGluIHRoZSBmaWVsZCBvZiBkYXRhIHNjaWVuY2UuDQoNCiogKipEZXBsb3kgRGF0YSBUb29scyoqIA0KDQpVc2luZyBkYXRhIHRvb2xzIHN1Y2ggYXMgUHl0aG9uLCBSLCBTQVMsIG9yIFNRTCBmb3IgZGF0YSBhbmFseXNpcy4NCg0KXA0KDQojIyBUeXBlcyBvZiBBbmFseXNlcyBpbiBEYXRhIFNjaWVuY2UgDQoNCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjgwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJpbWcvVHlwZXNBbmFseXNpc0luRFNDSS5qcGciKQ0KYGBgDQoNCg0KKioxLiBEZXNjcmlwdGl2ZSBhbmFseXNpcyoqDQoNCkRlc2NyaXB0aXZlIGFuYWx5c2lzIGV4YW1pbmVzIGRhdGEgdG8gZ2FpbiBpbnNpZ2h0cyBpbnRvIHdoYXQgaGFwcGVuZWQgb3Igd2hhdCBpcyBoYXBwZW5pbmcgaW4gdGhlIGRhdGEgZW52aXJvbm1lbnQuIFRoZSBwcmltYXJ5IHRvb2xzIHVzZWQgaW4gKmRlc2NyaXB0aXZlIGFuYWx5c2lzKiBhcmUgRURBIGFuZCBiYXNpYyBzdGF0aXN0aWNhbCBjaGFydHMuIEl0IGlzIGNoYXJhY3Rlcml6ZWQgYnkgZGF0YSB2aXN1YWxpemF0aW9ucyBzdWNoIGFzIHBpZSBjaGFydHMsIGJhciBjaGFydHMsIGxpbmUgZ3JhcGhzLCB0YWJsZXMsIG9yIGdlbmVyYXRlZCBuYXJyYXRpdmVzLiANCg0KKipFeGFtcGxlKio6IEEgZmxpZ2h0IGJvb2tpbmcgc2VydmljZSBtYXkgcmVjb3JkIGRhdGEgbGlrZSB0aGUgbnVtYmVyIG9mIHRpY2tldHMgYm9va2VkIGVhY2ggZGF5LiBEZXNjcmlwdGl2ZSBhbmFseXNpcyB3aWxsIHJldmVhbCBib29raW5nIHNwaWtlcywgYm9va2luZyBzbHVtcHMsIGFuZCBoaWdoLXBlcmZvcm1pbmcgbW9udGhzIGZvciB0aGlzIHNlcnZpY2UuDQoNCg0KKioyLiBEaWFnbm9zdGljIGFuYWx5c2lzKioNCg0KRGlhZ25vc3RpYyBhbmFseXNpcyBpcyBhIGRlZXAtZGl2ZSBvciBkZXRhaWxlZCBkYXRhIGV4YW1pbmF0aW9uIHRvIHVuZGVyc3RhbmQgd2h5IHNvbWV0aGluZyBoYXBwZW5lZC4gSXQgaXMgY2hhcmFjdGVyaXplZCBieSB0ZWNobmlxdWVzIHN1Y2ggYXMgZHJpbGwtZG93biwgZGF0YSBkaXNjb3ZlcnksIGRhdGEgbWluaW5nLCBhbmQgY29ycmVsYXRpb25zLiBNdWx0aXBsZSBkYXRhIG9wZXJhdGlvbnMgYW5kIHRyYW5zZm9ybWF0aW9ucyBtYXkgYmUgcGVyZm9ybWVkIG9uIGEgZ2l2ZW4gZGF0YSBzZXQgdG8gZGlzY292ZXIgdW5pcXVlIHBhdHRlcm5zIGluIGVhY2ggb2YgdGhlc2UgdGVjaG5pcXVlcy4NCg0KDQoNCioqRXhhbXBsZSoqOiBUaGUgZmxpZ2h0IHNlcnZpY2UgbWlnaHQgZHJpbGwgZG93biBvbiBhIHBhcnRpY3VsYXJseSBoaWdoLXBlcmZvcm1pbmcgbW9udGggdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGJvb2tpbmcgc3Bpa2UuIFRoaXMgbWF5IGxlYWQgdG8gdGhlIGRpc2NvdmVyeSB0aGF0IG1hbnkgY3VzdG9tZXJzIHZpc2l0IGEgcGFydGljdWxhciBjaXR5IHRvIGF0dGVuZCBhIG1vbnRobHkgc3BvcnRpbmcgZXZlbnQuDQoNCioqMy4gUHJlZGljdGl2ZSBhbmFseXNpcyoqDQoNClByZWRpY3RpdmUgYW5hbHlzaXMgdXNlcyBoaXN0b3JpY2FsIGRhdGEgdG8gbWFrZSBhY2N1cmF0ZSBmb3JlY2FzdHMgYWJvdXQgZGF0YSBwYXR0ZXJucyB0aGF0IG1heSBvY2N1ciBpbiB0aGUgZnV0dXJlLiBJdCBpcyBjaGFyYWN0ZXJpemVkIGJ5IHRlY2huaXF1ZXMgc3VjaCBhcyBtYWNoaW5lIGxlYXJuaW5nLCBmb3JlY2FzdGluZywgcGF0dGVybiBtYXRjaGluZywgYW5kIHByZWRpY3RpdmUgbW9kZWxpbmcuIEluIGVhY2ggb2YgdGhlc2UgdGVjaG5pcXVlcywgY29tcHV0ZXJzIGFyZSB0cmFpbmVkIHRvIHJldmVyc2UgZW5naW5lZXIgY2F1c2FsaXR5IGNvbm5lY3Rpb25zIGluIHRoZSBkYXRhLg0KDQoqKkV4YW1wbGUqKjogVGhlIGZsaWdodCBzZXJ2aWNlIHRlYW0gbWlnaHQgdXNlIGRhdGEgc2NpZW5jZSB0byBwcmVkaWN0IGZsaWdodCBib29raW5nIHBhdHRlcm5zIGZvciB0aGUgY29taW5nIHllYXIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggeWVhci4gVGhlIGNvbXB1dGVyIHByb2dyYW0gb3IgYWxnb3JpdGhtIG1heSBsb29rIGF0IHBhc3QgZGF0YSBhbmQgcHJlZGljdCBib29raW5nIHNwaWtlcyBmb3IgY2VydGFpbiBkZXN0aW5hdGlvbnMgaW4gTWF5LiBIYXZpbmcgYW50aWNpcGF0ZWQgdGhlaXIgY3VzdG9tZXLigJlzIGZ1dHVyZSB0cmF2ZWwgcmVxdWlyZW1lbnRzLCB0aGUgY29tcGFueSBjb3VsZCBzdGFydCB0YXJnZXRlZCBhZHZlcnRpc2luZyBmb3IgdGhvc2UgY2l0aWVzIGluIEZlYnJ1YXJ5Lg0KDQoNCioqNC4gUHJlc2NyaXB0aXZlIGFuYWx5c2lzKioNCg0KUHJlc2NyaXB0aXZlIGFuYWx5dGljcyB0YWtlcyBwcmVkaWN0aXZlIGRhdGEgdG8gdGhlIG5leHQgbGV2ZWwuIEl0IG5vdCBvbmx5IHByZWRpY3RzIHdoYXQgaXMgbGlrZWx5IHRvIGhhcHBlbiBidXQgYWxzbyBzdWdnZXN0cyBhbiBvcHRpbXVtIHJlc3BvbnNlIHRvIHRoYXQgb3V0Y29tZS4gSXQgY2FuIGFuYWx5emUgdGhlIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMgb2YgZGlmZmVyZW50IGNob2ljZXMgYW5kIHJlY29tbWVuZCB0aGUgYmVzdCBjb3Vyc2Ugb2YgYWN0aW9uLiBJdCB1c2VzIHZpc3VhbCBhbmFseXRpY3MsIHNpbXVsYXRpb24sIGNvbXBsZXggZXZlbnQgcHJvY2Vzc2luZywgbmV1cmFsIG5ldHdvcmtzLCBhbmQgcmVjb21tZW5kYXRpb24gZW5naW5lcyBmcm9tIG1hY2hpbmUgbGVhcm5pbmcuICAgICAgICAgDQoNCg0KKipFeGFtcGxlKio6IFByZXNjcmlwdGl2ZSBhbmFseXNpcyBjb3VsZCBsb29rIGF0IGhpc3RvcmljYWwgbWFya2V0aW5nIGNhbXBhaWducyB0byBtYXhpbWl6ZSB0aGUgYWR2YW50YWdlIG9mIHRoZSB1cGNvbWluZyBib29raW5nIHNwaWtlLiBBIGRhdGEgc2NpZW50aXN0IGNvdWxkIHByb2plY3QgYm9va2luZyBvdXRjb21lcyBmb3IgZGlmZmVyZW50IGxldmVscyBvZiBtYXJrZXRpbmcgc3BlbmQgb24gdmFyaW91cyBtYXJrZXRpbmcgY2hhbm5lbHMuIFRoZXNlIGRhdGEgZm9yZWNhc3RzIHdvdWxkIGdpdmUgdGhlIGZsaWdodCBib29raW5nIGNvbXBhbnkgZ3JlYXRlciBjb25maWRlbmNlIGluIHRoZWlyIG1hcmtldGluZyBkZWNpc2lvbnMuDQoNCg0KXCAgDQoNCg0KIyMgRGF0YSBTY2llbmNlIFByb2Nlc3MNCg0KQSBidXNpbmVzcyBwcm9ibGVtIHR5cGljYWxseSBpbml0aWF0ZXMgdGhlIGRhdGEgc2NpZW5jZSBwcm9jZXNzLiBBIGRhdGEgc2NpZW50aXN0IHdpbGwgd29yayB3aXRoIGJ1c2luZXNzIHN0YWtlaG9sZGVycyB0byB1bmRlcnN0YW5kIHdoYXQgYnVzaW5lc3MgbmVlZHMuIA0KDQoNCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjgwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJpbWcvRHNjaVdvcmtGbG93LmpwZyIpDQpgYGANCg0KXA0KDQpPbmNlIHRoZSBwcm9ibGVtIGhhcyBiZWVuIGRlZmluZWQsIHRoZSBkYXRhIHNjaWVudGlzdCBtYXkgc29sdmUgaXQgdXNpbmcgdGhlIE9TRU1OIGRhdGEgc2NpZW5jZSBwcm9jZXNzOg0KDQoqICoqQ2FwdHVyaW5nKioNCg0KRGF0YSBjYW4gYmUgcHJlLWV4aXN0aW5nLCBuZXdseSBhY3F1aXJlZCwgb3IgYSBkYXRhIHJlcG9zaXRvcnkgZG93bmxvYWRhYmxlIGZyb20gdGhlIGludGVybmV0LiBEYXRhIHNjaWVudGlzdHMgY2FuIGV4dHJhY3QgZGF0YSBmcm9tIGludGVybmFsIG9yIGV4dGVybmFsIGRhdGFiYXNlcywgY29tcGFueSBDUk0gc29mdHdhcmUsIHdlYiBzZXJ2ZXIgbG9ncywgYW5kIHNvY2lhbCBtZWRpYSBvciBwdXJjaGFzZSBpdCBmcm9tIHRydXN0ZWQgdGhpcmQtcGFydHkgc291cmNlcy4NCg0KKiAqKlN0b3JhZ2UgYW5kIEVUTCoqDQoNCkRhdGEgc2NydWJiaW5nLCBvciBkYXRhIGNsZWFuaW5nLCBpcyB0aGUgcHJvY2VzcyBvZiBzdGFuZGFyZGl6aW5nIHRoZSBkYXRhIGFjY29yZGluZyB0byBhIHByZWRldGVybWluZWQgZm9ybWF0LiBJdCBpbmNsdWRlcyBoYW5kbGluZyBtaXNzaW5nIGRhdGEsIGZpeGluZyBkYXRhIGVycm9ycywgYW5kIHJlbW92aW5nIGFueSBkYXRhIG91dGxpZXJzLiBTb21lIGV4YW1wbGVzIG9mIGRhdGEgc2NydWJiaW5nIGFyZTrCtyANCg0KQ2hhbmdpbmcgYWxsIGRhdGUgdmFsdWVzIHRvIGEgY29tbW9uIHN0YW5kYXJkIGZvcm1hdC7CtyAgDQoNCkZpeGluZyBzcGVsbGluZyBtaXN0YWtlcyBvciBhZGRpdGlvbmFsIHNwYWNlcy7CtyAgDQpGaXhpbmcgbWF0aGVtYXRpY2FsIGluYWNjdXJhY2llcyBvciByZW1vdmluZyBjb21tYXMgZnJvbSBsYXJnZSBudW1iZXJzLg0KDQoqICoqRGF0YSBQcm9jZXNzaW5nIGFuZCBFREEqKg0KDQpEYXRhIGV4cGxvcmF0aW9uIGlzIHByZWxpbWluYXJ5IGRhdGEgYW5hbHlzaXMgdGhhdCBpcyB1c2VkIGZvciBwbGFubmluZyBmdXJ0aGVyIGRhdGEgbW9kZWxpbmcgc3RyYXRlZ2llcy4gRGF0YSBzY2llbnRpc3RzIGdhaW4gYW4gaW5pdGlhbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkYXRhIHVzaW5nIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYW5kIGRhdGEgdmlzdWFsaXphdGlvbiB0b29scy4gVGhlbiB0aGV5IGV4cGxvcmUgdGhlIGRhdGEgdG8gaWRlbnRpZnkgaW50ZXJlc3RpbmcgcGF0dGVybnMgdGhhdCBjYW4gYmUgc3R1ZGllZCBvciBhY3Rpb25lZC4gICAgICANCg0KKiAqKk1vZGVsaW5nIGFuZCoqDQoNClNvZnR3YXJlIGFuZCBtYWNoaW5lIGxlYXJuaW5nIGFsZ29yaXRobXMgYXJlIHVzZWQgdG8gZ2FpbiBkZWVwZXIgaW5zaWdodHMsIHByZWRpY3Qgb3V0Y29tZXMsIGFuZCBwcmVzY3JpYmUgdGhlIGJlc3QgY291cnNlIG9mIGFjdGlvbi4gTWFjaGluZSBsZWFybmluZyB0ZWNobmlxdWVzIGxpa2UgYXNzb2NpYXRpb24sIGNsYXNzaWZpY2F0aW9uLCBhbmQgY2x1c3RlcmluZyBhcmUgYXBwbGllZCB0byB0aGUgdHJhaW5pbmcgZGF0YSBzZXQuIFRoZSBtb2RlbCBtaWdodCBiZSB0ZXN0ZWQgYWdhaW5zdCBwcmVkZXRlcm1pbmVkIHRlc3QgZGF0YSB0byBhc3Nlc3MgcmVzdWx0IGFjY3VyYWN5LiBUaGUgZGF0YSBtb2RlbCBjYW4gYmUgZmluZS10dW5lZCBtYW55IHRpbWVzIHRvIGltcHJvdmUgcmVzdWx0IG91dGNvbWVzLiANCg0KKiAqKlJlcG9ydGluZyBhbmQgRGVwbG95bWVudCoqDQoNCkRhdGEgc2NpZW50aXN0cyB3b3JrIHRvZ2V0aGVyIHdpdGggYW5hbHlzdHMgYW5kIGJ1c2luZXNzZXMgdG8gY29udmVydCBkYXRhIGluc2lnaHRzIGludG8gYWN0aW9uLiBUaGV5IG1ha2UgZGlhZ3JhbXMsIGdyYXBocywgYW5kIGNoYXJ0cyB0byByZXByZXNlbnQgdHJlbmRzIGFuZCBwcmVkaWN0aW9ucy4gRGF0YSBzdW1tYXJpemF0aW9uIGhlbHBzIHN0YWtlaG9sZGVycyB1bmRlcnN0YW5kIGFuZCBpbXBsZW1lbnQgcmVzdWx0cyBlZmZlY3RpdmVseS4NCg0KDQoqICoqTW9uaXRvcmluZyBhbmQgVXBkYXRpbmcqKg0KDQoNCiMjIFRlY2huaWNhbCBUb29scyBmb3IgRGF0YSBTY2llbmNlDQoNCg0KRGF0YSBzY2llbmNlIHByb2Zlc3Npb25hbHMgdXNlIGNvbXB1dGluZyBzeXN0ZW1zIHRvIGZvbGxvdyB0aGUgZGF0YSBzY2llbmNlIHByb2Nlc3MuIFRoZSB0b3AgdGVjaG5pcXVlcyB1c2VkIGJ5IGRhdGEgc2NpZW50aXN0cyBhcmU6DQoNCiogKipDbGFzc2lmaWNhdGlvbioqDQoNCkNsYXNzaWZpY2F0aW9uIGlzIHRoZSBzb3J0aW5nIG9mIGRhdGEgaW50byBzcGVjaWZpYyBncm91cHMgb3IgY2F0ZWdvcmllcy4gQ29tcHV0ZXJzIGFyZSB0cmFpbmVkIHRvIGlkZW50aWZ5IGFuZCBzb3J0IGRhdGEuIEtub3duIGRhdGEgc2V0cyBhcmUgdXNlZCB0byBidWlsZCBkZWNpc2lvbiBhbGdvcml0aG1zIGluIGEgY29tcHV0ZXIgdGhhdCBxdWlja2x5IHByb2Nlc3NlcyBhbmQgY2F0ZWdvcml6ZXMgdGhlIGRhdGEuIEZvciBleGFtcGxlOsK3ICANCg0KU29ydCBwcm9kdWN0cyBhcyBwb3B1bGFyIG9yIG5vdCBwb3B1bGFywrcgIA0KU29ydCBpbnN1cmFuY2UgYXBwbGljYXRpb25zIGFzIGhpZ2ggcmlzayBvciBsb3cgcmlza8K3ICANClNvcnQgc29jaWFsIG1lZGlhIGNvbW1lbnRzIGludG8gcG9zaXRpdmUsIG5lZ2F0aXZlLCBvciBuZXV0cmFsLg0KRGF0YSBzY2llbmNlIHByb2Zlc3Npb25hbHMgdXNlIGNvbXB1dGluZyBzeXN0ZW1zIHRvIGZvbGxvdyB0aGUgZGF0YSBzY2llbmNlIHByb2Nlc3MuIA0KDQoqICoqUmVncmVzc2lvbioqDQoNClJlZ3Jlc3Npb24gaXMgdGhlIG1ldGhvZCBvZiBmaW5kaW5nIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHNlZW1pbmdseSB1bnJlbGF0ZWQgZGF0YSBwb2ludHMuIFRoZSBjb25uZWN0aW9uIGlzIHVzdWFsbHkgbW9kZWxlZCBhcm91bmQgYSBtYXRoZW1hdGljYWwgZm9ybXVsYSBhbmQgcmVwcmVzZW50ZWQgYXMgYSBncmFwaCBvciBjdXJ2ZS4gV2hlbiB0aGUgdmFsdWUgb2Ygb25lIGRhdGEgcG9pbnQgaXMga25vd24sIHJlZ3Jlc3Npb24gaXMgdXNlZCB0byBwcmVkaWN0IHRoZSBvdGhlciBkYXRhIHBvaW50LiBGb3IgZXhhbXBsZTrCtyAgDQoNClRoZSByYXRlIG9mIHNwcmVhZCBvZiBhaXItYm9ybmUgZGlzZWFzZXMuwrcgDQogVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBhbmQgdGhlIG51bWJlciBvZiBlbXBsb3llZXMuwrcgIA0KVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZmlyZSBzdGF0aW9ucyBhbmQgdGhlIG51bWJlciBvZiBpbmp1cmllcyBkdWUgdG8gZmlyZSBpbiBhIHBhcnRpY3VsYXIgbG9jYXRpb24uIA0KDQoqICoqQ2x1c3RlcmluZyoqDQoNCkNsdXN0ZXJpbmcgaXMgdGhlIG1ldGhvZCBvZiBncm91cGluZyBjbG9zZWx5IHJlbGF0ZWQgZGF0YSB0b2dldGhlciB0byBsb29rIGZvciBwYXR0ZXJucyBhbmQgYW5vbWFsaWVzLiBDbHVzdGVyaW5nIGlzIGRpZmZlcmVudCBmcm9tIHNvcnRpbmcgYmVjYXVzZSB0aGUgZGF0YSBjYW5ub3QgYmUgYWNjdXJhdGVseSBjbGFzc2lmaWVkIGludG8gZml4ZWQgY2F0ZWdvcmllcy4gSGVuY2UgdGhlIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIG1vc3QgbGlrZWx5IHJlbGF0aW9uc2hpcHMuIE5ldyBwYXR0ZXJucyBhbmQgcmVsYXRpb25zaGlwcyBjYW4gYmUgZGlzY292ZXJlZCB3aXRoIGNsdXN0ZXJpbmcuIEZvciBleGFtcGxlOiDCtyAgDQoNCkdyb3VwIGN1c3RvbWVycyB3aXRoIHNpbWlsYXIgcHVyY2hhc2UgYmVoYXZpb3IgZm9yIGltcHJvdmVkIGN1c3RvbWVyIHNlcnZpY2UuwrcgIA0KR3JvdXAgbmV0d29yayB0cmFmZmljIHRvIGlkZW50aWZ5IGRhaWx5IHVzYWdlIHBhdHRlcm5zIGFuZCBpZGVudGlmeSBhIG5ldHdvcmsgYXR0YWNrIGZhc3Rlci4gIA0KQ2x1c3RlciBhcnRpY2xlcyBpbnRvIG11bHRpcGxlIGRpZmZlcmVudCBuZXdzIGNhdGVnb3JpZXMgYW5kIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGZpbmQgZmFrZSBuZXdzIGNvbnRlbnQuDQpUaGUgYmFzaWMgcHJpbmNpcGxlIGJlaGluZCBkYXRhIHNjaWVuY2UgdGVjaG5pcXVlcw0KDQpcDQoNCiMjIFdoYXQgRGF0YSBTY2llbmNlIENhbm5vdCBEbz8NCg0KV2hpbGUgZGF0YSBzY2llbmNlIGlzIGEgcG93ZXJmdWwgdG9vbCwgaXQgZG9lcyBoYXZlIGl0cyBsaW1pdGF0aW9ucy4gSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBkYXRhIHNjaWVuY2UgY2Fubm90IGRvOg0KDQoqICoqUmVwbGFjZSBTdWJqZWN0IE1hdHRlciBFeHBlcnRzKio6IERhdGEgc2NpZW5jZSBjYW4gcHJvdmlkZSBpbnNpZ2h0cyBhbmQgaGVscCBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucywgYnV0IGl0IGNhbm5vdCByZXBsYWNlIHRoZSBleHBlcnRpc2UgYW5kIGp1ZGdtZW50IG9mIHN1YmplY3QgbWF0dGVyIGV4cGVydHMuDQoNCiogKipHdWFyYW50ZWUgMTAwJSBBY2N1cmFjeSoqOiBQcmVkaWN0aXZlIG1vZGVscyBpbiBkYXRhIHNjaWVuY2UgYXJlIGJhc2VkIG9uIHByb2JhYmlsaXRpZXMgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGFsd2F5cyAxMDAlIGFjY3VyYXRlLg0KDQoqICoqRWxpbWluYXRlIEJpYXMqKjogSWYgdGhlIGRhdGEgdXNlZCBpbiBkYXRhIHNjaWVuY2UgaXMgYmlhc2VkLCB0aGUgcmVzdWx0cyB3aWxsIGFsc28gYmUgYmlhc2VkLiBEYXRhIHNjaWVudGlzdHMgY2FuIHRyeSB0byBtaW5pbWl6ZSBiaWFzLCBidXQgaXQgY2Fubm90IGJlIGNvbXBsZXRlbHkgZWxpbWluYXRlZC4NCg0KKiAqKlJlcGxhY2UgRGF0YSBQcmVwYXJhdGlvbioqOiBEYXRhIHNjaWVuY2UgY2Fubm90IGJ5cGFzcyB0aGUgZGF0YSBwcmVwYXJhdGlvbiBzdGFnZS4gUmF3IGRhdGEgb2Z0ZW4gbmVlZHMgdG8gYmUgY2xlYW5lZCBhbmQgdHJhbnNmb3JtZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBhbmFseXNpcy4NCg0KKiAqKkF1dG9tYXRlIERhdGEgQ29sbGVjdGlvbioqOiBXaGlsZSBkYXRhIHNjaWVuY2UgY2FuIGFuYWx5emUgYW5kIGRyYXcgaW5zaWdodHMgZnJvbSBkYXRhLCBpdCBjYW5ub3QgYXV0b21hdGUgdGhlIHByb2Nlc3Mgb2YgZGF0YSBjb2xsZWN0aW9uLg0KDQoqICoqU29sdmUgQWxsIFByb2JsZW1zKio6IERhdGEgc2NpZW5jZSBpcyBhIHRvb2wgdGhhdCBjYW4gaGVscCBzb2x2ZSBtYW55IHByb2JsZW1zLCBidXQgbm90IGFsbC4gU29tZSBwcm9ibGVtcyBtYXkgcmVxdWlyZSBvdGhlciBhcHByb2FjaGVzIG9yIHRvb2xzLg0KDQoqICoqV29yayBXaXRob3V0IENsZWFyIEdvYWxzKio6IERhdGEgc2NpZW5jZSBpcyBtb3N0IGVmZmVjdGl2ZSB3aGVuIHRoZXJlIGFyZSBjbGVhciBnb2FscyBhbmQgcXVlc3Rpb25zIHRvIGFuc3dlci4gV2l0aG91dCB0aGVzZSwgaXQgY2FuIGJlIGRpZmZpY3VsdCB0byBleHRyYWN0IG1lYW5pbmdmdWwgaW5zaWdodHMgZnJvbSB0aGUgZGF0YS4NCg0KKiAqKkVuc3VyZSBFdGhpY2FsIFVzZSBvZiBEYXRhKio6IERhdGEgc2NpZW5jZSBpdHNlbGYgY2Fubm90IGVuc3VyZSB0aGUgZXRoaWNhbCB1c2Ugb2YgZGF0YS4gVGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGRhdGEgc2NpZW50aXN0cyBhbmQgdGhlIG9yZ2FuaXphdGlvbiB0aGV5IHdvcmsgZm9yLg0KDQoqICoqRnVuY3Rpb24gV2l0aG91dCBJbmZyYXN0cnVjdHVyZSoqOiBEYXRhIHNjaWVuY2UgcmVxdWlyZXMgYSBjZXJ0YWluIGxldmVsIG9mIGluZnJhc3RydWN0dXJlLCBpbmNsdWRpbmcgZGF0YSBzdG9yYWdlIGFuZCBwcm9jZXNzaW5nIGNhcGFiaWxpdGllcy4NCg0KKiAqKlJlcGxhY2UgSHVtYW4gSW50dWl0aW9uIGFuZCBDcmVhdGl2aXR5Kio6IFdoaWxlIGRhdGEgc2NpZW5jZSBjYW4gcHJvdmlkZSB2YWx1YWJsZSBpbnNpZ2h0cywgaXQgY2Fubm90IHJlcGxhY2UgaHVtYW4gaW50dWl0aW9uIGFuZCBjcmVhdGl2aXR5Lg0KDQoNClwNCg0KIyBUZWNobm9sb2dpZXMgZm9yIERhdGEgU2NpZW5jZQ0KDQpcDQoNCiMjIENvbXB1dGluZyBUZWNobm9sb2dpZXMNCg0KRGF0YSBzY2llbmNlIHByYWN0aXRpb25lcnMgd29yayB3aXRoIGNvbXBsZXggdGVjaG5vbG9naWVzIHN1Y2ggYXM6DQoNCiogKipNTCBUb29scyoqOiBNYWNoaW5lIGxlYXJuaW5nIG1vZGVscyBhbmQgcmVsYXRlZCBzb2Z0d2FyZSBhcmUgdXNlZCBmb3IgcHJlZGljdGl2ZSBhbmQgcHJlc2NyaXB0aXZlIGFuYWx5c2lzLg0KDQoqICoqQ2xvdWQgY29tcHV0aW5nKio6IENsb3VkIHRlY2hub2xvZ2llcyBoYXZlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBhbmQgcHJvY2Vzc2luZyBwb3dlciByZXF1aXJlZCBmb3IgYWR2YW5jZWQgZGF0YSBhbmFseXRpY3MuDQoNCiogKipJbnRlcm5ldCBvZiB0aGluZ3MqKjogSW9UIHJlZmVycyB0byB2YXJpb3VzIGRldmljZXMgdGhhdCBjYW4gYXV0b21hdGljYWxseSBjb25uZWN0IHRvIHRoZSBJbnRlcm5ldC4gVGhlc2UgZGV2aWNlcyBjb2xsZWN0IGRhdGEgZm9yIGRhdGEgc2NpZW5jZSBpbml0aWF0aXZlcy4gVGhleSBnZW5lcmF0ZSBtYXNzaXZlIGRhdGEgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRhdGEgbWluaW5nIGFuZCBkYXRhIGV4dHJhY3Rpb24uDQoNCiogKipIaWdoLVBlcmZvcm1hbmNlIGNvbXB1dGluZyoqOiBRdWFudHVtIGNvbXB1dGVycyBjYW4gcGVyZm9ybSBjb21wbGV4IGNhbGN1bGF0aW9ucyBhdCBoaWdoIHNwZWVkLiBTa2lsbGVkIGRhdGEgc2NpZW50aXN0cyB1c2UgdGhlbSBmb3IgYnVpbGRpbmcgY29tcGxleCBxdWFudGl0YXRpdmUgYWxnb3JpdGhtcy4NCg0KDQpcDQoNCiMjIERhdGEgU2NpZW5jZSBDb21tdW5pY2F0aW9uIFRlY2hub2xvZ2llcw0KDQpEYXRhIFNjaWVuY2UgQ29tbXVuaWNhdGlvbiBpbnZvbHZlcyB0aGUgdXNlIG9mIHZhcmlvdXMgdGVjaG5vbG9naWVzIHRvIGVmZmVjdGl2ZWx5IGNvbW11bmljYXRlIGRhdGEgaW5zaWdodHMuIEhlcmUgYXJlIHNvbWUga2V5IHRlY2hub2xvZ2llcyB1c2VkIGluIHRoaXMgZmllbGQ6DQoNCiogKipEYXRhIFZpc3VhbGl6YXRpb24gVG9vbHMqKg0KDQpUb29scyBsaWtlIFRhYmxlYXUsIE1hdHBsb3RsaWIgaW4gUHl0aG9uLCBhbmQgcmljaCBncmFwaGljYWwgbGlicmFyaWVzIGluIFIgYXJlIHVzZWQgdG8gY3JlYXRlIHZpc3VhbCByZXByZXNlbnRhdGlvbnMgb2YgZGF0YSwgbWFraW5nIGl0IGVhc2llciB0byBpZGVudGlmeSBwYXR0ZXJucywgdHJlbmRzLCBhbmQgaW5zaWdodHMuIFNvbWUgcG93ZXJmdWwgZW1lcmdpbmcgaW50ZXJhY3RpdmUgdGVjaG5vbG9naWVzIGFyZSBhbHNvIGF2YWlsYWJsZSBkdWUgdG8gdGhlIHJlY2VudCBkZXZlbG9wbWVudCBvZiB2YXJpb3VzIHNvZnR3YXJlIHByb2dyYW1zIHN1Y2ggYXMgYHBsb3RseWAgYW5kIGBSU2hpbnlgLiBUaGVzZSBpbnRlcmFjdGl2ZSB0ZWNobm9sb2dpZXMgbWFrZSB2aXN1YWxpemF0aW9uIGFuZCBhbmFseXRpY3MgZWFzaWVyIHRvIGV4dHJhY3QgaGlkZGVuIGluZm9ybWF0aW9uIGZyb20gZGF0YSB0aHJvdWdoIGFuYWx5dGljcy4gIA0KDQoqICoqQ29tcHV0YXRpb25hbCBOb3RlYm9va3MqKg0KDQpSTWFya2Rvd24vUiBOb3RlYm9vayBhbmQgSnVweXRlciBOb3RlYm9vayBhcmUgd2lkZWx5IHVzZWQgZm9yIGRhdGEgc2NpZW5jZSBjb21tdW5pY2F0aW9uLiBUaGV5IGFsbG93IGZvciB0aGUgY3JlYXRpb24gb2YgZG9jdW1lbnRzIHRoYXQgY29tYmluZSBsaXZlIGNvZGUgKHN1Y2ggYXMgUHl0aG9uIG9yIFIpIHdpdGggdmlzdWFsaXphdGlvbnMgYW5kIG5hcnJhdGl2ZSB0ZXh0cy4NCg0KKiAqKk1hcmtkb3duIGFuZCBMYVRlWCoqOiANCg0KTWFya2Rvd24gaXMgdXNlZCBmb3IgZm9ybWF0dGluZyB0ZXh0LCB3aGlsZSBMYVRlWCBpcyB1c2VkIGZvciBjcmVhdGluZyBoaWdoLXF1YWxpdHkgdGVjaG5pY2FsIGFuZCBzY2llbnRpZmljIGRvY3VtZW50YXRpb24uIEJvdGggY2FuIGJlIHVzZWQgaW4gUk1hcmtkb3duL1IgTm90ZWJvb2sgYW5kIEp1cHl0ZXIgTm90ZWJvb2sgdG8gY3JlYXRlIHdlbGwtc3RydWN0dXJlZCwgcmVhZGFibGUgZG9jdW1lbnRzLiBSTWFya2Rvd24gaXMgYWxzbyBhIHBvd2VyZnVsIHdlYiBkZXZlbG9wbWVudCB0b29sIHRvIGdlbmVyYXRlIHdlYi1iYXNlZCByZXBvcnRzIHdpdGggYm90aCBzdGF0aWMgYW5kIGludGVyYWN0aXZlIHZpc3VhbCBjb250ZW50Lg0KDQoqICoqR2l0SHViIC0gVmVyc2lvbiBDb250cm9sIGFuZCBDb2xsYWJvcmF0aW9uKiogDQoNCkdpdEh1YiBpcyBhIHBsYXRmb3JtIGZvciB2ZXJzaW9uIGNvbnRyb2wgYW5kIGNvbGxhYm9yYXRpb24uIEl0IGFsbG93cyBkYXRhIHNjaWVudGlzdHMgdG8gd29yayB0b2dldGhlciBhbmQgc2hhcmUgdGhlaXIgY29kZSBhbmQgbm90ZWJvb2tzLiBJdCBpcyBhbHNvIGNvbnZlbmllbnQgdG8gaG9zdCBzdGF0aWMgd2ViIHBhZ2VzIA0KDQoqICoqUHJlc2VudGF0aW9uIFNvZnR3YXJlIGFuZCB0ZWNobm9sb2dpZXMqKg0KDQpUb29scyBsaWtlIG91ciBvbGQgZnJpZW5kcyBNaWNyb3NvZnQgUG93ZXJQb2ludCBvciBHb29nbGUgU2xpZGVzIGFyZSBvZnRlbiB1c2VkIHRvIHByZXNlbnQgZGF0YSBzY2llbmNlIGZpbmRpbmdzIHRvIG5vbi10ZWNobmljYWwgc3Rha2Vob2xkZXJzLiANCg0KKiAqKlBsYXRmb3JtcyBmb3IgVGVjaG5pY2FsIENvbW11bmljYXRpb24qKg0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBrZXkgZWxlbWVudHMgb2YgdGVjaG5pY2FsIGNvbW11bmljYXRpb24gdGhhdCByZXF1aXJlIGludGVncmF0aW5nIGRpZmZlcmVudCBwbGF0Zm9ybXMgdG8gYWNjb21wbGlzaCBlZmZlY3RpdmUgdGVjaG5pY2FsIGNvbW11bmljYXRpb24uDQoNCioqQ2xhcml0eSBhbmQgQ29uY2lzZW5lc3MqKjogVGVjaG5pY2FsIGNvbW11bmljYXRpb24gYWltcyB0byBtYWtlIGNvbXBsZXggaW5mb3JtYXRpb24gY2xlYXIgYW5kIGVhc2lseSB1bmRlcnN0YW5kYWJsZSBmb3IgdGhlIHRhcmdldCBhdWRpZW5jZS4gVGhpcyBpbnZvbHZlcyB1c2luZyBzdHJhaWdodGZvcndhcmQgbGFuZ3VhZ2UsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGphcmdvbiwgYW5kIG9yZ2FuaXppbmcgaW5mb3JtYXRpb24gbG9naWNhbGx5IHRvIGNvbnZleSBpbmZvcm1hdGlvbiBlZmZpY2llbnRseS4NCg0KKipQdXJwb3NlKio6IFRlY2huaWNhbCBjb21tdW5pY2F0aW9uIHNlcnZlcyB2YXJpb3VzIHB1cnBvc2VzLCBzdWNoIGFzIGluZm9ybWluZywgaW5zdHJ1Y3RpbmcsIHBlcnN1YWRpbmcsIG9yIGRvY3VtZW50aW5nLiBUaGUgcHVycG9zZSBndWlkZXMgdGhlIHN0cnVjdHVyZSBhbmQgY29udGVudCBvZiB0aGUgY29tbXVuaWNhdGlvbi4NCg0KKipEb2N1bWVudCBEZXNpZ24qKjogRWZmZWN0aXZlIHRlY2huaWNhbCBjb21tdW5pY2F0aW9uIG9mdGVuIGludm9sdmVzIHRob3VnaHRmdWwgZG9jdW1lbnQgZGVzaWduLiBUaGlzIGluY2x1ZGVzIHRoZSB1c2Ugb2YgaGVhZGluZ3MsIGxpc3RzLCBncmFwaGljcywgYW5kIG90aGVyIHZpc3VhbCBlbGVtZW50cyB0byBlbmhhbmNlIGNvbXByZWhlbnNpb24gYW5kIG1ha2UgdGhlIGluZm9ybWF0aW9uIG1vcmUgYWNjZXNzaWJsZS4NCg0KKipNZWRpdW0gU2VsZWN0aW9uKio6IFRlY2huaWNhbCBjb21tdW5pY2F0aW9uIGNhbiB0YWtlIHZhcmlvdXMgZm9ybXMsIGluY2x1ZGluZyB3cml0dGVuIGRvY3VtZW50cywgcHJlc2VudGF0aW9ucywgdmlkZW9zLCBhbmQgaW50ZXJhY3RpdmUgY29udGVudC4gQ2hvb3NpbmcgdGhlIGFwcHJvcHJpYXRlIG1lZGl1bSBmb3IgdGhlIG1lc3NhZ2UgYW5kIGF1ZGllbmNlIGlzIGNydWNpYWwuDQoNClBsYXRmb3JtcyBsaWtlIFNsYWNrIG9yIE1pY3Jvc29mdCBUZWFtcyBhcmUgdXNlZCBmb3IgcmVhbC10aW1lIGNvbW11bmljYXRpb24gd2l0aGluIGEgZGF0YSBzY2llbmNlIHRlYW0uIE90aGVyIHBsYXRmb3JtcyBzdWNoIGFzIEdpdEh1YiwgQW5hY29uZGEsIFJTdHVkaW8sIFNBUyBWaXlhLCBldGMuIGFyZSAgICANCg0KDQoqICoqRGF0YSBTY2llbmNlIFBsYXRmb3JtcyoqDQoNCkEgZGF0YSBzY2llbmNlIHBsYXRmb3JtIGlzIGEgc29mdHdhcmUgc29sdXRpb24gdGhhdCBlbmFibGVzIGRhdGEgc2NpZW50aXN0cyB0byBlZmZlY3RpdmVseSBwbGFuIHN0cmF0ZWdpZXMsIGRpc2NvdmVyIGFjdGlvbmFibGUgaW5zaWdodHMgZnJvbSBpbnRlcnByZXRpbmcgZGF0YSwgYW5kIGNvbW11bmljYXRlIHRoZWlyIGluc2lnaHRzIGFjcm9zcyB0aGUgZW50aXJlIG9yZ2FuaXphdGlvbuKAlGFsbCB3aXRoaW4gYSBzaW5nbGUgZW52aXJvbm1lbnQuIFRoZXkgYWxzbyBhbGxvdyBmb3IgY29sbGFib3JhdGl2ZSBkYXRhIHNjaWVuY2Ugd29yayBhbmQgaW5jbHVkZSBmZWF0dXJlcyBmb3Igc2hhcmluZyBhbmQgcHJlc2VudGluZyBkYXRhIHNjaWVuY2UgcmVzdWx0cy4gUG9wdWxhciBwbGF0Zm9ybXMgaW5jbHVkZSBBV1MgU2FnZSBNYWtlciwgTWljcm9zb2Z0IEF6dXJlIE1MLCBBbmFjb25kYSwgZXRjLiANCg0KXA0KDQojIEZpZWxkcyBSZWxhdGVkIHRvIERhdGEgU2NpZW5jZQ0KDQpEYXRhIHNjaWVuY2UgaXMgYW4gYWxsLWVuY29tcGFzc2luZyB0ZXJtIGZvciBvdGhlciBkYXRhLXJlbGF0ZWQgcm9sZXMgYW5kIGZpZWxkcy4gV2UgbG9vayBhdCBicmllZmx5IHRoZXNlIGFyZWFzLiBJbiBhZGRpdGlvbiwgd2UgYWxzbyBwb2ludCBvdXQgc29tZSBvZiB0aGUgY2hhbGxlbmdlcyBhbmQgc29tZSBNTC1zcGVjaWZpYyB0b29scy4NCg0KXA0KDQojIyBEYXRhIFNjaWVuY2UgYW5kIFJlbGF0ZWQgQXJlYXMNCg0KV2UgaGF2ZSBtZW50aW9uZWQgdGhhdCBkYXRhIHNjaWVuY2UgYXMgYW4gZW1lcmdpbmcgbXVsdGlkaXNjaXBsaW5hcnkgZmllbGQgaXMgYnVpbHQgb24gZm91ciBwaWxsYXJzOiBNYXRoZW1hdGljcyBhbmQgU3RhdGlzdGljcywgQ29tcHV0YXRpb25hbCBTY2llbmNlIChkYXRhYmFzZXMgYW5kIHByb2dyYW1taW5nKSwgaW50ZXJhY3RpdmUgdGVjaG5vbG9naWVzIGFuZCBzdHJhdGVnaWVzIGZvciBjb21tdW5pY2F0aW9uLCBhbmQgZG9tYWluIGtub3dsZWRnZS4gV2UgbmV4dCBicmllZmx5IGRlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkYXRhIHNjaWVuY2UgYW5kIHRoZSByZWxhdGVkIGZpZWxkcy4gDQoNCiogKmRhdGEgc2NpZW5jZSBhbmQgZGF0YSBhbmFseXRpY3MqDQoNCldoaWxlIHRoZSB0ZXJtcyBtYXkgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHksIGRhdGEgYW5hbHl0aWNzIGlzIGEgc3Vic2V0IG9mIGRhdGEgc2NpZW5jZS4gRGF0YSBzY2llbmNlIGlzIGFuIHVtYnJlbGxhIHRlcm0gZm9yIGFsbCBhc3BlY3RzIG9mIGRhdGEgcHJvY2Vzc2luZ+KAlGZyb20gdGhlIGNvbGxlY3Rpb24gdG8gbW9kZWxpbmcgdG8gaW5zaWdodHMuIE9uIHRoZSBvdGhlciBoYW5kLCBkYXRhIGFuYWx5dGljcyBpcyBtYWlubHkgY29uY2VybmVkIHdpdGggc3RhdGlzdGljcywgbWF0aGVtYXRpY3MsIGFuZCBzdGF0aXN0aWNhbCBhbmFseXNpcy4gSXQgZm9jdXNlcyBvbiBvbmx5IGRhdGEgYW5hbHlzaXMsIHdoaWxlIGRhdGEgc2NpZW5jZSBpcyByZWxhdGVkIHRvIHRoZSBiaWdnZXIgcGljdHVyZSBhcm91bmQgb3JnYW5pemF0aW9uYWwgZGF0YS4gSW4gbW9zdCB3b3JrcGxhY2VzLCBkYXRhIHNjaWVudGlzdHMgYW5kIGRhdGEgYW5hbHlzdHMgd29yayB0b2dldGhlciB0b3dhcmRzIGNvbW1vbiBidXNpbmVzcyBnb2Fscy4gQSBkYXRhIGFuYWx5c3QgbWF5IHNwZW5kIG1vcmUgdGltZSBvbiByb3V0aW5lIGFuYWx5c2lzLCBwcm92aWRpbmcgcmVndWxhciByZXBvcnRzLiBBIGRhdGEgc2NpZW50aXN0IG1heSBkZXNpZ24gdGhlIHdheSBkYXRhIGlzIHN0b3JlZCwgbWFuaXB1bGF0ZWQsIGFuZCBhbmFseXplZC4gU2ltcGx5IHB1dCwgYSBkYXRhIGFuYWx5c3QgbWFrZXMgc2Vuc2Ugb3V0IG9mIGV4aXN0aW5nIGRhdGEsIHdoZXJlYXMgYSBkYXRhIHNjaWVudGlzdCBjcmVhdGVzIG5ldyBtZXRob2RzIGFuZCB0b29scyB0byBwcm9jZXNzIGRhdGEgZm9yIHVzZSBieSBhbmFseXN0cy4NCg0KKiAqZGF0YSBzY2llbmNlIGFuZCBidXNpbmVzcyBhbmFseXRpY3MqDQoNCldoaWxlIHRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiBkYXRhIHNjaWVuY2UgYW5kIGJ1c2luZXNzIGFuYWx5dGljcywgdGhlIGtleSBkaWZmZXJlbmNlIGlzIHRoZSB1c2Ugb2YgdGVjaG5vbG9neSBpbiBlYWNoIGZpZWxkLiBEYXRhIHNjaWVudGlzdHMgd29yayBtb3JlIGNsb3NlbHkgd2l0aCBkYXRhIHRlY2hub2xvZ3kgdGhhbiBidXNpbmVzcyBhbmFseXN0cy4gQnVzaW5lc3MgYW5hbHlzdHMgYnJpZGdlIHRoZSBnYXAgYmV0d2VlbiBidXNpbmVzcyBhbmQgSVQuIFRoZXkgZGVmaW5lIGJ1c2luZXNzIGNhc2VzLCBjb2xsZWN0IGluZm9ybWF0aW9uIGZyb20gc3Rha2Vob2xkZXJzLCBvciB2YWxpZGF0ZSBzb2x1dGlvbnMuIERhdGEgc2NpZW50aXN0cywgb24gdGhlIG90aGVyIGhhbmQsIHVzZSB0ZWNobm9sb2d5IHRvIHdvcmsgd2l0aCBidXNpbmVzcyBkYXRhLiBUaGV5IG1heSB3cml0ZSBwcm9ncmFtcywgYXBwbHkgbWFjaGluZSBsZWFybmluZyB0ZWNobmlxdWVzIHRvIGNyZWF0ZSBtb2RlbHMgYW5kIGRldmVsb3AgbmV3IGFsZ29yaXRobXMuIERhdGEgc2NpZW50aXN0cyBub3Qgb25seSB1bmRlcnN0YW5kIHRoZSBwcm9ibGVtIGJ1dCBjYW4gYWxzbyBidWlsZCBhIHRvb2wgdGhhdCBwcm92aWRlcyBzb2x1dGlvbnMgdG8gdGhlIHByb2JsZW0uIEl04oCZcyBub3QgdW51c3VhbCB0byBmaW5kIGJ1c2luZXNzIGFuYWx5c3RzIGFuZCBkYXRhIHNjaWVudGlzdHMgd29ya2luZyBvbiB0aGUgc2FtZSB0ZWFtLiBCdXNpbmVzcyBhbmFseXN0cyB0YWtlIHRoZSBvdXRwdXQgZnJvbSBkYXRhIHNjaWVudGlzdHMgYW5kIHVzZSBpdCB0byB0ZWxsIGEgc3RvcnkgdGhhdCB0aGUgYnJvYWRlciBidXNpbmVzcyBjYW4gdW5kZXJzdGFuZC4NCg0KKiAqZGF0YSBzY2llbmNlIGFuZCBkYXRhIGVuZ2luZWVyaW5nKg0KDQpEYXRhIGVuZ2luZWVycyBidWlsZCBhbmQgbWFpbnRhaW4gdGhlIHN5c3RlbXMgdGhhdCBhbGxvdyBkYXRhIHNjaWVudGlzdHMgdG8gYWNjZXNzIGFuZCBpbnRlcnByZXQgZGF0YS4gVGhleSB3b3JrIG1vcmUgY2xvc2VseSB3aXRoIHVuZGVybHlpbmcgdGVjaG5vbG9neSB0aGFuIGEgZGF0YSBzY2llbnRpc3QuIFRoZSByb2xlIGdlbmVyYWxseSBpbnZvbHZlcyBjcmVhdGluZyBkYXRhIG1vZGVscywgYnVpbGRpbmcgZGF0YSBwaXBlbGluZXMsIGFuZCBvdmVyc2VlaW5nIGV4dHJhY3QsIHRyYW5zZm9ybSwgYW5kIGxvYWQgKEVUTCkuIERlcGVuZGluZyBvbiB0aGUgb3JnYW5pemF0aW9uJ3Mgc2V0dXAgYW5kIHNpemUsIHRoZSBkYXRhIGVuZ2luZWVyIG1heSBhbHNvIG1hbmFnZSByZWxhdGVkIGluZnJhc3RydWN0dXJlIGxpa2UgYmlnLWRhdGEgc3RvcmFnZSwgc3RyZWFtaW5nLCBhbmQgcHJvY2Vzc2luZyBwbGF0Zm9ybXMgbGlrZSBBbWF6b24gUzMuRGF0YSBzY2llbnRpc3RzIHVzZSB0aGUgZGF0YSB0aGF0IGRhdGEgZW5naW5lZXJzIGhhdmUgcHJvY2Vzc2VkIHRvIGJ1aWxkIGFuZCB0cmFpbiBwcmVkaWN0aXZlIG1vZGVscy4gRGF0YSBzY2llbnRpc3RzIG1heSB0aGVuIGhhbmQgb3ZlciB0aGUgcmVzdWx0cyB0byB0aGUgYW5hbHlzdHMgZm9yIGZ1cnRoZXIgZGVjaXNpb24tbWFraW5nLg0KDQoqICpkYXRhIHNjaWVuY2UgYW5kIG1hY2hpbmUgbGVhcm5pbmcqDQoNCk1hY2hpbmUgbGVhcm5pbmcgaXMgdGhlIHNjaWVuY2Ugb2YgdHJhaW5pbmcgbWFjaGluZXMgdG8gYW5hbHl6ZSBhbmQgbGVhcm4gZnJvbSBkYXRhIHRoZSB3YXkgaHVtYW5zIGRvLiBJdCBpcyBvbmUgb2YgdGhlIG1ldGhvZHMgdXNlZCBpbiBkYXRhIHNjaWVuY2UgcHJvamVjdHMgdG8gZ2FpbiBhdXRvbWF0ZWQgaW5zaWdodHMgZnJvbSBkYXRhLiBNYWNoaW5lIGxlYXJuaW5nIGVuZ2luZWVycyBzcGVjaWFsaXplIGluIGNvbXB1dGluZywgYWxnb3JpdGhtcywgYW5kIGNvZGluZyBza2lsbHMgc3BlY2lmaWMgdG8gbWFjaGluZSBsZWFybmluZyBtZXRob2RzLiBEYXRhIHNjaWVudGlzdHMgbWlnaHQgdXNlIG1hY2hpbmUgbGVhcm5pbmcgbWV0aG9kcyBhcyBhIHRvb2wgb3Igd29yayBjbG9zZWx5IHdpdGggb3RoZXIgbWFjaGluZSBsZWFybmluZyBlbmdpbmVlcnMgdG8gcHJvY2VzcyBkYXRhLg0KDQoqICpkYXRhIHNjaWVuY2UgYW5kIHN0YXRpc3RpY3MqDQoNClN0YXRpc3RpY3MgaXMgYSBtYXRoZW1hdGljYWxseS1iYXNlZCBmaWVsZCB0aGF0IHNlZWtzIHRvIGNvbGxlY3QgYW5kIGludGVycHJldCBxdWFudGl0YXRpdmUgZGF0YS4gSW4gY29udHJhc3QsIGRhdGEgc2NpZW5jZSBpcyBhIG11bHRpZGlzY2lwbGluYXJ5IGZpZWxkIHRoYXQgdXNlcyBzY2llbnRpZmljIG1ldGhvZHMsIHByb2Nlc3NlcywgYW5kIHN5c3RlbXMgdG8gZXh0cmFjdCBrbm93bGVkZ2UgZnJvbSBkYXRhIGluIHZhcmlvdXMgZm9ybXMuIERhdGEgc2NpZW50aXN0cyB1c2UgbWV0aG9kcyBmcm9tIG1hbnkgZGlzY2lwbGluZXMsIGluY2x1ZGluZyBzdGF0aXN0aWNzLiBIb3dldmVyLCB0aGUgZmllbGRzIGRpZmZlciBpbiB0aGVpciBwcm9jZXNzZXMgYW5kIHRoZSBwcm9ibGVtcyB0aGV5IHN0dWR5LiAgDQoNCg0KIyMgRGF0YSBTY2llbmNlIFRvb2xzIG9uIEFXUw0KDQpBV1MgaGFzIGEgcmFuZ2Ugb2YgdG9vbHMgdG8gc3VwcG9ydCBkYXRhIHNjaWVudGlzdHMgYXJvdW5kIHRoZSBnbG9iZToNCg0KIyMjICpEYXRhIHN0b3JhZ2UqDQoNCkZvciBkYXRhIHdhcmVob3VzaW5nLCAqKkFtYXpvbiBSZWRzaGlmdCoqIGNhbiBydW4gY29tcGxleCBxdWVyaWVzIGFnYWluc3Qgc3RydWN0dXJlZCBvciB1bnN0cnVjdHVyZWQgZGF0YS4gQW5hbHlzdHMgYW5kIGRhdGEgc2NpZW50aXN0cyBjYW4gdXNlIEFXUyBHbHVlIHRvIG1hbmFnZSBhbmQgc2VhcmNoIGZvciBkYXRhLiBBV1MgR2x1ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSB1bmlmaWVkIGNhdGFsb2cgb2YgYWxsIGRhdGEgaW4gdGhlIGRhdGEgbGFrZSwgd2l0aCBtZXRhZGF0YSBhdHRhY2hlZCB0byBtYWtlIGl0IGRpc2NvdmVyYWJsZS4NCg0KIyMjICpNYWNoaW5lIGxlYXJuaW5nKg0KDQoqKkFtYXpvbiBTYWdlTWFrZXIqKiBpcyBhIGZ1bGx5LW1hbmFnZWQgbWFjaGluZSBsZWFybmluZyBzZXJ2aWNlIHRoYXQgcnVucyBvbiB0aGUgKipBbWF6b24gRWxhc3RpYyBDb21wdXRlIENsb3VkIChFQzIpKiouIEl0IGFsbG93cyB1c2VycyB0byBvcmdhbml6ZSBkYXRhLCBidWlsZCwgdHJhaW4sIGFuZCBkZXBsb3kgbWFjaGluZSBsZWFybmluZyBtb2RlbHMsIGFuZCBzY2FsZSBvcGVyYXRpb25zLg0KDQojIyMgKkFuYWx5dGljcyoNCg0KKipBbWF6b24gQXRoZW5hKiogaXMgYW4gaW50ZXJhY3RpdmUgcXVlcnkgc2VydmljZSB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gYW5hbHl6ZSBkYXRhIGluICoqQW1hem9uIFMzKiogb3IgR2xhY2llci4gSXQgaXMgZmFzdCwgc2VydmVybGVzcywgYW5kIHdvcmtzIHVzaW5nIHN0YW5kYXJkIFNRTCBxdWVyaWVzLg0KDQoqKkFtYXpvbiBFbGFzdGljIE1hcFJlZHVjZSAoRU1SKSoqIHByb2Nlc3NlcyBiaWcgZGF0YSB1c2luZyBzZXJ2ZXJzIGxpa2UgU3BhcmsgYW5kIEhhZG9vcC4NCg0KKipBbWF6b24gS2luZXNpcyoqIGFsbG93cyBhZ2dyZWdhdGlvbiBhbmQgcHJvY2Vzc2luZyBvZiBzdHJlYW1pbmcgZGF0YSBpbiByZWFsIHRpbWUuIEl0IHVzZXMgd2Vic2l0ZSBjbGlja3N0cmVhbXMsIGFwcGxpY2F0aW9uIGxvZ3MsIGFuZCB0ZWxlbWV0cnkgZGF0YSBmcm9tIElvVCBkZXZpY2VzLiANCiANCioqQW1hem9uIE9wZW5TZWFyY2gqKiBhbGxvd3Mgc2VhcmNoLCBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24gb2YgcGV0YWJ5dGVzIG9mIGRhdGEuDQoNCg0KDQoNCiMjIERhdGEgU2NpZW5jZSBjaGFsbGVuZ2VzDQoNCg0KKiAqTXVsdGlwbGUgZGF0YSBzb3VyY2VzKg0KDQpEaWZmZXJlbnQgdHlwZXMgb2YgYXBwcyBhbmQgdG9vbHMgZ2VuZXJhdGUgZGF0YSBpbiB2YXJpb3VzIGZvcm1hdHMuIERhdGEgc2NpZW50aXN0cyBoYXZlIHRvIGNsZWFuIGFuZCBwcmVwYXJlIGRhdGEgdG8gbWFrZSBpdCBjb25zaXN0ZW50LiBUaGlzIGNhbiBiZSB0ZWRpb3VzIGFuZCB0aW1lLWNvbnN1bWluZy4NCg0KKiAqVW5kZXJzdGFuZGluZyB0aGUgYnVzaW5lc3MgcHJvYmxlbSoNCg0KRGF0YSBzY2llbnRpc3RzIGhhdmUgdG8gd29yayB3aXRoIG11bHRpcGxlIHN0YWtlaG9sZGVycyBhbmQgYnVzaW5lc3MgbWFuYWdlcnMgdG8gZGVmaW5lIHRoZSBwcm9ibGVtIHRvIGJlIHNvbHZlZC4gVGhpcyBjYW4gYmUgY2hhbGxlbmdpbmfigJRlc3BlY2lhbGx5IGluIGxhcmdlIGNvbXBhbmllcyB3aXRoIG11bHRpcGxlIHRlYW1zIHRoYXQgaGF2ZSB2YXJ5aW5nIHJlcXVpcmVtZW50cy4NCg0KKiAqRWxpbWluYXRpb24gb2YgYmlhcyoNCg0KTWFjaGluZSBsZWFybmluZyB0b29scyBhcmUgbm90IGNvbXBsZXRlbHkgYWNjdXJhdGUsIGFuZCBzb21lIHVuY2VydGFpbnR5IG9yIGJpYXMgY2FuIGV4aXN0IGFzIGEgcmVzdWx0LiBCaWFzZXMgYXJlIGltYmFsYW5jZXMgaW4gdGhlIHRyYWluaW5nIGRhdGEgb3IgcHJlZGljdGlvbiBiZWhhdmlvciBvZiB0aGUgbW9kZWwgYWNyb3NzIGRpZmZlcmVudCBncm91cHMsIHN1Y2ggYXMgYWdlIG9yIGluY29tZSBicmFja2V0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSB0b29sIGlzIHRyYWluZWQgcHJpbWFyaWx5IG9uIGRhdGEgZnJvbSBtaWRkbGUtYWdlZCBpbmRpdmlkdWFscywgaXQgbWF5IGJlIGxlc3MgYWNjdXJhdGUgd2hlbiBtYWtpbmcgcHJlZGljdGlvbnMgaW52b2x2aW5nIHlvdW5nZXIgYW5kIG9sZGVyIHBlb3BsZS4gVGhlIGZpZWxkIG9mIG1hY2hpbmUgbGVhcm5pbmcgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gYWRkcmVzcyBiaWFzZXMgYnkgZGV0ZWN0aW5nIHRoZW0gYW5kIG1lYXN1cmluZyB0aGVtIGluIHRoZSBkYXRhIGFuZCBtb2RlbC4NCg==