Note:
-An R Notebook is an R Markdown document with chunks that can be executed independently and interactively, with output visible immediately beneath the input.
-Notebook output are available as HTML, PDF, Word, or Latex.
-This Notebook as HTML is preferably open with Google Chrome.
-R-Code can be extracted as Rmd file under the button “Code” in the notebook.
-This Notebook using iterative development. It means the process starts with a simple implementation of a small set of idea requirements and iteratively enhances the evolving versions until the complete version is implemented and perfect.
Glossary:
- BI-> Business Intelligence
- DBMS-> Database Management System
- RDBMS-> Relational Database Management System
- SQL-> Structured Query Language
- OLTP-> Online Transactional Processing. OLTP typically involves inserting, updating, and/or deleting small amounts of data in a database.
- OLAP-> Online analytical processing.
Overview
1. References:
- Feel free
- This modul (only for test)
2. Methods: ENJOY THE MOMENT
3. Tools:
- Trello Apps-> please Sign up the Trello (trello.com or App Store: Trello)
- Who is the admin? as a gift: 5% additional point
4. Contents:
- Lectures
- Data lab (implementation of software)
- MEQA (Mock Exams Questions and Answers)
- Test-> one BI project 50% + (Multiple Choice AND/OR Explanation Test AND/OR Use Case) 50%
- One optional BI project (10%)
5. Software: (On Premises & Cloud)
Note! The biggest difference between these two systems is how they are deployed. Cloud-based software is hosted on the vendor’s servers and accessed through a web browser. On-premise software is installed locally, on a company’s own computers and servers.
- Excel Business Inteligence
- Power BI
- Tableau
- Pentaho
- Sisense
- Alteryx
- Looker
- Oracle BI
- MySQL BI
- Microsoft SQL Server
- SAP BI
- MicroStrategy
- TIBCO Spotfire
- Domo BI
- QlickView
- SAS BI
- Klipfolio
- Geckoboard
- Hadoop
- Jaspersoft
- Zoho Analytics
- PostgreSQL
- IBM Db2
- Mongo DB . . .etc
6. We need data!
7. Extras:
- How to choose the one that fit our needs!
- Focus on Your Business
- Analyze Your Needs
- Do Research
- Don’t Scrimp
- Ask for Help
- Customize Apps for Your Needs
- Integrate Everything
- Get Everyone Onboard
- Communicate, Communicate, Communicate
- Share Your Favorite Software
- Anybody wants to get certificate? (optional)
- https://www.edx.org/
- https://www.lynda.com/
- https://www.udacity.com/
- https://www.udemy.com/
- https://cognitiveclass.ai/
Database
What is a Data?
Data is a collection of facts, such as numbers, words, measurements, observations or even just descriptions of things.
In general, data is any set of characters that is gathered and translated for some purpose, usually analysis. It can be any character, including text and numbers, pictures, sound, or video. If data is not put into context, it doesn’t do anything to a human or computer.
Data can be qualitative or quantitative. Put simply: Discrete data is counted, Continuous data is measured.
- Qualitative data is descriptive information (it describes something)
- Quantitative data is numerical information (numbers)-> Discrete(5,6,10); Continuous (3,14)
Example: What do we know about Indonesia’s flag, length=width 10 cm, white and red color?
What is a Database?
A database is a collection of related data which represents some aspect of the real world. A database system is designed to be built and populated with data for a certain task.
A database is an electronic administration system that has to handle large amounts of data efficiently, without contradiction, permanently and can represent logical relationships digitally.
A database is an organized collection of structured information, or data, typically stored electronically in a computer system. A database is usually controlled by a database management system (DBMS). Together, the data and the DBMS, along with the applications that are associated with them, are referred to as a database system, often shortened to just database.
Data within the most common types of databases in operation today is typically modeled in rows and columns in a series of tables to make processing and data querying efficient. The data can then be easily accessed, managed, modified, updated, controlled, and organized. Most databases use structured query language (SQL) for writing and querying data.
A database typically requires a comprehensive database software program known as a database management system (DBMS). A DBMS serves as an interface between the database and its end users or programs, allowing users to retrieve, update, and manage how the information is organized and optimized. A DBMS also facilitates oversight and control of databases, enabling a variety of administrative operations such as performance monitoring, tuning, and backup and recovery. Some examples of popular database software or DBMSs include MySQL, Microsoft Access, Microsoft SQL Server, FileMaker Pro, Oracle Database, and dBASE.
What Is Structured Query Language (SQL)?
- SQL is a programming language used by nearly all relational databases to query, manipulate, and define data, and to provide access control. SQL was first developed at IBM in the 1970s with Oracle as a major contributor, which led to implementation of the SQL ANSI standard, SQL has spurred many extensions from companies such as IBM, Oracle, and Microsoft. Although SQL is still widely used today, new programming languages are beginning to appear (example: NoSQL).
What’s the Difference Between a Database and a Spreadsheet?
Databases and spreadsheets (such as Microsoft Excel) are both convenient ways to store information. The primary differences between the two are:
- How the data is stored and manipulated
- Who can access the data
- How much data can be stored
Spreadsheets were originally designed for one user, and their characteristics reflect that. They’re great for a single user or small number of users who don’t need to do a lot of incredibly complicated data manipulation. Databases, on the other hand, are designed to hold much larger collections of organized information-massive amounts, sometimes. Databases allow multiple users at the same time to quickly and securely access and query the data using highly complex logic and language.
What is DBMS?
- Database Management System (also known as DBMS) is a software for storing and retrieving users’ data by considering appropriate security measures. It allows users to create their own databases as per their requirement.
- It consists of a group of programs which manipulate the database and provide an interface between the database. It includes the user of the database and other application programs.
- The DBMS accepts the request for data from an application and instructs the operating system to provide the specific data. In large systems, a DBMS helps users and other third-party software to store and retrieve data.
- A database typically requires a comprehensive database software program known as a database management system (DBMS). A DBMS serves as an interface between the database and its end users or programs, allowing users to retrieve, update, and manage how the information is organized and optimized. A DBMS also facilitates oversight and control of databases, enabling a variety of administrative operations such as performance monitoring, tuning, and backup and recovery.
- Some examples of popular database software or DBMSs include MySQL, Microsoft Access, Microsoft SQL Server, FileMaker Pro, Oracle Database, and dBASE.
Example of a DBMS (exactly: RDBMS, see on the types of databases)
Let us see a simple example of Unsub database. This database is maintaining information concerning students, courses, and grades in a university environment. The database is organized as five files:
- The STUDENT file stores data of each student
- The COURSE file stores contain data on each course.
- The GRADE file stores the grades which students receive in the various sections
- The TUTOR file contains information about each tutor.
->To define a database system:
We need to specify the structure of the records of each file by defining the different types of data elements to be stored in each record.
We can also use a coding scheme to represent the values of a data item.
Basically, your Database will have 5 tables with a foreign key defined amongst the various tables.
->Example: Create the Unsub database with the following data (see the above pict. as example)
STUDENT: A, B, C, D, E
COURSE: Math, Bio, Art, BI, Data
GRADE: 100, 90, 80, 50, 95
TUTOR: F, G, H, I, J
History of DBMS
Here, are the important landmarks from the history:
- 1960 - Charles Bachman designed first DBMS system
- 1970 - Codd introduced IBM’S Information Management System (IMS)
- 1976- Peter Chen coined and defined the Entity-relationship model also know as the ER model
- 1980 - Relational Model becomes a widely accepted database component
- 1985- Object-oriented DBMS develops.
- 1990s- Incorporation of object-orientation in relational DBMS.
- 1991- Microsoft ships MS access, a personal DBMS and that displaces all other personal DBMS products.
- 1995: First Internet database applications
- 1997: XML applied to database processing. Many vendors begin to integrate XML into DBMS products.
- 2000s: New interactive applications were developed for PDAs, point-of-sale transactions, and consolidation of vendors. Presently, the three leading database companies in the western world are Microsoft, IBM, and Oracle.
- Today, databases are everywhere and are used to enhance our day-to-day life. From personal cloud storage to predicting the weather, many of the services we utilize today are possible due to databases. Presently, there are many new players in the non-relational database space offering specific solutions. Some of the current relational databases include giants such as Oracle, MySQL, and DB2.
The boom in unstructured data that the world has seen in the last few years is one of the main reasons relational databases are no longer sufficient for many companies’ needs. It comes up non-relational database (not in this lecture!).
Characteristics of Database Management System
- Provides security and removes redundancy
- Self-describing nature of a database system
- Insulation between programs and data abstraction
- Support of multiple views of the data
- Sharing of data and multiuser transaction processing
- DBMS allows entities and relations among them to form tables.
- It follows the ACID concept ( Atomicity, Consistency, Isolation, and Durability).
- DBMS supports multi-user environment that allows users to access and manipulate data in parallel.
DBMS vs. Flat File
Popular DBMS Software
Here, is the list of some popular DBMS system:
- MySQL
- Microsoft Access
- Oracle
- PostgreSQL
- dBASE
- FoxPro
- SQLite
- IBM DB2
- LibreOffice Base
- MariaDB
- Microsoft SQL Server etc.
Application of DBMS
Types of Databases
There are many different types of databases. The best database for a specific organization depends on how the organization intends to use the data.
- Relational databases. Relational databases became dominant in the 1980s. Items in a relational database are organized as a set of tables with columns and rows. Relational database technology provides the most efficient and flexible way to access structured information.
- Object-oriented databases. Information in an object-oriented database is represented in the form of objects, as in object-oriented programming. Object oriented data model is one of the developed data model and this can hold the audio, video and graphic files.
- Distributed databases. A distributed database consists of two or more files located in different sites. The database may be stored on multiple computers, located in the same physical location, or scattered over different networks. See also distributed computing or distributed system on big data!
- Data warehouses. A central repository for data, a data warehouse is a type of database specifically designed for fast query and analysis.
- NoSQL databases. A NoSQL, or nonrelational database, allows unstructured and semistructured data to be stored and manipulated (in contrast to a relational database, which defines how all data inserted into the database must be composed). NoSQL databases grew popular as web applications became more common and more complex.
- Graph databases. A graph database stores data in terms of entities and the relationships between entities.
- OLTP databases. An OLTP database is a speedy, analytic database designed for large numbers of transactions performed by multiple users.
These are only a few of the several dozen types of databases in use today. Other, less common databases are tailored to very specific scientific, financial, or other functions. In addition to the different database types, changes in technology development approaches and dramatic advances such as the cloud and automation are propelling databases in entirely new directions. Some of the latest databases include
- Open source databases. An open source database system is one whose source code is open source; such databases could be SQL or NoSQL databases.
- Cloud databases. A cloud database is a collection of data, either structured or unstructured, that resides on a private, public, or hybrid cloud computing platform. There are two types of cloud database models: traditional and database as a service (DBaaS). With DBaaS, administrative tasks and maintenance are performed by a service provider.
- Multimodel database. Multimodel databases combine different types of database models into a single, integrated back end. This means they can accommodate various data types.
- Document/JSON database. Designed for storing, retrieving, and managing document-oriented information, document databases are a modern way to store data in JSON format rather than rows and columns.
Database Challenges
Today’s large enterprise databases often support very complex queries and are expected to deliver nearly instant responses to those queries. As a result, database administrators are constantly called upon to employ a wide variety of methods to help improve performance. Some common challenges that they face include:
- Absorbing significant increases in data volume. The explosion of data coming in from sensors, connected machines, and dozens of other sources keeps database administrators scrambling to manage and organize their companies’ data efficiently.
- Ensuring data security. Data breaches are happening everywhere these days, and hackers are getting more inventive. It’s more important than ever to ensure that data is secure but also easily accessible to users.
- Keeping up with demand. In today’s fast-moving business environment, companies need real-time access to their data to support timely decision-making and to take advantage of new opportunities.
- Managing and maintaining the database and infrastructure. Database administrators must continually watch the database for problems and perform preventative maintenance, as well as apply software upgrades and patches. As databases become more complex and data volumes grow, companies are faced with the expense of hiring additional talent to monitor and tune their databases.
- Removing limits on scalability. A business needs to grow if it’s going to survive, and its data management must grow along with it. But it’s very difficult for database administrators to predict how much capacity the company will need, particularly with on-premises databases.
Addressing all of these challenges can be time-consuming and can prevent database administrators from performing more strategic functions.
Autonomous Database
Enterprise databases are traditionally managed by database administrators (DBAs), who create, modify, and tune databases to ensure maximum performance both when storing new data in a database, and then retrieving that data.
An autonomous database is a cloud database that uses machine learning to eliminate the human labor associated with database tuning, security, backups, updates, and other routine management tasks traditionally performed by database administrators (DBAs).
Oracle Autonomous Database brings together decades of database automation, decades of automating database infrastructure, and new technology in the cloud to deliver a fully autonomous database.
The database that is self-driving, self-securing, and self-repairing. Let’s explore what each of those terms means for you.
- Self-Driving: Oracle Autonomous Database automates all database and infrastructure management, monitoring, and tuning. This reduces your full-stack admin costs, although admins will still be needed for tasks such as managing how applications connect to the data warehouse and how developers use the in-database features and functions without their application code.
- Self-Securing: Oracle Autonomous Database protects you from both external attacks and malicious internal users, which means you can stop worrying about cyberattacks on unpatched or unencrypted databases.
- Self-Repairing: Oracle Autonomous Database protects from all downtime, including unplanned maintenance, with fewer than 2.5 minutes of downtime a month, including patching.
Essentially, there’s now full, end-to-end automation for:
- Provisioning
- Security
- Updates
- Availability
- Performance
- Change management
- Errors
- With Oracle Autonomous Database, the world’s best database is now also the simplest.
The DBA is responsible for other tasks, many of which must be executed on a daily or other regular basis on all enterprise databases, of which there could be dozens or hundreds. That list of tasks includes:
- Backing up the database in case of disaster or data loss
- Testing the backups to make sure the database can be recovered
- Recovering lost data in the event of an incident
- Reviewing security logs to ensure that the database has not been accessed inappropriately
- Monitoring the database software’s vendor information feeds for security alerts, patches, and upgrades
- Scheduling and applying patches and upgrades when required
- Adjusting the security settings of the databases to respond to threats
- Authorizing new users and applications to access the database
- Monitoring processor and memory utilization of the database server
- Creating and managing schemas-that is, categorization of data
- Assisting software developers with database questions
- Managing extract, transform, and load (ETL) tools
- Monitoring disk utilization of the database server
- Adding more storage or migrating the storage, if necessary
- Planning for future capacity requirements for the database
- Troubleshooting errors and other database problems
- Working with business users and developers to define data models for new applications or modules
Advantages of DBMS=Software
- DBMS offers a variety of techniques to store & retrieve data
- DBMS serves as an efficient handler to balance the needs of multiple applications using the same data
- Uniform administration procedures for data
- Application programmers never exposed to details of data representation and storage.
- A DBMS uses various powerful functions to store and retrieve data efficiently.
- Offers Data Integrity and Security
- The DBMS implies integrity constraints to get a high level of protection against prohibited access to data.
- A DBMS schedules concurrent access to the data in such a manner that only one user can access the same data at a time
- Reduced Application Development Time
Disadvantage of DBMS
- Cost of Hardware and Software of a DBMS is quite high which increases the budget of your organization. Most database management systems are often complex systems, so the training for users to use the DBMS is required.
- In some organizations, all data is integrated into a single database which can be damaged because of electric failure or database is corrupted on the storage media
- Use of the same program at a time by many users sometimes lead to the loss of some data.
- DBMS can’t perform sophisticated calculations
When not to use a DBMS system?
Not recommended when you do not have the budget or the expertise to operate a DBMS. In such cases, Excel/CSV/Flat Files could do just fine.
Users
A typical DBMS has users with different rights and permissions who use it for different purposes. Some users retrieve data and some back it up. The users of a DBMS can be broadly categorized as follows ???
Administrators: Administrators maintain the DBMS and are responsible for administrating the database. They are responsible to look after its usage and by whom it should be used. They create access profiles for users and apply limitations to maintain isolation and force security. Administrators also look after DBMS resources like system license, required tools, and other software and hardware related maintenance.
Designers: Designers are the group of people who actually work on the designing part of the database. They keep a close watch on what data should be kept and in what format. They identify and design the whole set of entities, relations, constraints, and views.
End Users: End users are those who actually reap the benefits of having a DBMS. End users can range from simple viewers who pay attention to the logs or market rates to sophisticated users such as business analysts.
DBMS - Architecture
The design of a DBMS depends on its architecture. It can be centralized or decentralized or hierarchical. The architecture of a DBMS can be seen as either single tier or multi-tier. An n-tier architecture divides the whole system into related but independent n modules, which can be independently modified, altered, changed, or replaced.
DBMS architecture helps in design, development, implementation, and maintenance of a database. A database stores critical information for a business. Selecting the correct Database Architecture helps in quick and secure access to this data.
DBMS Schemas: Internal, Conceptual, External
Database systems comprise of complex data structures. Thus, to make the system efficient for retrieval of data and reduce the complexity of the users, developers use the method of Data Abstraction.
There are mainly three levels of data abstraction:
- Internal Level: Actual PHYSICAL storage structure and access paths.
- Conceptual or Logical Level: Structure and constraints for the entire database
- External or View level: Describes various user views
Let’s study them in detail!
INTERNAL-LEVEL/SCHEMA->
Internal Level/Schema: The internal schema defines the physical storage structure of the database. The internal schema is a very low-level representation of the entire database. It contains multiple occurrences of multiple types of internal record. In the ANSI term, it is also called "stored record’.
Facts about Internal schema:
- The internal schema is the lowest level of data abstraction
- It helps you to keeps information about the actual representation of the entire database. Like the actual storage of the data on the disk in the form of records
- The internal view tells us what data is stored in the database and how
- It never deals with the physical devices. Instead, internal schema views a physical device as a collection of physical pages
CONCEPTUAL-LEVEL/SCHEMA->
The conceptual schema describes the Database structure of the whole database for the community of users. This schema hides information about the physical storage structures and focuses on describing data types, entities, relationships, etc.
Facts about Conceptual schema:
- Defines all database entities, their attributes, and their relationships
- Security and integrity information
- In the conceptual level, the data available to a user must be contained in or derivable from the physical level
EXTERNAL-LEVEL/SCHEMA->
An external schema describes the part of the database which specific user is interested in. It hides the unrelated details of the database from the user. There may be “n” number of external views for each database. Each external view is defined using an external schema, which consists of definitions of various types of external record of that specific view. An external view is just the content of the database as it is seen by some specific particular user. For example, a user from the sales department will see only sales related data.
Facts about external schema:
- An external level is only related to the data which is viewed by specific end users.
- This level includes some external schemas.
- External schema level is nearest to the user
- The external schema describes the segment of the database which is needed for a certain user group and hides the remaining details from the database from the specific user group
GOAL OF 3 LEVEL/SCHEMA
- Every user should be able to access the same data but able to see a customized view of the data.
- The user need not to deal directly with physical database storage detail.
- The DBA should be able to change the database storage structure without disturbing the user’s views
- The internal structure of the database should remain unaffected when changes made to the physical aspects of storage.
ADVANTAGES DATABASE SCHEMA
- You can manage data independent of the physical storage
- Faster Migration to new graphical environments
- DBMS Architecture allows you to make changes on the presentation level without affecting the other two layers
- As each tier is separate, it is possible to use different sets of developers
- It is more secure as the client doesn’t have direct access to the database business logic
- In case of the failure of the one-tier no data loss as you are always secure by accessing the other tier
DISADVANTAGES DATABASE SCHEMA
- Complete DB Schema is a complex structure which is difficult to understand for every one
- Difficult to set up and maintain
- The physical separation of the tiers can affect the performance of the Database
ADVANTAGES OF USING RELATIONAL MODEL
- Simplicity: A relational data model is simpler than the hierarchical and network model.
- Structural Independence: The relational database is only concerned with data and not with a structure. This can improve the performance of the model.
- Easy to use: The relational model is easy as tables consisting of rows and columns is quite natural and simple to understand
- Query capability: It makes possible for a high-level query language like SQL to avoid complex database navigation.
- Data independence: The structure of a database can be changed without having to change any application.
- Scalable: Regarding a number of records, or rows, and the number of fields, a database should be enlarged to enhance its usability.
DISADVANTAGES OF USING RELATIONAL MODEL
- Few relational databases have limits on field lengths which can’t be exceeded.
- Relational databases can sometimes become complex as the amount of data grows, and the relations between pieces of data become more complicated.
- Complex relational database systems may lead to isolated databases where the information cannot be shared from one system to another.
Entity Relationships Diagram
For more info ER Diagram: https://www.guru99.com/er-diagram-tutorial-dbms.html
Gartner Magic Quadrant DBMS
Data Warehouse
What is Data Warehousing?
- A data warehouse is constructed by integrating data from multiple heterogeneous sources. It supports analytical reporting, structured and/or ad hoc queries and decision making.
- A data warehousing is defined as a technique for collecting and managing data from varied sources to provide meaningful business insights. It is a blend of technologies and components which aids the strategic use of data.
- It is electronic storage of a large amount of information by a business which is designed for query and analysis instead of transaction processing. It is a process of transforming data into information and making it available to users in a timely manner to make a difference.
- The decision support database (Data Warehouse) is maintained separately from the organization’s operational database.
- The data warehouse is not a product but an environment. It is an architectural construct of an information system which provides users with current and historical decision support information which is difficult to access or present in the traditional operational data store.
- The data warehouse is the core of the BI system which is built for data analysis and reporting.
- Data warehouse system is also known by the following name:
- Decision Support System (DSS)
- Executive Information System
- Management Information System
- Business Intelligence Solution
- Analytic Application
- Data Warehouse
- The different between database and datawarehouse are following,
Understanding a Data Warehouse
- A data warehouse is a database, which is kept separate from the organization’s operational database.
- There is no frequent updating done in a data warehouse.
- It possesses consolidated historical data, which helps the organization to analyze its business.
- A data warehouse helps executives to organize, understand, and use their data to take strategic decisions.
- Data warehouse systems help in the integration of diversity of application systems.
- A data warehouse system helps in consolidated historical data analysis.
Why a Data Warehouse is Separated from Operational Databases
A data warehouses is kept separate from operational databases due to the following reasons.
- An operational database is constructed for well-known tasks and workloads such as searching particular records, indexing, etc. In contract, data warehouse queries are often complex and they present a general form of data.
- Operational databases support concurrent processing of multiple transactions. Concurrency control and recovery mechanisms are required for operational databases to ensure robustness and consistency of the database.
- An operational database query allows to read and modify operations, while an OLAP query needs only read only access of stored data.
- An operational database maintains current data. On the other hand, a data warehouse maintains historical data.
History of Datawarehouse
The Datawarehouse benefits users to understand and enhance their organization’s performance. The need to warehouse data evolved as computer systems became more complex and needed to handle increasing amounts of Information. However, Data Warehousing is a not a new thing.
Here are some key events in evolution of Data Warehouse-
- 1960- Dartmouth and General Mills in a joint research project, develop the terms dimensions and facts.
- 1970- A Nielsen and IRI introduces dimensional data marts for retail sales.
- 1983- Tera Data Corporation introduces a database management system which is specifically designed for decision support
- Data warehousing started in the late 1980s when IBM worker Paul Murphy and Barry Devlin developed the Business Data Warehouse.
- However, the real concept was given by Inmon Bill. He was considered as a father of data warehouse. He had written about a variety of topics for building, usage, and maintenance of the warehouse & the Corporate Information Factory.
How Datawarehouse works?
A Data Warehouse works as a central repository where information arrives from one or more data sources. Data flows into a data warehouse from the transactional system and other relational databases.
Data may be:
- Structured
- Semi-structured
- Unstructured data
The data is processed, transformed, and ingested so that users can access the processed data in the Data Warehouse through Business Intelligence tools, SQL clients, and spreadsheets. A data warehouse merges information coming from different sources into one comprehensive database.
By merging all of this information in one place, an organization can analyze its customers more holistically. This helps to ensure that it has considered all the information available. Data warehousing makes data mining possible. Data mining is looking for patterns in the data that may lead to higher sales and profits.
Data Warehouse Features
The key features of a data warehouse are discussed below
Subject Oriented: A data warehouse is subject oriented because it provides information around a subject rather than the organization’s ongoing operations. These subjects can be product, customers, suppliers, sales, revenue, etc. A data warehouse does not focus on the ongoing operations, rather it focuses on modelling and analysis of data for decision making.
Integrated: A data warehouse is constructed by integrating data from heterogeneous sources such as relational databases, flat files, etc. This integration enhances the effective analysis of data.
Time Variant: The data collected in a data warehouse is identified with a particular time period. The data in a data warehouse provides information from the historical point of view.
Non-volatile: Non-volatile means the previous data is not erased when new data is added to it. A data warehouse is kept separate from the operational database and therefore frequent changes in operational database is not reflected in the data warehouse.
Note! A data warehouse does not require transaction processing, recovery, and concurrency controls, because it is physically stored and separate from the operational database.
Data Warehouse Applications
Many of the points expressed here are not truly applications but ways in which the DW (including data mining=get the insight from data) is used by these industries.
Consumer Goods
- Forecasting
- Inventory replenishment
- Effects of marketing campaigns, advertising, coupons and store displays
- Sales and marketing analysis
- Sharing information with distribution sites, business partners and product managers
- Packaged Goods: Identify required product features
Distribution
- Supply chain analyses
- Understand pipeline issues
Finance/Banking
- Evaluating business concentration and risk exposure leading to modified credit policies and loan loss reserves
- Consumer asset data
- Spot market trends
- Government regulation reporting
- Marketing
- Mergers
- Geographic overlap and saturation
- Information for government regulation and approval
- To support management planning, marketing and financial decision making
- Ability to track and cut costs
- Manage resources more effectively
- Provide feedback to bankers regarding customer relationships and profitability
- Information on spending patterns on a segment of issuing members card base (co-brand)
- Target marketing & Promotion performance
- Members use it to analyze performance by product, geography, interchange rates, volume by merchant, location, promotions, operational performance
- Cardholder spending by state and merchant classification to develop direct mail promotion with key merchants.
- Ability to select better marketing partners, build innovative and successful new product and build brand loyalty
- Co-branding - determining where their cards (Sierra Club) are being used and develop target marketing plans
- Combine with proprietary data to determine purchase patterns to develop marketing programs
- Agent alerts:
- Early warnings for changing spending patterns
- Opportunity for special offer based on abnormal cardholder activity
- When response rate to promotions hits target
- Test promotional opportunities
- Their member banks or co-brands can add data from the DW to their own proprietary databases
- Mortgage Loan portfolio
- New loans in process (pipeline)
- Secondary marketing
- Credit Cards
- Identify new customers
- Manage and control collections
- Develop new products
- Determine optimal marketing efforts for new products
- Manager customer service performance
- Identify potential risk of default
- Brokerage, Commodity Trading
- Identify target investment services, products and promotions
- Risk management
- Quality of trader transactions
- Financial Services: Tracking investment managers
- Personal Trust
- Tracking managers on performance relative to indexes
- Tracking managers on the types of stocks they purchase
- Data Mining
- Product analysis
- Customer segmentation
- Customer profitability
- Target marketing campaigns
- Fraud detection (credit cards)
Finance General
- Expense evaluation - trends
- Customer Information Systems
- Customer profitability
- Fee tolerance
Government and Education
- Federal Government: Compliance research
- State Government:
- Accounting
- Payroll
- Procurement
- Human Resources
- State Government: Auditing and fraud investigation of social services
- University:
- Provide information to be used in a grant proposal
- University finances
- Human resources
- Student demographics
- Financial aid
- Room and course scheduling
- Data would be captured on the characteristics/demographics of students to better understand retention and success among minorities.
- Government: Social Services
- Fraud detection
- Effectiveness of services
- Profiles of who is using what services
- Government Taxes: Auditing tax records for patterns and anomalies
- Government Health Information
- Program policy effectiveness (Cost and outcomes)
- Provider care adequacy
- Government: Police
- Patterns and trends of criminal activity
- Justice resource deployment
- Consolidation and integration of data from multiple agencies
- Effectiveness of programs and patterns of policing
Health Care
- Financial
- Clinical
- Strategic and outcomes data
- Helps measure and track and analyze how well the hospital is providing services
- Reports on percentage of patients being fed intravenously
- Compares physicians to peer group on how long his patients occupy a bed, and the cost of surgery by physician
- Finance department gets statistics by patient type, revenue code and insurance carrier
- What percentage of hospital’s billings are from Medicare, Medicaid and each major insurance company
- Ability to be more proactive about research
- Respond to managed care contracts more knowledgeably
- Ability to track costs and cut costs, manage resource more effectively, provide feedback to physicians regarding outcomes and the cost of realizing these outcomes.
- Outcomes analysis
- Providing feedback to physicians on procedures and tests
- Using data mining, detecting inappropriate tests
- Reports to doctors of testing trends and practices within their specialty
- Results of study given to doctors so they can refine their decisions for ordering tests
- Evaluating service to determine if should be providing or outsourcing (ex. dialysis, organ transplantation)
- Nosocomial analysis
- Continuing education and certification of health care professionals
- Health Care: General
- Pairing clinical to financial records to determine cost effectiveness of care
- Utilization review
- Contract management
- Data mining to identify data patterns that could predict future individual health problems
- Data mining to identify patients who will probably not respond well to specific procedures and operations
- Discover “best practices” to improve quality and reduce costs
- Analysis of care delivery
- Research (prescribing patterns, use of antibiotics)
- Physician performance
- Resource utilization
- Information for bids on managed care contracts
- Information to support audits and external reports
- Disease state support (cardiovascular, end-stage renal, etc.)
- Pharmaceutical
- Outcomes analysis
- Doctor access
Hospitality (Hotels, car rental, timeshares)
- Cross-brand promotions - target customers with promotional offers tailored to their demographics and travel patterns
- Estimate response to promotions and products through demographic analysis
- Cross marke
Insurance
- Incorporate both internal and external data (i.e. information on competitors and the insurance industry trends)
- Forecast and monitor changes in the industry thereby allowing better positioning in the marketplace
- Identify characteristics of profitable business
- Analyze information related to retention of business at renewal including patterns of customers who do not renew, determine reasons why, and resolve issues that will assist in retaining valued clients.
- Accurate, consolidated view of customer portfolios
- Analysis of profitability by customer, product, geography, and sales hierarchy
- Analysis of sales offices for profit and loss
- Property and Liability Insurance: Data mining review of claims by actuarial department
- Workers’ Compensation Insurance:
- Recommend health insurance deductibles.
- Analysis of claims by the employer, cause of injury, body part injured and the percentage of * employees who have suffered similar injuries.
- Fraud analysis using data mining
- Health Insurance:
- Impact on subscriber services and cost
- Employee costs per employer
- Service usage
- Provider evaluation:
- Physicians profiles
- Cost
- Length of hospital stay
- Procedure evaluations
- Fraud detection, Searching for claims where the service has not actually been provided. * Looking for patterns that would suggest further inquiry into the claim.
- Abuse detection, Searching for patterns indicating that certain providers are performing unnecessary procedures, prescribing expensive medication where a less expensive drug would be as effective, performing unnecessary tests and keeping a patient in the hospital longer than necessary.
- Blue Cross / Blue Shield:
- Analysis of claims
- Providers analysis
- Reporting to groups, government agencies, trade associations
- Analysis of quality of care and costs
- Marketing managed-care contracts
- Actuarial
- Underwriting
- Financial analysis (actual expenses vs. planned expenses)
- Profitability of manager care arrangements
- Capitated contract performance
- Fraud analysis based on the provider’s health care specialty and the geography of the claim
- Pharmaceutical Insurance:
- Sales and marketing
- Provider profiling
- Government reporting
- Utilization
- Claims
- Actuarial
- Integrating pharmaceutical information with medical claims
- Cost analysis by patient demographics and geographical distribution
- Cost analysis by provider, provider specialties and treatment protocols
- Analysis by diagnosis/prescription
- Generic/brand name drug comparisons
- Insurance Research: Claims information (Zurich-American - RiskIntelligence)
Manufacturing and Distribution
- Company M&D (Marketing & Development):
- Analyze emerging business trends
- Examine product bookings
- Determine product shipments, backlogs and cancellations
- Better manage product portfolio
- Sharper contract negotiations
- Better manufacture forecasting
- Earlier detection of warning conditions
- Ability to eliminate products from portfolio
- Allows product mangers to more quickly identify product lines that are not longer required or profitable
- Information about margins, product backlogs or historical sales data to critical decisions.
- Visibility to its customers - on an individual customer level, what products the company sells, where it sells the products and at what price point.
- Worldwide view of marketing developments
- Common global language
- Marketing executives are better able to manage their product lines
- Better visibility into product and customer profit margins
- Information on customers, products, costs, invoices
- Access to market demand data (orders and shipment data) by both finance and materials groups
- Legal department used DW to substantiate trademark claims in foreign markets
- Sales analysis for product movement
- Sales decision support * are the company’s products not being stocked * market share * competitors market share * when our company increases its share of the market, it is coming from competitors or are we cannibalizing our own line
- Computer component manufacturer * Provide selected DW access to both customers and suppliers * Extensive measurements of the quality of the product, quality of components supplied by their vendors * Extensive feedback from customers on quality of the products
- Sales history/sales trends
- Customer profitability
- Plant capacity management
- Variances between standard and actual product costs
- Inventory turnover
- Human resources
- Core competency, skills and distribution of skills
- Analysis of production patterns to improve inventory and pricing practices
- Demand forecasting to determine optimal inventory
- Analysis of product pricing to establish discounts and margins
- Automobile Manufacturer:
- Tracks assembly and warranty quality information by supplier
- Plans to use this information for product planning and design
- Supplier quality information will give the manufacturer a better position for negotiation with supplier
- Plans to provide suppliers with information on their products through the Internet. The goal is to give them enough information so they will improve the quality of their products. [The supplier could be provided with data on the cost of defective parts to the automobile manufacturer.]
- The data provides a quantitative measure of quality for both the manufacturer and the supplier
- Appliance Manufacturer:
- Customer service
- Suppliers’ quality
- Negotiation with suppliers
- Clothing Manufacturer:
- Analyze sales and product trends by location to understand customer buying patterns
- Analyze sell through, what was selling at retailers
- Analyze and understand cancellations, the reasons for the cancellations to identify steps to remedy manufacturing problems
- Computer Manufacturer: Market demand projections
- Food Manufacturer:
- Measure against competition
- Ability to project how a new product will do
- Ability to show grocery managers how product is selling at competitive stores, at stores within the same chain and against competitive products
- Using agents, monitors conditions that require attention including variances in prices and volumes in company’s and competitors’ products
- Analyses fixed costs, equipment utilization
- Analyses manufacturing costs and performance
- Analyses productivity
- Analyses inventory levels
- Pharmaceutical Manufacturer
- Analysis of physicians (along with managed-care connections) and their prescribing patterns
- Target marketing
- Identify emerging prescribing trends
- Generate reports for pre-clinical approval stage
- Measurement of toxicology parameters
- Research analysis
- Testing analysis
- Steel Manufacturer
- Control (reduce) inventory
- Understand item-level detail by cost, revenue, profit, inventory, customer, location
- Analysis of production problems
- Reduce accounts receivable
- Understand profitability by customer
- Understand margins and profitability by manufacturing facility leading to decisions about where to manufacture each item
- Evaluate possibilities for renegotiating contracts with customers
- Identify opportunities for new products
- Identify opportunities for new locations
- Compare plans to actual performance
- Improve product and customer mix
- Data Mining
- Quality analysis
- Profitability and problems with suppliers
- Profitability and problems with customers
- Customer profitability
- Product profitability analysis
- Strategic partnering: Negotiating with suppliers, customers
- Customer purchases to identify who should get new Material Safety Data Sheets
Marketing General
- Comparing product lines
- Media research (Nielsen Media Research)
Retailers
- Tracking an items contribution to margin for its category
- Tracking how promotions and one-time buys are doing including using trend analysis
- Buyers using it to analyze sales data
- Allowing slow selling lines and items to be dropped from the stores while giving their shelf space to more profitable ones
- Better understand customers and their buying patterns:
- Drives promotions by having access to all data, marketing staff can make more accurate and effective promotion decisions
- Feeds targeted and mass mailings
- Enable retailer to proactively develop a relationship with its best customers or individuals that should be buying more than they currently are.
- Marketing staff can ask “what if” marketing questions and get fast response
- Meets the objectives of increasing sales, increasing profit, increasing marketing analyst productivity and decreasing mail expense and promotion cycle time.
- Mail promotion effectiveness is easily and quickly quantified
- Sales analysis
- Target marketing
- Cardholder base
- Evaluate technician training
- Evaluate maintenance tool and equipment inventory
- Merchandising
- Inventory management
- Flow of goods management
- Relationship marketing
- Supplier integration
- Marketing strategy
- Buying strategy
- Merchandizing strategy
- Sales tracking by item
- Sales analysis
- Forecasting
- Inventory tracking
- Market basket analysis - e.g. Do products on sale generate other sales?
- Individual items contribution to profits
- Vendors (suppliers) have access to how their products are selling
- Shelf space allocations
- Effectiveness of promotions, advertising
- Product analysis:
- restocking
- profitability
- inventory turns
- price changes
- Category management (determining optimal product in each category and the optimal price for that product)
- Merchandising strategy sales tracking
- analysis by SKU (stock keeping unit) by store
- trend analysis
- Competitive analysis
- Understanding complaints, claims and returns
- Analyze customer contacts to determine preferences, attract and retain profitable customers
- Understand customer and predict behavior
- Goal-> improve gross margins
- Better merchandising
- Better buying decisions
- End-of-season vendor negotiations
- Inventory management
- Price management for markdowns and promotions
- Vendor analysis
- Department Store:
- Merchandising and buying decisions
- Information to negotiate on end-of-season merchandise
- Inventory and price management for promotions and markdowns
- Vendor analysis
- Automobile Convenience Store
- Better product mix by location and demographics
- Understanding price zones, profit, margins,
- Understanding the competition
- Understanding customers - images of the customers (who are they)
- Results of surveys
- Brand recognition
- Customer demographics
- Price sensitivity
- New locations
- Modeling/testing profitability of new items, different product mixes
- Effectiveness of advertising and promotions
- Understanding shrinkage by product, location,
- Understanding product tie-ins (coffee and doughnuts, hot dogs and soft drinks, gasoline and oil, smog check and tune-up) and trying out ways to exploit those tie-ins. Shelf allocation
- Use of ATM cards vs cash (are credit cards being considered?)
- Effectiveness of alternative business controls
- Statistical sampling when not all data is available
- Suppliers/vendors
- Price
- Support/service
- Delivery
- Profitability
- Quality
- Alternative suppliers
- Supplier negotiations
- Joint promotions
- Demographic data from suppliers
- Fast Food
- Analysis of food costs
- Analysis of labor costs
- Analysis of sales data
- Service quality
- Customer information
- Data Mining
- Advertising effectiveness
- Market basket analysis
- Profitability
- Retailing General
- Product profitability analysis
- Merchandise planning
- Analyze sales fluctuations
- Selling marketing data to suppliers
- Markdown management
- Identify markets to target for newspaper advertising inserts
- Catalog: Identify low profit products
Services
- Finance
- Revenue
- Purchase orders
- Human resources
- Customer profiles
- Materials management
Sports
- Winning player combinations
- Analyzing strategies, patterns of plays, defenses, players involved
- Player negotiation
- Internet statistical searches by fans
Telephone
- Fixed asset analysis
- Facility for sales reps to market to volume customers different long-distance packages based on their latest calling patterns.
- Integrated customer and financial data
- Work request tracking
- Customer information systems:
- Exploring product “churn”
- Managing strategic accounts
- Building customer loyalty
- Market segmentation
- Target marketing
- Product development
- Risk and fraud assessment
- Customer analysis:
- Which customers are most likely to respond to an offer
- Which customers are likely to accept new technology
- Which customers are likely to respond to competitors’ offers
- How much can we expect customers to spend on various products
- Which prospects (non-customers) are likely to accept our offers
- Identifying deadbeat customers and not marketing to these customers
- Identifying potentially profitable market segments
- Fee tolerance
- Telemarketing
- Predictive modeling
- Merge lifestyle and demographic data to existing customer information
- Data Mining
- Analyzing customers most likely to switch to another carrier
- Understanding customers
- Understanding customers’ desires and expectations in contrast to what they have ordered and what the company can provide
Transportation
- Target marketing
- Understanding customer requirements
- Railroad:
- Customer satisfaction
- Train performance
- Derailment prevention
- Crew management
- Railroad
- Fleet management, locomotive information
- Customer financial analysis
- Rate analysis
- Profitability analysis
- Fleet maintenance analysis
- Identify tax-exempt purchases
- Understanding competitor’s cars on railroad’s line
- Airline
- Customer service program - financial data
- Cargo volume analysis to understand source of revenue
- Fraud analysis - issuing tickets on bad credit cards
- Multi-industry (conglomerates)
- Planning and forecasting
- Make comparisons to plans
Cross Industry
- Legacy system retirement
- Reliability of sales forecasting
- Call centers, evaluating productivity and costs associated with varying responses to customer problems
- Control of property and income tax
- Financial
- Budgets
- Uncover problems in financial numbers before they are reported to upper management
Utilities
- Pricing
- Supply chain
- Asset management
- Human Resources, Medical benefits package evaluation
- Finance, Wholesale pricing models
- Accounts Receivable, maximizing collections for customers who missed a payment
- Accounts Receivable, analyzing processes to maximize collections for overdue accounts
- Fixed Assets
- Customer Information Systems
- Marketing
- Customer Satisfaction
- Financial
- Conservation
- Marketing Queries
- Determining customer usage
- Understanding demographics and usage by demographics
- Tracking marketing programs
- Modeling a new program
- Cost justifying a new program
- Commercial customers, price sensitivity
- Data mining, looking for patterns that may be marketing opportunities
- Data mining, looking for patterns that predict delinquencies
- Customer Satisfaction Queries
- Tracking customer comments and complaints (By demographics & By psychographics)
- Tracking customer surveys
- Reporting to the Utility Commission and the Press
- Data mining
- Financial Queries
- Customer profitability
- Evaluating relationship pricing
- Assessing alternative delivery channels
- Assess outsourcing possibilities
- Track profits across divisions
- Conservation Queries
- Monitoring conservation programs by customer
- Identify pattern of customer (demographics) that could be candidate for conservation program
- Identifying customers who have (or have not) signed up for special programs
- Peak-period A/C disabled
- Old refrigerator surrender
- Florescent bulbs
Types of Data Warehouse
- A. Enterprise Data Warehouse:
Enterprise Data Warehouse is a centralized warehouse. It provides decision support service across the enterprise. It offers a unified approach for organizing and representing data. It also provide the ability to classify data according to the subject and give access according to those divisions.
- B. Operational Data Store:
Operational Data Store, which is also called ODS, are nothing but data store required when neither Data warehouse nor OLTP systems support organizations reporting needs. In ODS, Data warehouse is refreshed in real time. Hence, it is widely preferred for routine activities like storing records of the Employees.
A data mart is a subset of the data warehouse. It specially designed for a particular line of business, such as sales, finance, sales or finance. In an independent data mart, data can collect directly from sources.
- D. Information Processing
A data warehouse allows to process the data stored in it. The data can be processed by means of querying, basic statistical analysis, reporting using crosstabs, tables, charts, or graphs.
A data warehouse supports analytical processing of the information stored in it. The data can be analyzed by means of basic OLAP operations, including slice-and-dice, drill down, drill up, and pivoting.
Data mining supports knowledge discovery by finding hidden patterns and associations, constructing analytical models, performing classification and prediction. These mining results can be presented using the visualization tools.
Datawarehouse (OLAP) vs Datbase (OLTP)
General stages of Data Warehouse
Earlier, organizations started relatively simple use of data warehousing. However, over time, more sophisticated use of data warehousing begun. The following are general stages of use of the data warehouse:
Offline Operational Database: In this stage, data is just copied from an operational system to another server. In this way, loading, processing, and reporting of the copied data do not impact the operational system’s performance.
Offline Data Warehouse: Data in the Datawarehouse is regularly updated from the Operational Database. The data in Datawarehouse is mapped and transformed to meet the Datawarehouse objectives.
Real time Data Warehouse: In this stage, Data warehouses are updated whenever any transaction takes place in operational database. For example, Airline or railway booking system.
Integrated Data Warehouse: In this stage, Data Warehouses are updated continuously when the operational system performs a transaction. The Datawarehouse then generates transactions which are passed back to the operational system.
Who needs Data warehouse?
Data warehouse is needed for all types of users like:
- Decision makers who rely on mass amount of data
- Users who use customized, complex processes to obtain information from multiple data sources.
- It is also used by the people who want simple technology to access the data
- It also essential for those people who want a systematic approach for making decisions.
- If the user wants fast performance on a huge amount of data which is a necessity for reports, grids or charts, then Data warehouse proves useful.
- Data warehouse is a first step If you want to discover ‘hidden patterns’ of data-flows and groupings.
Steps to Implement Data Warehouse
The best way to address the business risk associated with a Datawarehouse implementation is to employ a three strategy as below
- Enterprise strategy: Here we identify technical including current architecture and tools. We also identify facts, dimensions, and attributes. Data mapping and transformation is also passed.
- Phased delivery: Datawarehouse implementation should be phased based on subject areas. Related business entities like booking and billing should be first implemented and then integrated with each other.
- Iterative Prototyping: Rather than a big bang approach to implementation, the Datawarehouse should be developed and tested iteratively.
Here, are key steps in Datawarehouse implementation along with its deliverables.
Best practices to implement a Data Warehouse
- Decide a plan to test the consistency, accuracy, and integrity of the data.
- The data warehouse must be well integrated, well defined and time stamped.
- While designing Datawarehouse make sure you use right tool, stick to life cycle, take care about data conflicts and ready to learn you’re your mistakes.
- Never replace operational systems and reports
- Don’t spend too much time on extracting, cleaning and loading data.
- Ensure to involve all stakeholders including business personnel in Datawarehouse implementation process. Establish that Data warehousing is a joint/ team project. You don’t want to create Data warehouse that is not useful to the end users.
- Prepare a training plan for the end users.
Advantages of Data Warehouse:
- Data warehouse allows business users to quickly access critical data from some sources all in one place.
- Data warehouse provides consistent information on various cross-functional activities. It is also supporting ad-hoc reporting and query.
- Data Warehouse helps to integrate many sources of data to reduce stress on the production system.
- Data warehouse helps to reduce total turnaround time for analysis and reporting.
- Restructuring and Integration make it easier for the user to use for reporting and analysis.
- Data warehouse allows users to access critical data from the number of sources in a single place. Therefore, it saves user’s time of retrieving data from multiple sources.
- Data warehouse stores a large amount of historical data. This helps users to analyze different time periods and trends to make future predictions.
Disadvantages of Data Warehouse
- Not an ideal option for unstructured data.
- Creation and Implementation of Data Warehouse is surely time confusing affair.
- Data Warehouse can be outdated relatively quickly
- Difficult to make changes in data types and ranges, data source schema, indexes, and queries.
- The data warehouse may seem easy, but actually, it is too complex for the average users.
- Despite best efforts at project management, data warehousing project scope will always increase.
- Sometime warehouse users will develop different business rules.
- Organisations need to spend lots of their resources for training and Implementation purpose.
The Future of Data Warehousing
- Change in Regulatory constrains may limit the ability to combine source of disparate data. These disparate sources may include unstructured data which is difficult to store.
- As the size of the databases grows, the estimates of what constitutes a very large database continue to grow. It is complex to build and run data warehouse systems which are always increasing in size. The hardware and software resources are available today do not allow to keep a large amount of data online.
- Multimedia data cannot be easily manipulated as text data, whereas textual information can be retrieved by the relational software available today. This could be a research subject.
Business Intelligence
What is Business Intelligence?
- BI(Business Intelligence) is a set of processes, architectures, and technologies that convert raw data into meaningful information that drives profitable business actions.It is a suite of software and services to transform data into actionable intelligence and knowledge.
- BI has a direct impact on organization’s strategic, tactical and operational business decisions. BI supports fact-based decision making using historical data rather than assumptions and gut feeling.
- BI tools perform data analysis and create reports, summaries, dashboards, maps, graphs, and charts to provide users with detailed intelligence about the nature of the business.
Why is BI important?
- Measurement: creating KPI (Key Performance Indicators) based on historic data
- Identify and set benchmarks for varied processes.
- With BI systems organizations can identify market trends and spot business problems that need to be addressed.
- BI helps on data visualization that enhances the data quality and thereby the quality of decision making.
- BI systems can be used not just by enterprises but SME (Small and Medium Enterprises)
- To Improve Visibility:
- Do you know who the best performers are?
- Can you easily identify areas for improvement?
- Is stock going missing and you can’t identify where it’s going?
- To Turn Data into Actionable Information
- To Improve Efficiency
- To Gain Sales & Market Intelligence
- To Gain Competitive Intelligence
How Business Intelligence systems are implemented?
- Step 1) Raw Data from corporate databases is extracted. The data could be spread across multiple systems heterogeneous systems.
- Step 2) The data is cleaned and transformed into the data warehouse. The table can be linked, and data cubes are formed.
- Step 3) Using BI system the user can ask quires, request ad-hoc reports or conduct any other analysis.
Four types of BI users
Following given are the four key players who are used Business Intelligence System:
The Professional Data Analyst: The data analyst is a statistician who always needs to drill deep down into data. BI system helps them to get fresh insights to develop unique business strategies.
The IT users: The IT user also plays a dominant role in maintaining the BI infrastructure.
The head of the company: CEO or CXO can increase the profit of their business by improving operational efficiency in their business.
The Business Users: Business intelligence users can be found from across the organization. There are mainly two types of business users
- Casual business intelligence user
- The power user.
The difference between both of them is that a power user has the capability of working with complex data sets, while the casual user need will make him use dashboards to evaluate predefined sets of data.
Advantages of Business Intelligence
Here are some of the advantages of using Business Intelligence System:
Boost productivity
To improve visibility
Fix Accountability
It gives a bird’s eye view
It streamlines business processes
It allows for easy analytics
BI System Disadvantages
Cost
Complexity
Limited use
Time Consuming Implementation
Trends in Business Intelligence
- Artificial Intelligence: Gartner’ report indicates that AI and machine learning now take on complex tasks done by human intelligence. This capability is being leveraged to come up with real-time data analysis and dashboard reporting.
- Collaborative BI: BI software combined with collaboration tools, including social media, and other latest technologies enhance the working and sharing by teams for collaborative decision making.
- Embedded BI: Embedded BI allows the integration of BI software or some of its features into another business application for enhancing and extending it’s reporting functionality.
- Cloud Analytics: BI applications will be soon offered in the cloud, and more businesses will be shifting to this technology. As per their predictions within a couple of years, the spending on cloud-based analytics will grow 4.5 times faster.
- Self-service BI
What is Self-Service BI?
- Self-service analytics or self-service business intelligence refers to tools used to connect and analyze data, and which are operated primarily by business departments in the organization , rather than IT professionals or dedicated data analysts.
Traditional BI vs Self-Service BI?
Business Intelligence software
Data Lab
WS 2019: Tableau software: itsmecevi.github.io/tableaupublic
Summary + MEQA
Database
1. What is the different between on premises and cloud software?
The biggest difference between these two systems is how they are deployed. Cloud-based software is hosted on the vendor’s servers and accessed through a web browser. On-premise software is installed locally, on a company’s own computers and servers.
2. Please explain what is qualitative data, quantitative data, discrete, and continuous data? You can explain with diagram or example.
Data can be qualitative or quantitative. Put simply: Discrete data is counted, Continuous data is measured.
- Qualitative data is descriptive information (it describes something)
- Quantitative data is numerical information (numbers)-> Discrete(5,6,10); Continuous (3,14)
3. Create the diagram workflow from data to BI reports.
4. Explain a use case implementation of DBMS in the industries? 2 industry such as banking and finance.
5. What is different between database and data warehouse? 5 different point of views
6. What are the similarities in a database and data warehouse? 5 similarities point of views
Other responses have given the definition of the two, similarities are:
- They are both data storage systems.
- Both can be used by multiple users
- Both can be complex with many tables and large amounts of data.
- Both can be queried to get answers or pull out data sets based on commonality or exclusion.
- Databases and data warehouses can be on premise or cloud-based.
7. Give the 5 types of databases?
- Relational databases
- Object-oriented databases
- Distributed databases
- Data warehouses
- NoSQL databases
- Graph databases
- OLTP databases
- Open source databases
- Cloud databases
- Multimodel database
- Document/JSON database
8. What is the list of Database Challenges?
- Absorbing significant increases in data volume
- Ensuring data security
- Keeping up with demand
- Managing and maintaining the database and infrastructure
- Removing limits on scalability
9. Explain the 3 users of DBMS?
Administrators: Administrators maintain the DBMS and are responsible for administrating the database. They are responsible to look after its usage and by whom it should be used. They create access profiles for users and apply limitations to maintain isolation and force security. Administrators also look after DBMS resources like system license, required tools, and other software and hardware related maintenance.
Designers: Designers are the group of people who actually work on the designing part of the database. They keep a close watch on what data should be kept and in what format. They identify and design the whole set of entities, relations, constraints, and views.
End Users: End users are those who actually reap the benefits of having a DBMS. End users can range from simple viewers who pay attention to the logs or market rates to sophisticated users such as business analysts.
10. What is advantages and disadvantages of database schema?
ADVANTAGES DATABASE SCHEMA
- You can manage data independent of the physical storage
- Faster Migration to new graphical environments
- DBMS Architecture allows you to make changes on the presentation level without affecting the other two layers
- As each tier is separate, it is possible to use different sets of developers
- It is more secure as the client doesn’t have direct access to the database business logic
- In case of the failure of the one-tier no data loss as you are always secure by accessing the other tier
DISADVANTAGES DATABASE SCHEMA
- Complete DB Schema is a complex structure which is difficult to understand for every one
- Difficult to set up and maintain
- The physical separation of the tiers can affect the performance of the Database
11. What is advantages and disadvantages of using relational model?
ADVANTAGES OF USING RELATIONAL MODEL
- Simplicity: A relational data model is simpler than the hierarchical and network model.
- Structural Independence: The relational database is only concerned with data and not with a structure. This can improve the performance of the model.
- Easy to use: The relational model is easy as tables consisting of rows and columns is quite natural and simple to understand
- Query capability: It makes possible for a high-level query language like SQL to avoid complex database navigation.
- Data independence: The structure of a database can be changed without having to change any application.
- Scalable: Regarding a number of records, or rows, and the number of fields, a database should be enlarged to enhance its usability.
DISADVANTAGES OF USING RELATIONAL MODEL
- Few relational databases have limits on field lengths which can’t be exceeded.
- Relational databases can sometimes become complex as the amount of data grows, and the relations between pieces of data become more complicated.
- Complex relational database systems may lead to isolated databases where the information cannot be shared from one system to another.
12. Explain the relational model 1:1, 1:n, n:n with the example?
Data Warehouse
1. Explain the implementation of Data Warehouse in 5 industry?
- Banking
- Retailer
- Insurance
- Manufacturing
- Healthcare
2. Explain the 6 types of Data Warehouse?
- Enterprise Data Warehouse:
Enterprise Data Warehouse is a centralized warehouse. It provides decision support service across the enterprise. It offers a unified approach for organizing and representing data. It also provide the ability to classify data according to the subject and give access according to those divisions.
Operational Data Store, which is also called ODS, are nothing but data store required when neither Data warehouse nor OLTP systems support organizations reporting needs. In ODS, Data warehouse is refreshed in real time. Hence, it is widely preferred for routine activities like storing records of the Employees.
A data mart is a subset of the data warehouse. It specially designed for a particular line of business, such as sales, finance, sales or finance. In an independent data mart, data can collect directly from sources.
A data warehouse allows to process the data stored in it. The data can be processed by means of querying, basic statistical analysis, reporting using crosstabs, tables, charts, or graphs.
A data warehouse supports analytical processing of the information stored in it. The data can be analyzed by means of basic OLAP operations, including slice-and-dice, drill down, drill up, and pivoting.
Data mining supports knowledge discovery by finding hidden patterns and associations, constructing analytical models, performing classification and prediction. These mining results can be presented using the visualization tools.
3. Explain the different between OLAP by datawarehouse and OLTP by database?
4. Explain the advantages and disadvantages of using Data Warehouse?
-> Advantages of Data Warehouse:
- Data warehouse allows business users to quickly access critical data from some sources all in one place.
- Data warehouse provides consistent information on various cross-functional activities. It is also supporting ad-hoc reporting and query.
- Data Warehouse helps to integrate many sources of data to reduce stress on the production system.
- Data warehouse helps to reduce total turnaround time for analysis and reporting.
- Restructuring and Integration make it easier for the user to use for reporting and analysis.
- Data warehouse allows users to access critical data from the number of sources in a single place. Therefore, it saves user’s time of retrieving data from multiple sources.
- Data warehouse stores a large amount of historical data. This helps users to analyze different time periods and trends to make future predictions.
-> Disadvantages of Data Warehouse:
- Not an ideal option for unstructured data.
- Creation and Implementation of Data Warehouse is surely time confusing affair.
- Data Warehouse can be outdated relatively quickly
- Difficult to make changes in data types and ranges, data source schema, indexes, and queries.
- The data warehouse may seem easy, but actually, it is too complex for the average users.
- Despite best efforts at project management, data warehousing project scope will always increase.
- Sometime warehouse users will develop different business rules.
- Organisations need to spend lots of their resources for training and Implementation purpose.
Business Intelligence:
Read the modul https://itsmecevi.github.io/tableaupublic/ too.
1. Explain the advantages and disadvantages of using BI Systems?
-> Advantages of Business Intelligence
Here are some of the advantages of using Business Intelligence System:
Boost productivity
To improve visibility
Fix Accountability
It gives a bird’s eye view
It streamlines business processes
It allows for easy analytics
-> BI System Disadvantages
Cost
Complexity
Limited use
Time Consuming Implementation
2. Explain the different between Traditional BI vs Self-Service BI?
3. Why is BI important?
- Measurement: creating KPI (Key Performance Indicators) based on historic data
- Identify and set benchmarks for varied processes.
- With BI systems organizations can identify market trends and spot business problems that need to be addressed.
- BI helps on data visualization that enhances the data quality and thereby the quality of decision making.
- BI systems can be used not just by enterprises but SME (Small and Medium Enterprises)
- To Improve Visibility:
- Do you know who the best performers are?
- Can you easily identify areas for improvement?
- Is stock going missing and you can’t identify where it’s going?
- To Turn Data into Actionable Information
- To Improve Efficiency
- To Gain Sales & Market Intelligence
- To Gain Competitive Intelligence
4. Explain the different between Star Schema, Snow Flake Schema, and Galaxy Schema? and create an example of those schema (3 schema)!
Overview of Star Schema
- What is star schema? The star schema architecture is the simplest data warehouse schema. It is called a star schema because the diagram resembles a star. The center of the star consists of fact table and the points of the star are the dimension tables.
- Fact Tables: A fact table typically has two types of columns: foreign keys to dimension tables and measures those that contain numeric facts. A fact table can contain fact’s data on detail or aggregated level.
- Dimension Tables: A dimension is a structure usually composed of one or more hierarchies that categorizes data. If a dimension hasn’t got a hierarchies and levels it is called flat dimension or list. The primary keys of each of the dimension tables are part of the composite primary key of the fact table.
Typical fact tables store data about sales while dimension tables data about geographic region(markets, cities) , clients, products, times, channels.
The main characteristics of star schema:
- Simple structure -> easy to understand schema
- Great query effectives -> small number of tables to join
- Relatively long time of loading data into dimension tables -> de-normalization, redundancy data caused that size of the table could be large.
- The most commonly used in the data warehouse implementations -> widely supported by a large number of business intelligence tools.
Overview of Snow flake schema
A Snowflake Schema is an extension of a Star Schema, and it adds additional dimensions. It is called snowflake because its diagram resembles a Snowflake.
The dimension tables are normalized which splits data into additional tables. In the following example, Country is further normalized into an individual table.
Characteristics of Snowflake Schema:
- The main benefit of the snowflake schema it uses smaller disk space.
- Easier to implement a dimension is added to the Schema
- Due to multiple tables query performance is reduced
- The primary challenge that you will face while using the snowflake Schema is that you need to perform more maintenance efforts because of the more lookup tables.
Star schema vs Snow Flake schema
What is a Galaxy schema?
A Galaxy Schema contains two fact table that shares dimension tables. It is also called Fact Constellation Schema. The schema is viewed as a collection of stars hence the name Galaxy Schema.
Characteristics of Galaxy Schema:
- The dimensions in this schema are separated into separate dimensions based on the various levels of hierarchy.
- For example, if geography has four levels of hierarchy like region, country, state, and city then Galaxy schema should have four dimensions.
- Moreover, it is possible to build this type of schema by splitting the one-star schema into more Star schemes.
- The dimensions are large in this schema which is needed to build based on the levels of hierarchy.
- This schema is helpful for aggregating fact tables for better understanding.
5. What is Business Intelligence and Self-service business intelligence (SSBI)
- The term Business Intelligence (BI) refers to technologies, applications and practices for the collection, integration, analysis, and presentation of business information. The purpose of Business Intelligence is to support better business decision making.
- Essentially, Business Intelligence systems are data-driven Decision Support Systems (DSS). Business Intelligence is sometimes used interchangeably with briefing books, report and query tools and executive information systems.
- Business intelligence (BI) combines business analytics, data mining, data visualization, data tools and infrastructure, and best practices to help organizations to make more data-driven decisions.
Self-service business intelligence (SSBI) involves the business systems and data analytics that give business end-users access to an organization’s information without direct IT involvement. Self-service Business intelligence gives end-users the ability to do more with their data without necessarily having technical skills. These solutions are usually created to be flexible and easy-to-use so that end-users can analyze data, make decisions, plan and forecast on their own.
Over the past few years, business intelligence has evolved to include more processes and activities to help improve performance. These processes include:
- Data mining: Using databases, statistics and machine learning to uncover trends in large datasets.
- Reporting: Sharing data analysis to stakeholders so they can draw conclusions and make decisions.
- Performance metrics and benchmarking: Comparing current performance data to historical data to track performance against goals, typically using customized dashboards.
- Descriptive analytics: Using preliminary data analysis to find out what happened.
- Querying: Asking the data specific questions, BI pulling the answers from the datasets.
- Statistical analysis: Taking the results from descriptive analytics and further exploring the data using statistics such as how this trend happened and why.
- Data visualization: Turning data analysis into visual representations such as charts, graphs, and histograms to more easily consume data.
- Visual analysis: Exploring data through visual storytelling to communicate insights on the fly and stay in the flow of analysis.
- Data preparation: Compiling multiple data sources, identifying the dimensions and measurements, preparing it for data analysis.
Change log update
- 25.09.2019
- 26.09.2019
- 28.09.2019
- 29.09.2019
- 02.09.2019
- 04.10.2019
- 07.10.2019
- 10.10.2019
LS0tDQp0aXRsZTogIkRhdGEgV2FyZWhvdXNlICYgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIg0Kc3VidGl0bGU6ICJMZWN0dXJlcyAmIERhdGEgTGFiIg0KYXV0aG9yOiAiQ2V2aSBIZXJkaWFuLCBNLiBTYywgU0ZDIChpdHNtZWNldmkuZ2l0aHViLmlvKSINCmRhdGU6ICIxMC4xMC4yMDE5Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICB0aGVtZTogY29zbW8NCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc1Jw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc1Jw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNScNCi0tLQ0KDQoNCioqTm90ZToqKg0KDQotQW4gUiBOb3RlYm9vayBpcyBhbiBSIE1hcmtkb3duIGRvY3VtZW50IHdpdGggY2h1bmtzIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGluZGVwZW5kZW50bHkgYW5kIGludGVyYWN0aXZlbHksIHdpdGggb3V0cHV0IHZpc2libGUgaW1tZWRpYXRlbHkgYmVuZWF0aCB0aGUgaW5wdXQuDQoNCi1Ob3RlYm9vayBvdXRwdXQgYXJlIGF2YWlsYWJsZSBhcyBIVE1MLCBQREYsIFdvcmQsIG9yIExhdGV4LiANCg0KLVRoaXMgTm90ZWJvb2sgYXMgSFRNTCBpcyBwcmVmZXJhYmx5IG9wZW4gd2l0aCBHb29nbGUgQ2hyb21lLg0KDQotUi1Db2RlIGNhbiBiZSBleHRyYWN0ZWQgYXMgUm1kIGZpbGUgdW5kZXIgdGhlIGJ1dHRvbiAiQ29kZSIgaW4gdGhlIG5vdGVib29rLg0KDQotVGhpcyBOb3RlYm9vayB1c2luZyBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQuIEl0IG1lYW5zIHRoZSBwcm9jZXNzIHN0YXJ0cyB3aXRoIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIGEgc21hbGwgc2V0IG9mIGlkZWEgcmVxdWlyZW1lbnRzIGFuZCBpdGVyYXRpdmVseSBlbmhhbmNlcyB0aGUgZXZvbHZpbmcgdmVyc2lvbnMgdW50aWwgdGhlIGNvbXBsZXRlIHZlcnNpb24gaXMgaW1wbGVtZW50ZWQgYW5kIHBlcmZlY3QuDQoNCg0KDQohW10oY292ZXIucG5nKQ0KDQoqKkdsb3NzYXJ5OiAqKg0KDQoqIEJJLT4gQnVzaW5lc3MgSW50ZWxsaWdlbmNlDQoqIERCTVMtPiBEYXRhYmFzZSBNYW5hZ2VtZW50IFN5c3RlbQ0KKiBSREJNUy0+IFJlbGF0aW9uYWwgRGF0YWJhc2UgTWFuYWdlbWVudCBTeXN0ZW0NCiogU1FMLT4gU3RydWN0dXJlZCBRdWVyeSBMYW5ndWFnZQ0KKiBPTFRQLT4gT25saW5lIFRyYW5zYWN0aW9uYWwgUHJvY2Vzc2luZy4gT0xUUCB0eXBpY2FsbHkgaW52b2x2ZXMgaW5zZXJ0aW5nLCB1cGRhdGluZywgYW5kL29yIGRlbGV0aW5nIHNtYWxsIGFtb3VudHMgb2YgZGF0YSBpbiBhIGRhdGFiYXNlLiANCiogT0xBUC0+IE9ubGluZSBhbmFseXRpY2FsIHByb2Nlc3NpbmcuIA0KDQoNCjxCcj4NCg0KDQojIE92ZXJ2aWV3DQoNCioqMS4gUmVmZXJlbmNlczogKioNCg0KKiBGZWVsIGZyZWUNCiogVGhpcyBtb2R1bCAob25seSBmb3IgdGVzdCkNCg0KKioyLiBNZXRob2RzOiAqKiBFTkpPWSBUSEUgTU9NRU5UIA0KDQoqKjMuIFRvb2xzOiAqKg0KDQoqIFRyZWxsbyBBcHBzLT4gcGxlYXNlIFNpZ24gdXAgdGhlIFRyZWxsbyAodHJlbGxvLmNvbSBvciBBcHAgU3RvcmU6IFRyZWxsbykNCiogV2hvIGlzIHRoZSBhZG1pbj8gYXMgYSBnaWZ0OiA1JSBhZGRpdGlvbmFsIHBvaW50DQoNCg0KKio0LiBDb250ZW50czogKioNCg0KKiBMZWN0dXJlcw0KKiBEYXRhIGxhYiAoaW1wbGVtZW50YXRpb24gb2Ygc29mdHdhcmUpDQoqIE1FUUEgKE1vY2sgRXhhbXMgUXVlc3Rpb25zIGFuZCBBbnN3ZXJzKQ0KKiBUZXN0LT4gb25lIEJJIHByb2plY3QgNTAlICsgKE11bHRpcGxlIENob2ljZSBBTkQvT1IgRXhwbGFuYXRpb24gVGVzdCBBTkQvT1IgVXNlIENhc2UpIDUwJQ0KKiBPbmUgb3B0aW9uYWwgQkkgcHJvamVjdCAoMTAlKQ0KDQoNCioqNS4gU29mdHdhcmU6ICoqIChPbiBQcmVtaXNlcyAmIENsb3VkKQ0KDQoNCg0KDQo+IE5vdGUhIFRoZSBiaWdnZXN0IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28gc3lzdGVtcyBpcyBob3cgdGhleSBhcmUgZGVwbG95ZWQuIENsb3VkLWJhc2VkIHNvZnR3YXJlIGlzIGhvc3RlZCBvbiB0aGUgdmVuZG9yJ3Mgc2VydmVycyBhbmQgYWNjZXNzZWQgdGhyb3VnaCBhIHdlYiBicm93c2VyLiBPbi1wcmVtaXNlIHNvZnR3YXJlIGlzIGluc3RhbGxlZCBsb2NhbGx5LCBvbiBhIGNvbXBhbnkncyBvd24gY29tcHV0ZXJzIGFuZCBzZXJ2ZXJzLg0KDQoNCiogRXhjZWwgQnVzaW5lc3MgSW50ZWxpZ2VuY2UNCiogUG93ZXIgQkkNCiogVGFibGVhdQ0KKiBQZW50YWhvDQoqIFNpc2Vuc2UNCiogQWx0ZXJ5eA0KKiBMb29rZXINCiogT3JhY2xlIEJJDQoqIE15U1FMIEJJDQoqIE1pY3Jvc29mdCBTUUwgU2VydmVyDQoqIFNBUCBCSQ0KKiBNaWNyb1N0cmF0ZWd5DQoqIFRJQkNPIFNwb3RmaXJlDQoqIERvbW8gQkkNCiogUWxpY2tWaWV3DQoqIFNBUyBCSQ0KKiBLbGlwZm9saW8NCiogR2Vja29ib2FyZA0KKiBIYWRvb3ANCiogSmFzcGVyc29mdA0KKiBab2hvIEFuYWx5dGljcw0KKiBQb3N0Z3JlU1FMDQoqIElCTSBEYjINCiogTW9uZ28gREINCi4NCi4NCi5ldGMNCg0KDQoNCioqNi4gV2UgbmVlZCBkYXRhISAqKg0KDQoqIGh0dHBzOi8vb3BlbmRhdGEuc29jcmF0YS5jb20vDQoqIGh0dHBzOi8vd3d3LmRhdGEuZ292Lw0KKiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy8NCiogaHR0cHM6Ly9hY2FkZW1pY3RvcnJlbnRzLmNvbS8NCiogaHR0cHM6Ly9kYXRhLndvcmxkLw0KKiBodHRwczovL3d3dy5xdWFuZGwuY29tLw0KKiBodHRwczovL2FyY2hpdmUuaWNzLnVjaS5lZHUvbWwvaW5kZXgucGhwDQoqIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vDQoqIGh0dHBzOi8vZGF0YS5nby5pZC9kYXRhc2V0P3E9c3ViYW5nDQoqIGh0dHA6Ly9kYXRhLmpha2FydGEuZ28uaWQvDQoqIGh0dHA6Ly9kYXRhLmJhbmR1bmcuZ28uaWQvDQoqIGh0dHBzOi8vb3BlbmRhdGEuc3ViYW5nLmdvLmlkLw0KKiBodHRwOi8vc2F0dWRhdGEuamFiYXJwcm92LmdvLmlkLyMNCg0KDQoNCioqNy4gRXh0cmFzOiAqKg0KDQoqIEhvdyB0byBjaG9vc2UgdGhlIG9uZSB0aGF0IGZpdCBvdXIgbmVlZHMhIA0KDQoxLiBGb2N1cyBvbiBZb3VyIEJ1c2luZXNzDQoyLiBBbmFseXplIFlvdXIgTmVlZHMNCjMuIERvIFJlc2VhcmNoDQo0LiBEb24ndCBTY3JpbXANCjUuIEFzayBmb3IgSGVscA0KNi4gQ3VzdG9taXplIEFwcHMgZm9yIFlvdXIgTmVlZHMNCjcuIEludGVncmF0ZSBFdmVyeXRoaW5nDQo4LiBHZXQgRXZlcnlvbmUgT25ib2FyZA0KOS4gQ29tbXVuaWNhdGUsIENvbW11bmljYXRlLCBDb21tdW5pY2F0ZQ0KMTAuIFNoYXJlIFlvdXIgRmF2b3JpdGUgU29mdHdhcmUNCg0KDQoNCiogQW55Ym9keSB3YW50cyB0byBnZXQgY2VydGlmaWNhdGU/IChvcHRpb25hbCkNCg0KMS4gaHR0cHM6Ly93d3cuZWR4Lm9yZy8NCjIuIGh0dHBzOi8vd3d3Lmx5bmRhLmNvbS8NCjMuIGh0dHBzOi8vd3d3LnVkYWNpdHkuY29tLw0KNC4gaHR0cHM6Ly93d3cudWRlbXkuY29tLw0KNS4gaHR0cHM6Ly9jb2duaXRpdmVjbGFzcy5haS8NCg0KDQoNCg0KDQoNCiMgRGF0YWJhc2UNCg0KDQoqKldoYXQgaXMgYSBEYXRhPyAqKg0KDQoqIERhdGEgaXMgYSBjb2xsZWN0aW9uIG9mIGZhY3RzLCBzdWNoIGFzIG51bWJlcnMsIHdvcmRzLCBtZWFzdXJlbWVudHMsIG9ic2VydmF0aW9ucyBvciBldmVuIGp1c3QgZGVzY3JpcHRpb25zIG9mIHRoaW5ncy4NCg0KKiBJbiBnZW5lcmFsLCBkYXRhIGlzIGFueSBzZXQgb2YgY2hhcmFjdGVycyB0aGF0IGlzIGdhdGhlcmVkIGFuZCB0cmFuc2xhdGVkIGZvciBzb21lIHB1cnBvc2UsIHVzdWFsbHkgYW5hbHlzaXMuIEl0IGNhbiBiZSBhbnkgY2hhcmFjdGVyLCBpbmNsdWRpbmcgdGV4dCBhbmQgbnVtYmVycywgcGljdHVyZXMsIHNvdW5kLCBvciB2aWRlby4gSWYgZGF0YSBpcyBub3QgcHV0IGludG8gY29udGV4dCwgaXQgZG9lc24ndCBkbyBhbnl0aGluZyB0byBhIGh1bWFuIG9yIGNvbXB1dGVyLg0KDQoqIERhdGEgY2FuIGJlIHF1YWxpdGF0aXZlIG9yIHF1YW50aXRhdGl2ZS4gX19QdXQgc2ltcGx5OiBEaXNjcmV0ZSBkYXRhIGlzIGNvdW50ZWQsIENvbnRpbnVvdXMgZGF0YSBpcyBtZWFzdXJlZF9fLiANCg0KICAgICogUXVhbGl0YXRpdmUgZGF0YSBpcyBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiAoaXQgZGVzY3JpYmVzIHNvbWV0aGluZykNCiAgICAqIFF1YW50aXRhdGl2ZSBkYXRhIGlzIG51bWVyaWNhbCBpbmZvcm1hdGlvbiAobnVtYmVycyktPiBEaXNjcmV0ZSg1LDYsMTApOyBDb250aW51b3VzICgzLDE0KQ0KICAgICAgDQoqIEV4YW1wbGU6IFdoYXQgZG8gd2Uga25vdyBhYm91dCBJbmRvbmVzaWEncyBmbGFnLCBsZW5ndGg9d2lkdGggMTAgY20sIHdoaXRlIGFuZCByZWQgY29sb3I/DQoNCg0KIVtdKGZsYWcxLnBuZykNCg0KDQoNCg0KDQpgYGB7cn0NCiNRdWFsaXRhdGl2ZTogVGhlIGZsYWcgaGFzIHdoaXRlIGFuZCByZWQgY29sb3INCg0KI1F1YW50aXRhdGl2ZTogVGhlIGZsYWcgaGFzIGxlbmd0aCAxMCBjbSBhbmQgd2lkdGggMTAgY20gKG9ubHkgcXVhbnRpdGF0aXZlIGRpc2NyZXRlKQ0KYGBgDQoNCg0KDQoNCg0KKipXaGF0IGlzIGEgRGF0YWJhc2U/ICoqDQoNCiogQSBkYXRhYmFzZSBpcyBhIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBkYXRhIHdoaWNoIHJlcHJlc2VudHMgc29tZSBhc3BlY3Qgb2YgdGhlIHJlYWwgd29ybGQuIEEgZGF0YWJhc2Ugc3lzdGVtIGlzIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IGFuZCBwb3B1bGF0ZWQgd2l0aCBkYXRhIGZvciBhIGNlcnRhaW4gdGFzay4NCg0KKiBBIGRhdGFiYXNlIGlzIGFuIGVsZWN0cm9uaWMgYWRtaW5pc3RyYXRpb24gc3lzdGVtIHRoYXQgaGFzIHRvIGhhbmRsZSBsYXJnZSBhbW91bnRzIG9mIGRhdGEgZWZmaWNpZW50bHksIHdpdGhvdXQgY29udHJhZGljdGlvbiwgcGVybWFuZW50bHkgYW5kIGNhbiByZXByZXNlbnQgbG9naWNhbCByZWxhdGlvbnNoaXBzIGRpZ2l0YWxseS4NCg0KKiBBIGRhdGFiYXNlIGlzIGFuIG9yZ2FuaXplZCBjb2xsZWN0aW9uIG9mIHN0cnVjdHVyZWQgaW5mb3JtYXRpb24sIG9yIGRhdGEsIHR5cGljYWxseSBzdG9yZWQgZWxlY3Ryb25pY2FsbHkgaW4gYSBjb21wdXRlciBzeXN0ZW0uIEEgZGF0YWJhc2UgaXMgdXN1YWxseSBjb250cm9sbGVkIGJ5IGEgX19kYXRhYmFzZSBtYW5hZ2VtZW50IHN5c3RlbSAoREJNUylfXy4gVG9nZXRoZXIsIHRoZSBkYXRhIGFuZCB0aGUgREJNUywgYWxvbmcgd2l0aCB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBhcmUgcmVmZXJyZWQgdG8gYXMgYSBkYXRhYmFzZSBzeXN0ZW0sIG9mdGVuIHNob3J0ZW5lZCB0byBqdXN0IGRhdGFiYXNlLg0KDQoqIERhdGEgd2l0aGluIHRoZSBtb3N0IGNvbW1vbiB0eXBlcyBvZiBkYXRhYmFzZXMgaW4gb3BlcmF0aW9uIHRvZGF5IGlzIHR5cGljYWxseSBtb2RlbGVkIGluIHJvd3MgYW5kIGNvbHVtbnMgaW4gYSBzZXJpZXMgb2YgdGFibGVzIHRvIG1ha2UgcHJvY2Vzc2luZyBhbmQgZGF0YSBxdWVyeWluZyBlZmZpY2llbnQuIFRoZSBkYXRhIGNhbiB0aGVuIGJlIGVhc2lseSBhY2Nlc3NlZCwgbWFuYWdlZCwgbW9kaWZpZWQsIHVwZGF0ZWQsIGNvbnRyb2xsZWQsIGFuZCBvcmdhbml6ZWQuIE1vc3QgZGF0YWJhc2VzIHVzZSBfX3N0cnVjdHVyZWQgcXVlcnkgbGFuZ3VhZ2UgKFNRTClfXyBmb3Igd3JpdGluZyBhbmQgcXVlcnlpbmcgZGF0YS4NCg0KKiBBIGRhdGFiYXNlIHR5cGljYWxseSByZXF1aXJlcyBhIGNvbXByZWhlbnNpdmUgZGF0YWJhc2Ugc29mdHdhcmUgcHJvZ3JhbSBrbm93biBhcyBhIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtIChEQk1TKS4gQSBEQk1TIHNlcnZlcyBhcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgZGF0YWJhc2UgYW5kIGl0cyBlbmQgdXNlcnMgb3IgcHJvZ3JhbXMsIGFsbG93aW5nIHVzZXJzIHRvIHJldHJpZXZlLCB1cGRhdGUsIGFuZCBtYW5hZ2UgaG93IHRoZSBpbmZvcm1hdGlvbiBpcyBvcmdhbml6ZWQgYW5kIG9wdGltaXplZC4gQSBEQk1TIGFsc28gZmFjaWxpdGF0ZXMgb3ZlcnNpZ2h0IGFuZCBjb250cm9sIG9mIGRhdGFiYXNlcywgZW5hYmxpbmcgYSB2YXJpZXR5IG9mIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnMgc3VjaCBhcyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLCB0dW5pbmcsIGFuZCBiYWNrdXAgYW5kIHJlY292ZXJ5LiBTb21lIGV4YW1wbGVzIG9mIHBvcHVsYXIgZGF0YWJhc2Ugc29mdHdhcmUgb3IgREJNU3MgaW5jbHVkZSBfX015U1FMX18sIF9fTWljcm9zb2Z0IEFjY2Vzc19fLCBfX01pY3Jvc29mdCBTUUwgU2VydmVyX18sIF9fRmlsZU1ha2VyIFByb19fLCBfX09yYWNsZSBEYXRhYmFzZV9fLCBhbmQgX19kQkFTRV9fLg0KDQoNCioqV2hhdCBJcyBTdHJ1Y3R1cmVkIFF1ZXJ5IExhbmd1YWdlIChTUUwpPyAqKg0KDQoqIFNRTCBpcyBhIHByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgYnkgbmVhcmx5IGFsbCByZWxhdGlvbmFsIGRhdGFiYXNlcyB0byBxdWVyeSwgbWFuaXB1bGF0ZSwgYW5kIGRlZmluZSBkYXRhLCBhbmQgdG8gcHJvdmlkZSBhY2Nlc3MgY29udHJvbC4gU1FMIHdhcyBmaXJzdCBkZXZlbG9wZWQgYXQgSUJNIGluIHRoZSAxOTcwcyB3aXRoIE9yYWNsZSBhcyBhIG1ham9yIGNvbnRyaWJ1dG9yLCB3aGljaCBsZWQgdG8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNRTCBBTlNJIHN0YW5kYXJkLCBTUUwgaGFzIHNwdXJyZWQgbWFueSBleHRlbnNpb25zIGZyb20gY29tcGFuaWVzIHN1Y2ggYXMgSUJNLCBPcmFjbGUsIGFuZCBNaWNyb3NvZnQuIEFsdGhvdWdoIFNRTCBpcyBzdGlsbCB3aWRlbHkgdXNlZCB0b2RheSwgbmV3IHByb2dyYW1taW5nIGxhbmd1YWdlcyBhcmUgYmVnaW5uaW5nIHRvIGFwcGVhciAoX19leGFtcGxlOiBOb1NRTF9fKS4NCg0KDQoqKldoYXQncyB0aGUgRGlmZmVyZW5jZSBCZXR3ZWVuIGEgRGF0YWJhc2UgYW5kIGEgU3ByZWFkc2hlZXQ/ICoqDQoNCkRhdGFiYXNlcyBhbmQgc3ByZWFkc2hlZXRzIChzdWNoIGFzIE1pY3Jvc29mdCBFeGNlbCkgYXJlIGJvdGggY29udmVuaWVudCB3YXlzIHRvIHN0b3JlIGluZm9ybWF0aW9uLiBUaGUgcHJpbWFyeSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gYXJlOg0KDQogICogSG93IHRoZSBkYXRhIGlzIHN0b3JlZCBhbmQgbWFuaXB1bGF0ZWQNCiAgKiBXaG8gY2FuIGFjY2VzcyB0aGUgZGF0YQ0KICAqIEhvdyBtdWNoIGRhdGEgY2FuIGJlIHN0b3JlZA0KDQpTcHJlYWRzaGVldHMgd2VyZSBvcmlnaW5hbGx5IGRlc2lnbmVkIGZvciBvbmUgdXNlciwgYW5kIHRoZWlyIGNoYXJhY3RlcmlzdGljcyByZWZsZWN0IHRoYXQuIFRoZXkncmUgZ3JlYXQgZm9yIGEgc2luZ2xlIHVzZXIgb3Igc21hbGwgbnVtYmVyIG9mIHVzZXJzIHdobyBkb24ndCBuZWVkIHRvIGRvIGEgbG90IG9mIGluY3JlZGlibHkgY29tcGxpY2F0ZWQgZGF0YSBtYW5pcHVsYXRpb24uIERhdGFiYXNlcywgb24gdGhlIG90aGVyIGhhbmQsIGFyZSBkZXNpZ25lZCB0byBob2xkIG11Y2ggbGFyZ2VyIGNvbGxlY3Rpb25zIG9mIG9yZ2FuaXplZCBpbmZvcm1hdGlvbi1tYXNzaXZlIGFtb3VudHMsIHNvbWV0aW1lcy4gRGF0YWJhc2VzIGFsbG93IG11bHRpcGxlIHVzZXJzIGF0IHRoZSBzYW1lIHRpbWUgdG8gcXVpY2tseSBhbmQgc2VjdXJlbHkgYWNjZXNzIGFuZCBxdWVyeSB0aGUgZGF0YSB1c2luZyBoaWdobHkgY29tcGxleCBsb2dpYyBhbmQgbGFuZ3VhZ2UuDQoNCg0KKipXaGF0IGlzIERCTVM/KioNCg0KKiBEYXRhYmFzZSBNYW5hZ2VtZW50IFN5c3RlbSAoYWxzbyBrbm93biBhcyBEQk1TKSBpcyBhIHNvZnR3YXJlIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHVzZXJzJyBkYXRhIGJ5IGNvbnNpZGVyaW5nIGFwcHJvcHJpYXRlIHNlY3VyaXR5IG1lYXN1cmVzLiBJdCBhbGxvd3MgdXNlcnMgdG8gY3JlYXRlIHRoZWlyIG93biBkYXRhYmFzZXMgYXMgcGVyIHRoZWlyIHJlcXVpcmVtZW50Lg0KKiBJdCBjb25zaXN0cyBvZiBhIGdyb3VwIG9mIHByb2dyYW1zIHdoaWNoIG1hbmlwdWxhdGUgdGhlIGRhdGFiYXNlIGFuZCBwcm92aWRlIGFuIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBkYXRhYmFzZS4gSXQgaW5jbHVkZXMgdGhlIHVzZXIgb2YgdGhlIGRhdGFiYXNlIGFuZCBvdGhlciBhcHBsaWNhdGlvbiBwcm9ncmFtcy4NCiogVGhlIERCTVMgYWNjZXB0cyB0aGUgcmVxdWVzdCBmb3IgZGF0YSBmcm9tIGFuIGFwcGxpY2F0aW9uIGFuZCBpbnN0cnVjdHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gcHJvdmlkZSB0aGUgc3BlY2lmaWMgZGF0YS4gSW4gbGFyZ2Ugc3lzdGVtcywgYSBEQk1TIGhlbHBzIHVzZXJzIGFuZCBvdGhlciB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4NCiogQSBkYXRhYmFzZSB0eXBpY2FsbHkgcmVxdWlyZXMgYSBjb21wcmVoZW5zaXZlIGRhdGFiYXNlIHNvZnR3YXJlIHByb2dyYW0ga25vd24gYXMgYSBkYXRhYmFzZSBtYW5hZ2VtZW50IHN5c3RlbSAoREJNUykuIEEgREJNUyBzZXJ2ZXMgYXMgYW4gaW50ZXJmYWNlIGJldHdlZW4gdGhlIGRhdGFiYXNlIGFuZCBpdHMgZW5kIHVzZXJzIG9yIHByb2dyYW1zLCBhbGxvd2luZyB1c2VycyB0byByZXRyaWV2ZSwgdXBkYXRlLCBhbmQgbWFuYWdlIGhvdyB0aGUgaW5mb3JtYXRpb24gaXMgb3JnYW5pemVkIGFuZCBvcHRpbWl6ZWQuIEEgREJNUyBhbHNvIGZhY2lsaXRhdGVzIG92ZXJzaWdodCBhbmQgY29udHJvbCBvZiBkYXRhYmFzZXMsIGVuYWJsaW5nIGEgdmFyaWV0eSBvZiBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zIHN1Y2ggYXMgcGVyZm9ybWFuY2UgbW9uaXRvcmluZywgdHVuaW5nLCBhbmQgYmFja3VwIGFuZCByZWNvdmVyeS4NCiogU29tZSBleGFtcGxlcyBvZiBwb3B1bGFyIGRhdGFiYXNlIHNvZnR3YXJlIG9yIERCTVNzIGluY2x1ZGUgTXlTUUwsIE1pY3Jvc29mdCBBY2Nlc3MsIE1pY3Jvc29mdCBTUUwgU2VydmVyLCBGaWxlTWFrZXIgUHJvLCBPcmFjbGUgRGF0YWJhc2UsIGFuZCBkQkFTRS4NCg0KDQoqKkV4YW1wbGUgb2YgYSBEQk1TIChleGFjdGx5OiBSREJNUywgc2VlIG9uIHRoZSB0eXBlcyBvZiBkYXRhYmFzZXMpICoqDQoNCkxldCB1cyBzZWUgYSBzaW1wbGUgZXhhbXBsZSBvZiBVbnN1YiBkYXRhYmFzZS4gVGhpcyBkYXRhYmFzZSBpcyBtYWludGFpbmluZyBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHN0dWRlbnRzLCBjb3Vyc2VzLCBhbmQgZ3JhZGVzIGluIGEgdW5pdmVyc2l0eSBlbnZpcm9ubWVudC4gVGhlIGRhdGFiYXNlIGlzIG9yZ2FuaXplZCBhcyBmaXZlIGZpbGVzOiANCg0KKiBUaGUgU1RVREVOVCBmaWxlIHN0b3JlcyBkYXRhIG9mIGVhY2ggc3R1ZGVudA0KKiBUaGUgQ09VUlNFIGZpbGUgc3RvcmVzIGNvbnRhaW4gZGF0YSBvbiBlYWNoIGNvdXJzZS4NCiogVGhlIEdSQURFIGZpbGUgc3RvcmVzIHRoZSBncmFkZXMgd2hpY2ggc3R1ZGVudHMgcmVjZWl2ZSBpbiB0aGUgdmFyaW91cyBzZWN0aW9ucw0KKiBUaGUgVFVUT1IgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHR1dG9yLg0KDQotPlRvIGRlZmluZSBhIGRhdGFiYXNlIHN5c3RlbToNCg0KMS4gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJlY29yZHMgb2YgZWFjaCBmaWxlIGJ5IGRlZmluaW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBlbGVtZW50cyB0byBiZSBzdG9yZWQgaW4gZWFjaCByZWNvcmQuDQoNCjIuIFdlIGNhbiBhbHNvIHVzZSBhIGNvZGluZyBzY2hlbWUgdG8gcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSBkYXRhIGl0ZW0uDQoNCjMuIEJhc2ljYWxseSwgeW91ciBEYXRhYmFzZSB3aWxsIGhhdmUgNSB0YWJsZXMgd2l0aCBhIGZvcmVpZ24ga2V5IGRlZmluZWQgYW1vbmdzdCB0aGUgdmFyaW91cyB0YWJsZXMuDQoNCiFbXShwcmltYXJ5LWZvcmVpZ24ta2V5LnBuZykNCg0KLT5FeGFtcGxlOiBDcmVhdGUgdGhlIFVuc3ViIGRhdGFiYXNlIHdpdGggdGhlIGZvbGxvd2luZyBkYXRhIChzZWUgdGhlIGFib3ZlIHBpY3QuIGFzIGV4YW1wbGUpDQoNClNUVURFTlQ6IEEsIEIsIEMsIEQsIEUNCg0KQ09VUlNFOiBNYXRoLCBCaW8sIEFydCwgQkksIERhdGENCg0KR1JBREU6IDEwMCwgOTAsIDgwLCA1MCwgOTUNCg0KVFVUT1I6IEYsIEcsIEgsIEksIEoNCg0KDQoNCmBgYHtyfQ0KI1NlZSBvbiB0aGUgV0hJVEVCT0FSRCENCmBgYA0KDQoNCg0KDQoqKkhpc3Rvcnkgb2YgREJNUyAqKg0KDQpIZXJlLCBhcmUgdGhlIGltcG9ydGFudCBsYW5kbWFya3MgZnJvbSB0aGUgaGlzdG9yeToNCg0KKiAxOTYwIC0gQ2hhcmxlcyBCYWNobWFuIGRlc2lnbmVkIGZpcnN0IERCTVMgc3lzdGVtDQoqIDE5NzAgLSBDb2RkIGludHJvZHVjZWQgSUJNJ1MgSW5mb3JtYXRpb24gTWFuYWdlbWVudCBTeXN0ZW0gKElNUykNCiogMTk3Ni0gUGV0ZXIgQ2hlbiBjb2luZWQgYW5kIGRlZmluZWQgdGhlIEVudGl0eS1yZWxhdGlvbnNoaXAgbW9kZWwgYWxzbyBrbm93IGFzIHRoZSBFUiBtb2RlbA0KKiAxOTgwIC0gUmVsYXRpb25hbCBNb2RlbCBiZWNvbWVzIGEgd2lkZWx5IGFjY2VwdGVkIGRhdGFiYXNlIGNvbXBvbmVudA0KKiAxOTg1LSBPYmplY3Qtb3JpZW50ZWQgREJNUyBkZXZlbG9wcy4NCiogMTk5MHMtIEluY29ycG9yYXRpb24gb2Ygb2JqZWN0LW9yaWVudGF0aW9uIGluIHJlbGF0aW9uYWwgREJNUy4NCiogMTk5MS0gTWljcm9zb2Z0IHNoaXBzIE1TIGFjY2VzcywgYSBwZXJzb25hbCBEQk1TIGFuZCB0aGF0IGRpc3BsYWNlcyBhbGwgb3RoZXIgcGVyc29uYWwgREJNUyBwcm9kdWN0cy4NCiogMTk5NTogRmlyc3QgSW50ZXJuZXQgZGF0YWJhc2UgYXBwbGljYXRpb25zDQoqIDE5OTc6IFhNTCBhcHBsaWVkIHRvIGRhdGFiYXNlIHByb2Nlc3NpbmcuIE1hbnkgdmVuZG9ycyBiZWdpbiB0byBpbnRlZ3JhdGUgWE1MIGludG8gREJNUyBwcm9kdWN0cy4NCiogMjAwMHM6IE5ldyBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMgd2VyZSBkZXZlbG9wZWQgZm9yIFBEQXMsIHBvaW50LW9mLXNhbGUgdHJhbnNhY3Rpb25zLCBhbmQgY29uc29saWRhdGlvbiBvZiB2ZW5kb3JzLiBQcmVzZW50bHksIHRoZSB0aHJlZSBsZWFkaW5nIGRhdGFiYXNlIGNvbXBhbmllcyBpbiB0aGUgd2VzdGVybiB3b3JsZCBhcmUgTWljcm9zb2Z0LCBJQk0sIGFuZCBPcmFjbGUuDQoqIFRvZGF5LCBkYXRhYmFzZXMgYXJlIGV2ZXJ5d2hlcmUgYW5kIGFyZSB1c2VkIHRvIGVuaGFuY2Ugb3VyIGRheS10by1kYXkgbGlmZS4gRnJvbSBwZXJzb25hbCBjbG91ZCBzdG9yYWdlIHRvIHByZWRpY3RpbmcgdGhlIHdlYXRoZXIsIG1hbnkgb2YgdGhlIHNlcnZpY2VzIHdlIHV0aWxpemUgdG9kYXkgYXJlIHBvc3NpYmxlIGR1ZSB0byBkYXRhYmFzZXMuIFByZXNlbnRseSwgdGhlcmUgYXJlIG1hbnkgbmV3IHBsYXllcnMgaW4gdGhlIF9fbm9uLXJlbGF0aW9uYWwgZGF0YWJhc2VfXyBzcGFjZSBvZmZlcmluZyBzcGVjaWZpYyBzb2x1dGlvbnMuIFNvbWUgb2YgdGhlIGN1cnJlbnQgcmVsYXRpb25hbCBkYXRhYmFzZXMgaW5jbHVkZSBnaWFudHMgc3VjaCBhcyBPcmFjbGUsIE15U1FMLCBhbmQgREIyLg0KDQoNClRoZSBib29tIGluIHVuc3RydWN0dXJlZCBkYXRhIHRoYXQgdGhlIHdvcmxkIGhhcyBzZWVuIGluIHRoZSBsYXN0IGZldyB5ZWFycyBpcyBvbmUgb2YgdGhlIG1haW4gcmVhc29ucyByZWxhdGlvbmFsIGRhdGFiYXNlcyBhcmUgbm8gbG9uZ2VyIHN1ZmZpY2llbnQgZm9yIG1hbnkgY29tcGFuaWVzJyBuZWVkcy4gSXQgY29tZXMgdXAgX19ub24tcmVsYXRpb25hbCBkYXRhYmFzZV9fIChub3QgaW4gdGhpcyBsZWN0dXJlISkuIA0KDQoNCioqQ2hhcmFjdGVyaXN0aWNzIG9mIERhdGFiYXNlIE1hbmFnZW1lbnQgU3lzdGVtICoqDQoNCiogUHJvdmlkZXMgc2VjdXJpdHkgYW5kIHJlbW92ZXMgcmVkdW5kYW5jeQ0KKiBTZWxmLWRlc2NyaWJpbmcgbmF0dXJlIG9mIGEgZGF0YWJhc2Ugc3lzdGVtDQoqIEluc3VsYXRpb24gYmV0d2VlbiBwcm9ncmFtcyBhbmQgZGF0YSBhYnN0cmFjdGlvbg0KKiBTdXBwb3J0IG9mIG11bHRpcGxlIHZpZXdzIG9mIHRoZSBkYXRhDQoqIFNoYXJpbmcgb2YgZGF0YSBhbmQgbXVsdGl1c2VyIHRyYW5zYWN0aW9uIHByb2Nlc3NpbmcNCiogREJNUyBhbGxvd3MgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBhbW9uZyB0aGVtIHRvIGZvcm0gdGFibGVzLg0KKiBJdCBmb2xsb3dzIHRoZSBBQ0lEIGNvbmNlcHQgKCBBdG9taWNpdHksIENvbnNpc3RlbmN5LCBJc29sYXRpb24sIGFuZCBEdXJhYmlsaXR5KS4NCiogREJNUyBzdXBwb3J0cyBtdWx0aS11c2VyIGVudmlyb25tZW50IHRoYXQgYWxsb3dzIHVzZXJzIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSBkYXRhIGluIHBhcmFsbGVsLg0KDQoNCg0KKipEQk1TIHZzLiBGbGF0IEZpbGUgKioNCg0KDQohW10odnNmbGF0LnBuZykNCg0KDQoNCg0KKipQb3B1bGFyIERCTVMgU29mdHdhcmUgKioNCg0KSGVyZSwgaXMgdGhlIGxpc3Qgb2Ygc29tZSBwb3B1bGFyIERCTVMgc3lzdGVtOg0KDQoqIE15U1FMDQoqIE1pY3Jvc29mdCBBY2Nlc3MNCiogT3JhY2xlDQoqIFBvc3RncmVTUUwNCiogZEJBU0UNCiogRm94UHJvDQoqIFNRTGl0ZQ0KKiBJQk0gREIyDQoqIExpYnJlT2ZmaWNlIEJhc2UNCiogTWFyaWFEQg0KKiBNaWNyb3NvZnQgU1FMIFNlcnZlciBldGMuDQoNCg0KDQoqKkFwcGxpY2F0aW9uIG9mIERCTVMgKioNCg0KDQohW10oYXBwbGljYXRpb25kYm1zLnBuZykNCg0KDQoNCg0KKipUeXBlcyBvZiBEYXRhYmFzZXMgKioNCg0KVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGFiYXNlcy4gVGhlIGJlc3QgZGF0YWJhc2UgZm9yIGEgc3BlY2lmaWMgb3JnYW5pemF0aW9uIGRlcGVuZHMgb24gaG93IHRoZSBvcmdhbml6YXRpb24gaW50ZW5kcyB0byB1c2UgdGhlIGRhdGEuDQoNCiAgICANCiAgKiBfX1JlbGF0aW9uYWwgZGF0YWJhc2VzX18uIFJlbGF0aW9uYWwgZGF0YWJhc2VzIGJlY2FtZSBkb21pbmFudCBpbiB0aGUgMTk4MHMuIEl0ZW1zIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBhcmUgb3JnYW5pemVkIGFzIGEgc2V0IG9mIHRhYmxlcyB3aXRoIGNvbHVtbnMgYW5kIHJvd3MuIFJlbGF0aW9uYWwgZGF0YWJhc2UgdGVjaG5vbG9neSBwcm92aWRlcyB0aGUgbW9zdCBlZmZpY2llbnQgYW5kIGZsZXhpYmxlIHdheSB0byBhY2Nlc3Mgc3RydWN0dXJlZCBpbmZvcm1hdGlvbi4gDQogIA0KIVtdKHJlbGF0aW9uYWwucG5nKSAgDQogIA0KICANCiAgDQogICogX19PYmplY3Qtb3JpZW50ZWQgZGF0YWJhc2VzX18uIEluZm9ybWF0aW9uIGluIGFuIG9iamVjdC1vcmllbnRlZCBkYXRhYmFzZSBpcyByZXByZXNlbnRlZCBpbiB0aGUgZm9ybSBvZiBvYmplY3RzLCBhcyBpbiBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcuIE9iamVjdCBvcmllbnRlZCBkYXRhIG1vZGVsIGlzIG9uZSBvZiB0aGUgZGV2ZWxvcGVkIGRhdGEgbW9kZWwgYW5kIHRoaXMgY2FuIGhvbGQgdGhlIGF1ZGlvLCB2aWRlbyBhbmQgZ3JhcGhpYyBmaWxlcy4NCiAgDQohW10ob29kYm1zLmpwZykgDQoNCg0KICAqIF9fRGlzdHJpYnV0ZWQgZGF0YWJhc2VzX18uIEEgZGlzdHJpYnV0ZWQgZGF0YWJhc2UgY29uc2lzdHMgb2YgdHdvIG9yIG1vcmUgZmlsZXMgbG9jYXRlZCBpbiBkaWZmZXJlbnQgc2l0ZXMuIFRoZSBkYXRhYmFzZSBtYXkgYmUgc3RvcmVkIG9uIG11bHRpcGxlIGNvbXB1dGVycywgbG9jYXRlZCBpbiB0aGUgc2FtZSBwaHlzaWNhbCBsb2NhdGlvbiwgb3Igc2NhdHRlcmVkIG92ZXIgZGlmZmVyZW50IG5ldHdvcmtzLiBfX1NlZSBhbHNvIGRpc3RyaWJ1dGVkIGNvbXB1dGluZyBvciBkaXN0cmlidXRlZCBzeXN0ZW0gb24gYmlnIGRhdGEhX18NCiAgDQoNCiFbXShkaXN0cmlidXRlZC5qcGcpIA0KDQoNCiAgKiBfX0RhdGEgd2FyZWhvdXNlc19fLiBBIGNlbnRyYWwgcmVwb3NpdG9yeSBmb3IgZGF0YSwgYSBkYXRhIHdhcmVob3VzZSBpcyBhIHR5cGUgb2YgZGF0YWJhc2Ugc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBmYXN0IHF1ZXJ5IGFuZCBhbmFseXNpcy4NCg0KIVtdKGRhdGFiYXNldnNkYXRhd2FyZWhvdXNlLnBuZykNCiAgDQoNCiAgKiBfX05vU1FMIGRhdGFiYXNlc19fLiBBIE5vU1FMLCBvciBub25yZWxhdGlvbmFsIGRhdGFiYXNlLCBhbGxvd3MgdW5zdHJ1Y3R1cmVkIGFuZCBzZW1pc3RydWN0dXJlZCBkYXRhIHRvIGJlIHN0b3JlZCBhbmQgbWFuaXB1bGF0ZWQgKGluIGNvbnRyYXN0IHRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZSwgd2hpY2ggZGVmaW5lcyBob3cgYWxsIGRhdGEgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UgbXVzdCBiZSBjb21wb3NlZCkuIE5vU1FMIGRhdGFiYXNlcyBncmV3IHBvcHVsYXIgYXMgd2ViIGFwcGxpY2F0aW9ucyBiZWNhbWUgbW9yZSBjb21tb24gYW5kIG1vcmUgY29tcGxleC4NCiAgDQohW10oc3Fsbm9zcWwucG5nKQ0KDQoNCiAgKiBfX0dyYXBoIGRhdGFiYXNlc19fLiBBIGdyYXBoIGRhdGFiYXNlIHN0b3JlcyBkYXRhIGluIHRlcm1zIG9mIGVudGl0aWVzIGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGVudGl0aWVzLg0KICANCiFbXShncmFwaGRhdGFiYXNlLnBuZykNCiAgDQogICogX19PTFRQIGRhdGFiYXNlc19fLiBBbiBPTFRQIGRhdGFiYXNlIGlzIGEgc3BlZWR5LCBhbmFseXRpYyBkYXRhYmFzZSBkZXNpZ25lZCBmb3IgbGFyZ2UgbnVtYmVycyBvZiB0cmFuc2FjdGlvbnMgcGVyZm9ybWVkIGJ5IG11bHRpcGxlIHVzZXJzLiANCiAgDQoNCg0KIVtdKG9sdHAucG5nKQ0KDQo8QnI+DQoNCg0KVGhlc2UgYXJlIG9ubHkgYSBmZXcgb2YgdGhlIHNldmVyYWwgZG96ZW4gdHlwZXMgb2YgZGF0YWJhc2VzIGluIHVzZSB0b2RheS4gT3RoZXIsIGxlc3MgY29tbW9uIGRhdGFiYXNlcyBhcmUgdGFpbG9yZWQgdG8gdmVyeSBzcGVjaWZpYyBzY2llbnRpZmljLCBmaW5hbmNpYWwsIG9yIG90aGVyIGZ1bmN0aW9ucy4gSW4gYWRkaXRpb24gdG8gdGhlIGRpZmZlcmVudCBkYXRhYmFzZSB0eXBlcywgY2hhbmdlcyBpbiB0ZWNobm9sb2d5IGRldmVsb3BtZW50IGFwcHJvYWNoZXMgYW5kIGRyYW1hdGljIGFkdmFuY2VzIHN1Y2ggYXMgdGhlIGNsb3VkIGFuZCBhdXRvbWF0aW9uIGFyZSBwcm9wZWxsaW5nIGRhdGFiYXNlcyBpbiBlbnRpcmVseSBuZXcgZGlyZWN0aW9ucy4gU29tZSBvZiB0aGUgbGF0ZXN0IGRhdGFiYXNlcyBpbmNsdWRlDQoNCiAgKiBfX09wZW4gc291cmNlIGRhdGFiYXNlc19fLiBBbiBvcGVuIHNvdXJjZSBkYXRhYmFzZSBzeXN0ZW0gaXMgb25lIHdob3NlIHNvdXJjZSBjb2RlIGlzIG9wZW4gc291cmNlOyBzdWNoIGRhdGFiYXNlcyBjb3VsZCBiZSBTUUwgb3IgTm9TUUwgZGF0YWJhc2VzLg0KICANCiFbXShvc2RhdGFiYXNlLnBuZykNCg0KDQogICogX19DbG91ZCBkYXRhYmFzZXNfXy4gQSBjbG91ZCBkYXRhYmFzZSBpcyBhIGNvbGxlY3Rpb24gb2YgZGF0YSwgZWl0aGVyIHN0cnVjdHVyZWQgb3IgdW5zdHJ1Y3R1cmVkLCB0aGF0IHJlc2lkZXMgb24gYSBwcml2YXRlLCBwdWJsaWMsIG9yIGh5YnJpZCBjbG91ZCBjb21wdXRpbmcgcGxhdGZvcm0uIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY2xvdWQgZGF0YWJhc2UgbW9kZWxzOiB0cmFkaXRpb25hbCBhbmQgZGF0YWJhc2UgYXMgYSBzZXJ2aWNlIChEQmFhUykuIFdpdGggREJhYVMsIGFkbWluaXN0cmF0aXZlIHRhc2tzIGFuZCBtYWludGVuYW5jZSBhcmUgcGVyZm9ybWVkIGJ5IGEgc2VydmljZSBwcm92aWRlci4NCg0KIVtdKGNsb3VkZGF0YWJhc2UucG5nKQ0KDQoNCiAgKiBfX011bHRpbW9kZWwgZGF0YWJhc2VfXy4gTXVsdGltb2RlbCBkYXRhYmFzZXMgY29tYmluZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YWJhc2UgbW9kZWxzIGludG8gYSBzaW5nbGUsIGludGVncmF0ZWQgYmFjayBlbmQuIFRoaXMgbWVhbnMgdGhleSBjYW4gYWNjb21tb2RhdGUgdmFyaW91cyBkYXRhIHR5cGVzLg0KDQohW10obXVsdGltb2RlbGRhdGFiYXNlLmpwZykNCg0KDQogICogX19Eb2N1bWVudC9KU09OIGRhdGFiYXNlX18uIERlc2lnbmVkIGZvciBzdG9yaW5nLCByZXRyaWV2aW5nLCBhbmQgbWFuYWdpbmcgZG9jdW1lbnQtb3JpZW50ZWQgaW5mb3JtYXRpb24sIGRvY3VtZW50IGRhdGFiYXNlcyBhcmUgYSBtb2Rlcm4gd2F5IHRvIHN0b3JlIGRhdGEgaW4gSlNPTiBmb3JtYXQgcmF0aGVyIHRoYW4gcm93cyBhbmQgY29sdW1ucy4NCiAgDQogIA0KICANCiAgDQoqKkRhdGFiYXNlIENoYWxsZW5nZXMgKioNCg0KVG9kYXkncyBsYXJnZSBlbnRlcnByaXNlIGRhdGFiYXNlcyBvZnRlbiBzdXBwb3J0IHZlcnkgY29tcGxleCBxdWVyaWVzIGFuZCBhcmUgZXhwZWN0ZWQgdG8gZGVsaXZlciBuZWFybHkgaW5zdGFudCByZXNwb25zZXMgdG8gdGhvc2UgcXVlcmllcy4gQXMgYSByZXN1bHQsIGRhdGFiYXNlIGFkbWluaXN0cmF0b3JzIGFyZSBjb25zdGFudGx5IGNhbGxlZCB1cG9uIHRvIGVtcGxveSBhIHdpZGUgdmFyaWV0eSBvZiBtZXRob2RzIHRvIGhlbHAgaW1wcm92ZSBwZXJmb3JtYW5jZS4gU29tZSBjb21tb24gY2hhbGxlbmdlcyB0aGF0IHRoZXkgZmFjZSBpbmNsdWRlOg0KDQoqIF9fQWJzb3JiaW5nIHNpZ25pZmljYW50IGluY3JlYXNlcyBpbiBkYXRhIHZvbHVtZV9fLiBUaGUgZXhwbG9zaW9uIG9mIGRhdGEgY29taW5nIGluIGZyb20gc2Vuc29ycywgY29ubmVjdGVkIG1hY2hpbmVzLCBhbmQgZG96ZW5zIG9mIG90aGVyIHNvdXJjZXMga2VlcHMgZGF0YWJhc2UgYWRtaW5pc3RyYXRvcnMgc2NyYW1ibGluZyB0byBtYW5hZ2UgYW5kIG9yZ2FuaXplIHRoZWlyIGNvbXBhbmllcycgZGF0YSBlZmZpY2llbnRseS4NCiogX19FbnN1cmluZyBkYXRhIHNlY3VyaXR5X18uIERhdGEgYnJlYWNoZXMgYXJlIGhhcHBlbmluZyBldmVyeXdoZXJlIHRoZXNlIGRheXMsIGFuZCBoYWNrZXJzIGFyZSBnZXR0aW5nIG1vcmUgaW52ZW50aXZlLiBJdCdzIG1vcmUgaW1wb3J0YW50IHRoYW4gZXZlciB0byBlbnN1cmUgdGhhdCBkYXRhIGlzIHNlY3VyZSBidXQgYWxzbyBlYXNpbHkgYWNjZXNzaWJsZSB0byB1c2Vycy4NCiogX19LZWVwaW5nIHVwIHdpdGggZGVtYW5kX18uIEluIHRvZGF5J3MgZmFzdC1tb3ZpbmcgYnVzaW5lc3MgZW52aXJvbm1lbnQsIGNvbXBhbmllcyBuZWVkIHJlYWwtdGltZSBhY2Nlc3MgdG8gdGhlaXIgZGF0YSB0byBzdXBwb3J0IHRpbWVseSBkZWNpc2lvbi1tYWtpbmcgYW5kIHRvIHRha2UgYWR2YW50YWdlIG9mIG5ldyBvcHBvcnR1bml0aWVzLg0KKiBfX01hbmFnaW5nIGFuZCBtYWludGFpbmluZyB0aGUgZGF0YWJhc2UgYW5kIGluZnJhc3RydWN0dXJlX18uIERhdGFiYXNlIGFkbWluaXN0cmF0b3JzIG11c3QgY29udGludWFsbHkgd2F0Y2ggdGhlIGRhdGFiYXNlIGZvciBwcm9ibGVtcyBhbmQgcGVyZm9ybSBwcmV2ZW50YXRpdmUgbWFpbnRlbmFuY2UsIGFzIHdlbGwgYXMgYXBwbHkgc29mdHdhcmUgdXBncmFkZXMgYW5kIHBhdGNoZXMuIEFzIGRhdGFiYXNlcyBiZWNvbWUgbW9yZSBjb21wbGV4IGFuZCBkYXRhIHZvbHVtZXMgZ3JvdywgY29tcGFuaWVzIGFyZSBmYWNlZCB3aXRoIHRoZSBleHBlbnNlIG9mIGhpcmluZyBhZGRpdGlvbmFsIHRhbGVudCB0byBtb25pdG9yIGFuZCB0dW5lIHRoZWlyIGRhdGFiYXNlcy4NCiogX19SZW1vdmluZyBsaW1pdHMgb24gc2NhbGFiaWxpdHlfXy4gQSBidXNpbmVzcyBuZWVkcyB0byBncm93IGlmIGl0J3MgZ29pbmcgdG8gc3Vydml2ZSwgYW5kIGl0cyBkYXRhIG1hbmFnZW1lbnQgbXVzdCBncm93IGFsb25nIHdpdGggaXQuIEJ1dCBpdCdzIHZlcnkgZGlmZmljdWx0IGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdG9ycyB0byBwcmVkaWN0IGhvdyBtdWNoIGNhcGFjaXR5IHRoZSBjb21wYW55IHdpbGwgbmVlZCwgcGFydGljdWxhcmx5IHdpdGggb24tcHJlbWlzZXMgZGF0YWJhc2VzLg0KDQoNCj4gQWRkcmVzc2luZyBhbGwgb2YgdGhlc2UgY2hhbGxlbmdlcyBjYW4gYmUgdGltZS1jb25zdW1pbmcgYW5kIGNhbiBwcmV2ZW50IGRhdGFiYXNlIGFkbWluaXN0cmF0b3JzIGZyb20gcGVyZm9ybWluZyBtb3JlIHN0cmF0ZWdpYyBmdW5jdGlvbnMuDQoNCg0KDQoqKkF1dG9ub21vdXMgRGF0YWJhc2UgKioNCg0KDQpFbnRlcnByaXNlIGRhdGFiYXNlcyBhcmUgdHJhZGl0aW9uYWxseSBtYW5hZ2VkIGJ5IGRhdGFiYXNlIGFkbWluaXN0cmF0b3JzIChEQkFzKSwgd2hvIGNyZWF0ZSwgbW9kaWZ5LCBhbmQgdHVuZSBkYXRhYmFzZXMgdG8gZW5zdXJlIG1heGltdW0gcGVyZm9ybWFuY2UgYm90aCB3aGVuIHN0b3JpbmcgbmV3IGRhdGEgaW4gYSBkYXRhYmFzZSwgYW5kIHRoZW4gcmV0cmlldmluZyB0aGF0IGRhdGEuDQoNCg0KDQpfX0FuIGF1dG9ub21vdXMgZGF0YWJhc2UgaXMgYSBjbG91ZCBkYXRhYmFzZV9fIHRoYXQgdXNlcyBtYWNoaW5lIGxlYXJuaW5nIHRvIGVsaW1pbmF0ZSB0aGUgaHVtYW4gbGFib3IgYXNzb2NpYXRlZCB3aXRoIGRhdGFiYXNlIHR1bmluZywgc2VjdXJpdHksIGJhY2t1cHMsIHVwZGF0ZXMsIGFuZCBvdGhlciByb3V0aW5lIG1hbmFnZW1lbnQgdGFza3MgdHJhZGl0aW9uYWxseSBwZXJmb3JtZWQgYnkgZGF0YWJhc2UgYWRtaW5pc3RyYXRvcnMgKERCQXMpLg0KDQoNCk9yYWNsZSBBdXRvbm9tb3VzIERhdGFiYXNlIGJyaW5ncyB0b2dldGhlciBkZWNhZGVzIG9mIGRhdGFiYXNlIGF1dG9tYXRpb24sIGRlY2FkZXMgb2YgYXV0b21hdGluZyBkYXRhYmFzZSBpbmZyYXN0cnVjdHVyZSwgYW5kIG5ldyB0ZWNobm9sb2d5IGluIHRoZSBjbG91ZCB0byBkZWxpdmVyIGEgZnVsbHkgYXV0b25vbW91cyBkYXRhYmFzZS4NCg0KDQpUaGUgZGF0YWJhc2UgdGhhdCBpcyBzZWxmLWRyaXZpbmcsIHNlbGYtc2VjdXJpbmcsIGFuZCBzZWxmLXJlcGFpcmluZy4gTGV0J3MgZXhwbG9yZSB3aGF0IGVhY2ggb2YgdGhvc2UgdGVybXMgbWVhbnMgZm9yIHlvdS4NCg0KKiBTZWxmLURyaXZpbmc6IE9yYWNsZSBBdXRvbm9tb3VzIERhdGFiYXNlIGF1dG9tYXRlcyBhbGwgZGF0YWJhc2UgYW5kIGluZnJhc3RydWN0dXJlIG1hbmFnZW1lbnQsIG1vbml0b3JpbmcsIGFuZCB0dW5pbmcuIFRoaXMgcmVkdWNlcyB5b3VyIGZ1bGwtc3RhY2sgYWRtaW4gY29zdHMsIGFsdGhvdWdoIGFkbWlucyB3aWxsIHN0aWxsIGJlIG5lZWRlZCBmb3IgdGFza3Mgc3VjaCBhcyBtYW5hZ2luZyBob3cgYXBwbGljYXRpb25zIGNvbm5lY3QgdG8gdGhlIGRhdGEgd2FyZWhvdXNlIGFuZCBob3cgZGV2ZWxvcGVycyB1c2UgdGhlIGluLWRhdGFiYXNlIGZlYXR1cmVzIGFuZCBmdW5jdGlvbnMgd2l0aG91dCB0aGVpciBhcHBsaWNhdGlvbiBjb2RlLg0KKiBTZWxmLVNlY3VyaW5nOiBPcmFjbGUgQXV0b25vbW91cyBEYXRhYmFzZSBwcm90ZWN0cyB5b3UgZnJvbSBib3RoIGV4dGVybmFsIGF0dGFja3MgYW5kIG1hbGljaW91cyBpbnRlcm5hbCB1c2Vycywgd2hpY2ggbWVhbnMgeW91IGNhbiBzdG9wIHdvcnJ5aW5nIGFib3V0IGN5YmVyYXR0YWNrcyBvbiB1bnBhdGNoZWQgb3IgdW5lbmNyeXB0ZWQgZGF0YWJhc2VzLg0KKiBTZWxmLVJlcGFpcmluZzogT3JhY2xlIEF1dG9ub21vdXMgRGF0YWJhc2UgcHJvdGVjdHMgZnJvbSBhbGwgZG93bnRpbWUsIGluY2x1ZGluZyB1bnBsYW5uZWQgbWFpbnRlbmFuY2UsIHdpdGggZmV3ZXIgdGhhbiAyLjUgbWludXRlcyBvZiBkb3dudGltZSBhIG1vbnRoLCBpbmNsdWRpbmcgcGF0Y2hpbmcuDQoNCg0KRXNzZW50aWFsbHksIHRoZXJlJ3Mgbm93IGZ1bGwsIGVuZC10by1lbmQgYXV0b21hdGlvbiBmb3I6DQoNCiogUHJvdmlzaW9uaW5nDQoqIFNlY3VyaXR5DQoqIFVwZGF0ZXMNCiogQXZhaWxhYmlsaXR5DQoqIFBlcmZvcm1hbmNlDQoqIENoYW5nZSBtYW5hZ2VtZW50DQoqIEVycm9ycw0KKiBXaXRoIE9yYWNsZSBBdXRvbm9tb3VzIERhdGFiYXNlLCB0aGUgd29ybGQncyBiZXN0IGRhdGFiYXNlIGlzIG5vdyBhbHNvIHRoZSBzaW1wbGVzdC4NCg0KDQpUaGUgREJBIGlzIHJlc3BvbnNpYmxlIGZvciBvdGhlciB0YXNrcywgbWFueSBvZiB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIG9uIGEgZGFpbHkgb3Igb3RoZXIgcmVndWxhciBiYXNpcyBvbiBhbGwgZW50ZXJwcmlzZSBkYXRhYmFzZXMsIG9mIHdoaWNoIHRoZXJlIGNvdWxkIGJlIGRvemVucyBvciBodW5kcmVkcy4gVGhhdCBsaXN0IG9mIHRhc2tzIGluY2x1ZGVzOg0KDQoqIEJhY2tpbmcgdXAgdGhlIGRhdGFiYXNlIGluIGNhc2Ugb2YgZGlzYXN0ZXIgb3IgZGF0YSBsb3NzDQoqIFRlc3RpbmcgdGhlIGJhY2t1cHMgdG8gbWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBjYW4gYmUgcmVjb3ZlcmVkDQoqIFJlY292ZXJpbmcgbG9zdCBkYXRhIGluIHRoZSBldmVudCBvZiBhbiBpbmNpZGVudA0KKiBSZXZpZXdpbmcgc2VjdXJpdHkgbG9ncyB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YWJhc2UgaGFzIG5vdCBiZWVuIGFjY2Vzc2VkIGluYXBwcm9wcmlhdGVseQ0KKiBNb25pdG9yaW5nIHRoZSBkYXRhYmFzZSBzb2Z0d2FyZSdzIHZlbmRvciBpbmZvcm1hdGlvbiBmZWVkcyBmb3Igc2VjdXJpdHkgYWxlcnRzLCBwYXRjaGVzLCBhbmQgdXBncmFkZXMNCiogU2NoZWR1bGluZyBhbmQgYXBwbHlpbmcgcGF0Y2hlcyBhbmQgdXBncmFkZXMgd2hlbiByZXF1aXJlZA0KKiBBZGp1c3RpbmcgdGhlIHNlY3VyaXR5IHNldHRpbmdzIG9mIHRoZSBkYXRhYmFzZXMgdG8gcmVzcG9uZCB0byB0aHJlYXRzDQoqIEF1dGhvcml6aW5nIG5ldyB1c2VycyBhbmQgYXBwbGljYXRpb25zIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UNCiogTW9uaXRvcmluZyBwcm9jZXNzb3IgYW5kIG1lbW9yeSB1dGlsaXphdGlvbiBvZiB0aGUgZGF0YWJhc2Ugc2VydmVyDQoqIENyZWF0aW5nIGFuZCBtYW5hZ2luZyBzY2hlbWFzLXRoYXQgaXMsIGNhdGVnb3JpemF0aW9uIG9mIGRhdGENCiogQXNzaXN0aW5nIHNvZnR3YXJlIGRldmVsb3BlcnMgd2l0aCBkYXRhYmFzZSBxdWVzdGlvbnMNCiogTWFuYWdpbmcgZXh0cmFjdCwgdHJhbnNmb3JtLCBhbmQgbG9hZCAoRVRMKSB0b29scw0KKiBNb25pdG9yaW5nIGRpc2sgdXRpbGl6YXRpb24gb2YgdGhlIGRhdGFiYXNlIHNlcnZlcg0KKiBBZGRpbmcgbW9yZSBzdG9yYWdlIG9yIG1pZ3JhdGluZyB0aGUgc3RvcmFnZSwgaWYgbmVjZXNzYXJ5DQoqIFBsYW5uaW5nIGZvciBmdXR1cmUgY2FwYWNpdHkgcmVxdWlyZW1lbnRzIGZvciB0aGUgZGF0YWJhc2UNCiogVHJvdWJsZXNob290aW5nIGVycm9ycyBhbmQgb3RoZXIgZGF0YWJhc2UgcHJvYmxlbXMNCiogV29ya2luZyB3aXRoIGJ1c2luZXNzIHVzZXJzIGFuZCBkZXZlbG9wZXJzIHRvIGRlZmluZSBkYXRhIG1vZGVscyBmb3IgbmV3IGFwcGxpY2F0aW9ucyBvciBtb2R1bGVzDQoNCg0KDQoqKkFkdmFudGFnZXMgb2YgREJNUz1Tb2Z0d2FyZSAqKg0KDQoqIERCTVMgb2ZmZXJzIGEgdmFyaWV0eSBvZiB0ZWNobmlxdWVzIHRvIHN0b3JlICYgcmV0cmlldmUgZGF0YQ0KKiBEQk1TIHNlcnZlcyBhcyBhbiBlZmZpY2llbnQgaGFuZGxlciB0byBiYWxhbmNlIHRoZSBuZWVkcyBvZiBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIHNhbWUgZGF0YQ0KKiBVbmlmb3JtIGFkbWluaXN0cmF0aW9uIHByb2NlZHVyZXMgZm9yIGRhdGENCiogQXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgbmV2ZXIgZXhwb3NlZCB0byBkZXRhaWxzIG9mIGRhdGEgcmVwcmVzZW50YXRpb24gYW5kIHN0b3JhZ2UuDQoqIEEgREJNUyB1c2VzIHZhcmlvdXMgcG93ZXJmdWwgZnVuY3Rpb25zIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhIGVmZmljaWVudGx5Lg0KKiBPZmZlcnMgRGF0YSBJbnRlZ3JpdHkgYW5kIFNlY3VyaXR5DQoqIFRoZSBEQk1TIGltcGxpZXMgaW50ZWdyaXR5IGNvbnN0cmFpbnRzIHRvIGdldCBhIGhpZ2ggbGV2ZWwgb2YgcHJvdGVjdGlvbiBhZ2FpbnN0IHByb2hpYml0ZWQgYWNjZXNzIHRvIGRhdGEuDQoqIEEgREJNUyBzY2hlZHVsZXMgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIGRhdGEgaW4gc3VjaCBhIG1hbm5lciB0aGF0IG9ubHkgb25lIHVzZXIgY2FuIGFjY2VzcyB0aGUgc2FtZSBkYXRhIGF0IGEgdGltZQ0KKiBSZWR1Y2VkIEFwcGxpY2F0aW9uIERldmVsb3BtZW50IFRpbWUNCg0KDQoqKkRpc2FkdmFudGFnZSBvZiBEQk1TICoqDQoNCiogQ29zdCBvZiBIYXJkd2FyZSBhbmQgU29mdHdhcmUgb2YgYSBEQk1TIGlzIHF1aXRlIGhpZ2ggd2hpY2ggaW5jcmVhc2VzIHRoZSBidWRnZXQgb2YgeW91ciBvcmdhbml6YXRpb24uDQpNb3N0IGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtcyBhcmUgb2Z0ZW4gY29tcGxleCBzeXN0ZW1zLCBzbyB0aGUgdHJhaW5pbmcgZm9yIHVzZXJzIHRvIHVzZSB0aGUgREJNUyBpcyByZXF1aXJlZC4NCiogSW4gc29tZSBvcmdhbml6YXRpb25zLCBhbGwgZGF0YSBpcyBpbnRlZ3JhdGVkIGludG8gYSBzaW5nbGUgZGF0YWJhc2Ugd2hpY2ggY2FuIGJlIGRhbWFnZWQgYmVjYXVzZSBvZiBlbGVjdHJpYyBmYWlsdXJlIG9yIGRhdGFiYXNlIGlzIGNvcnJ1cHRlZCBvbiB0aGUgc3RvcmFnZSBtZWRpYQ0KKiBVc2Ugb2YgdGhlIHNhbWUgcHJvZ3JhbSBhdCBhIHRpbWUgYnkgbWFueSB1c2VycyBzb21ldGltZXMgbGVhZCB0byB0aGUgbG9zcyBvZiBzb21lIGRhdGEuDQoqIERCTVMgY2FuJ3QgcGVyZm9ybSBzb3BoaXN0aWNhdGVkIGNhbGN1bGF0aW9ucw0KDQoNCioqV2hlbiBub3QgdG8gdXNlIGEgREJNUyBzeXN0ZW0/ICoqDQoNCk5vdCByZWNvbW1lbmRlZCB3aGVuIHlvdSBkbyBub3QgaGF2ZSB0aGUgYnVkZ2V0IG9yIHRoZSBleHBlcnRpc2UgdG8gb3BlcmF0ZSBhIERCTVMuIEluIHN1Y2ggY2FzZXMsIEV4Y2VsL0NTVi9GbGF0IEZpbGVzIGNvdWxkIGRvIGp1c3QgZmluZS4NCg0KDQoqKlVzZXJzICoqDQoNCiFbXSh1c2VyLnBuZykNCg0KQSB0eXBpY2FsIERCTVMgaGFzIHVzZXJzIHdpdGggZGlmZmVyZW50IHJpZ2h0cyBhbmQgcGVybWlzc2lvbnMgd2hvIHVzZSBpdCBmb3IgZGlmZmVyZW50IHB1cnBvc2VzLiBTb21lIHVzZXJzIHJldHJpZXZlIGRhdGEgYW5kIHNvbWUgYmFjayBpdCB1cC4gVGhlIHVzZXJzIG9mIGEgREJNUyBjYW4gYmUgYnJvYWRseSBjYXRlZ29yaXplZCBhcyBmb2xsb3dzID8/Pw0KDQo+IEFkbWluaXN0cmF0b3JzOiBBZG1pbmlzdHJhdG9ycyBtYWludGFpbiB0aGUgREJNUyBhbmQgYXJlIHJlc3BvbnNpYmxlIGZvciBhZG1pbmlzdHJhdGluZyB0aGUgZGF0YWJhc2UuIFRoZXkgYXJlIHJlc3BvbnNpYmxlIHRvIGxvb2sgYWZ0ZXIgaXRzIHVzYWdlIGFuZCBieSB3aG9tIGl0IHNob3VsZCBiZSB1c2VkLiBUaGV5IGNyZWF0ZSBhY2Nlc3MgcHJvZmlsZXMgZm9yIHVzZXJzIGFuZCBhcHBseSBsaW1pdGF0aW9ucyB0byBtYWludGFpbiBpc29sYXRpb24gYW5kIGZvcmNlIHNlY3VyaXR5LiBBZG1pbmlzdHJhdG9ycyBhbHNvIGxvb2sgYWZ0ZXIgREJNUyByZXNvdXJjZXMgbGlrZSBzeXN0ZW0gbGljZW5zZSwgcmVxdWlyZWQgdG9vbHMsIGFuZCBvdGhlciBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgcmVsYXRlZCBtYWludGVuYW5jZS4NCg0KPiBEZXNpZ25lcnM6IERlc2lnbmVycyBhcmUgdGhlIGdyb3VwIG9mIHBlb3BsZSB3aG8gYWN0dWFsbHkgd29yayBvbiB0aGUgZGVzaWduaW5nIHBhcnQgb2YgdGhlIGRhdGFiYXNlLiBUaGV5IGtlZXAgYSBjbG9zZSB3YXRjaCBvbiB3aGF0IGRhdGEgc2hvdWxkIGJlIGtlcHQgYW5kIGluIHdoYXQgZm9ybWF0LiBUaGV5IGlkZW50aWZ5IGFuZCBkZXNpZ24gdGhlIHdob2xlIHNldCBvZiBlbnRpdGllcywgcmVsYXRpb25zLCBjb25zdHJhaW50cywgYW5kIHZpZXdzLg0KDQo+IEVuZCBVc2VyczogRW5kIHVzZXJzIGFyZSB0aG9zZSB3aG8gYWN0dWFsbHkgcmVhcCB0aGUgYmVuZWZpdHMgb2YgaGF2aW5nIGEgREJNUy4gRW5kIHVzZXJzIGNhbiByYW5nZSBmcm9tIHNpbXBsZSB2aWV3ZXJzIHdobyBwYXkgYXR0ZW50aW9uIHRvIHRoZSBsb2dzIG9yIG1hcmtldCByYXRlcyB0byBzb3BoaXN0aWNhdGVkIHVzZXJzIHN1Y2ggYXMgYnVzaW5lc3MgYW5hbHlzdHMuDQoNCg0KKipEQk1TIC0gQXJjaGl0ZWN0dXJlICoqDQoNCiogVGhlIGRlc2lnbiBvZiBhIERCTVMgZGVwZW5kcyBvbiBpdHMgYXJjaGl0ZWN0dXJlLiBJdCBjYW4gYmUgY2VudHJhbGl6ZWQgb3IgZGVjZW50cmFsaXplZCBvciBoaWVyYXJjaGljYWwuIFRoZSBhcmNoaXRlY3R1cmUgb2YgYSBEQk1TIGNhbiBiZSBzZWVuIGFzIGVpdGhlciBzaW5nbGUgdGllciBvciBtdWx0aS10aWVyLiBBbiBuLXRpZXIgYXJjaGl0ZWN0dXJlIGRpdmlkZXMgdGhlIHdob2xlIHN5c3RlbSBpbnRvIHJlbGF0ZWQgYnV0IGluZGVwZW5kZW50IG4gbW9kdWxlcywgd2hpY2ggY2FuIGJlIGluZGVwZW5kZW50bHkgbW9kaWZpZWQsIGFsdGVyZWQsIGNoYW5nZWQsIG9yIHJlcGxhY2VkLg0KDQoqIERCTVMgYXJjaGl0ZWN0dXJlIGhlbHBzIGluIGRlc2lnbiwgZGV2ZWxvcG1lbnQsIGltcGxlbWVudGF0aW9uLCBhbmQgbWFpbnRlbmFuY2Ugb2YgYSBkYXRhYmFzZS4gQSBkYXRhYmFzZSBzdG9yZXMgY3JpdGljYWwgaW5mb3JtYXRpb24gZm9yIGEgYnVzaW5lc3MuIFNlbGVjdGluZyB0aGUgY29ycmVjdCBEYXRhYmFzZSBBcmNoaXRlY3R1cmUgaGVscHMgaW4gcXVpY2sgYW5kIHNlY3VyZSBhY2Nlc3MgdG8gdGhpcyBkYXRhLg0KDQohW10oMS10aWVyLnBuZykNCg0KDQoNCg0KDQohW10oMi10aWVyLnBuZykNCg0KDQohW10oMy10aWVyLnBuZykNCg0KDQoqKkRCTVMgU2NoZW1hczogSW50ZXJuYWwsIENvbmNlcHR1YWwsIEV4dGVybmFsICoqDQoNCkRhdGFiYXNlIHN5c3RlbXMgY29tcHJpc2Ugb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMuIFRodXMsIHRvIG1ha2UgdGhlIHN5c3RlbSBlZmZpY2llbnQgZm9yIHJldHJpZXZhbCBvZiBkYXRhIGFuZCByZWR1Y2UgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHVzZXJzLCBkZXZlbG9wZXJzIHVzZSB0aGUgbWV0aG9kIG9mIERhdGEgQWJzdHJhY3Rpb24uDQoNClRoZXJlIGFyZSBtYWlubHkgdGhyZWUgbGV2ZWxzIG9mIGRhdGEgYWJzdHJhY3Rpb246DQoNCjEuIEludGVybmFsIExldmVsOiBBY3R1YWwgUEhZU0lDQUwgc3RvcmFnZSBzdHJ1Y3R1cmUgYW5kIGFjY2VzcyBwYXRocy4NCjIuIENvbmNlcHR1YWwgb3IgTG9naWNhbCBMZXZlbDogU3RydWN0dXJlIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIGVudGlyZSBkYXRhYmFzZQ0KMy4gRXh0ZXJuYWwgb3IgVmlldyBsZXZlbDogRGVzY3JpYmVzIHZhcmlvdXMgdXNlciB2aWV3cw0KDQohW10oc2NoZW1hLnBuZykNCg0KTGV0J3Mgc3R1ZHkgdGhlbSBpbiBkZXRhaWwhDQoNCg0KDQpJTlRFUk5BTC1MRVZFTC9TQ0hFTUEtPg0KDQoxLiBJbnRlcm5hbCBMZXZlbC9TY2hlbWE6IFRoZSBpbnRlcm5hbCBzY2hlbWEgZGVmaW5lcyB0aGUgcGh5c2ljYWwgc3RvcmFnZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFiYXNlLiBUaGUgaW50ZXJuYWwgc2NoZW1hIGlzIGEgdmVyeSBsb3ctbGV2ZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudGlyZSBkYXRhYmFzZS4gSXQgY29udGFpbnMgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgbXVsdGlwbGUgdHlwZXMgb2YgaW50ZXJuYWwgcmVjb3JkLiBJbiB0aGUgQU5TSSB0ZXJtLCBpdCBpcyBhbHNvIGNhbGxlZCAic3RvcmVkIHJlY29yZCcuDQoNCjIuIEZhY3RzIGFib3V0IEludGVybmFsIHNjaGVtYToNCiAgICAqIFRoZSBpbnRlcm5hbCBzY2hlbWEgaXMgdGhlIGxvd2VzdCBsZXZlbCBvZiBkYXRhIGFic3RyYWN0aW9uDQogICAgKiBJdCBoZWxwcyB5b3UgdG8ga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW50aXJlIGRhdGFiYXNlLiBMaWtlICAgICAgICAgdGhlIGFjdHVhbCBzdG9yYWdlIG9mIHRoZSBkYXRhIG9uIHRoZSBkaXNrIGluIHRoZSBmb3JtIG9mIHJlY29yZHMNCiAgICAqIFRoZSBpbnRlcm5hbCB2aWV3IHRlbGxzIHVzIHdoYXQgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIGFuZCBob3cNCiAgICAqIEl0IG5ldmVyIGRlYWxzIHdpdGggdGhlIHBoeXNpY2FsIGRldmljZXMuIEluc3RlYWQsIGludGVybmFsIHNjaGVtYSB2aWV3cyBhIHBoeXNpY2FsIGRldmljZSBhcyBhICAgICAgICBjb2xsZWN0aW9uIG9mIHBoeXNpY2FsIHBhZ2VzDQoNCg0KDQoNCg0KQ09OQ0VQVFVBTC1MRVZFTC9TQ0hFTUEtPg0KDQoxLiBUaGUgY29uY2VwdHVhbCBzY2hlbWEgZGVzY3JpYmVzIHRoZSBEYXRhYmFzZSBzdHJ1Y3R1cmUgb2YgdGhlIHdob2xlIGRhdGFiYXNlIGZvciB0aGUgY29tbXVuaXR5IG9mIHVzZXJzLiBUaGlzIHNjaGVtYSBoaWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgc3RvcmFnZSBzdHJ1Y3R1cmVzIGFuZCBmb2N1c2VzIG9uIGRlc2NyaWJpbmcgZGF0YSB0eXBlcywgZW50aXRpZXMsIHJlbGF0aW9uc2hpcHMsIGV0Yy4NCg0KDQoyLiBGYWN0cyBhYm91dCBDb25jZXB0dWFsIHNjaGVtYToNCiAgICAqIERlZmluZXMgYWxsIGRhdGFiYXNlIGVudGl0aWVzLCB0aGVpciBhdHRyaWJ1dGVzLCBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcw0KICAgICogU2VjdXJpdHkgYW5kIGludGVncml0eSBpbmZvcm1hdGlvbg0KICAgICogSW4gdGhlIGNvbmNlcHR1YWwgbGV2ZWwsIHRoZSBkYXRhIGF2YWlsYWJsZSB0byBhIHVzZXIgbXVzdCBiZSBjb250YWluZWQgaW4gb3IgZGVyaXZhYmxlIGZyb20gdGhlICAgICBwaHlzaWNhbCBsZXZlbA0KDQoNCg0KRVhURVJOQUwtTEVWRUwvU0NIRU1BLT4NCg0KMS4gQW4gZXh0ZXJuYWwgc2NoZW1hIGRlc2NyaWJlcyB0aGUgcGFydCBvZiB0aGUgZGF0YWJhc2Ugd2hpY2ggc3BlY2lmaWMgdXNlciBpcyBpbnRlcmVzdGVkIGluLiBJdCBoaWRlcyB0aGUgdW5yZWxhdGVkIGRldGFpbHMgb2YgdGhlIGRhdGFiYXNlIGZyb20gdGhlIHVzZXIuIFRoZXJlIG1heSBiZSAibiIgbnVtYmVyIG9mIGV4dGVybmFsIHZpZXdzIGZvciBlYWNoIGRhdGFiYXNlLiBFYWNoIGV4dGVybmFsIHZpZXcgaXMgZGVmaW5lZCB1c2luZyBhbiBleHRlcm5hbCBzY2hlbWEsIHdoaWNoIGNvbnNpc3RzIG9mIGRlZmluaXRpb25zIG9mIHZhcmlvdXMgdHlwZXMgb2YgZXh0ZXJuYWwgcmVjb3JkIG9mIHRoYXQgc3BlY2lmaWMgdmlldy4gQW4gZXh0ZXJuYWwgdmlldyBpcyBqdXN0IHRoZSBjb250ZW50IG9mIHRoZSBkYXRhYmFzZSBhcyBpdCBpcyBzZWVuIGJ5IHNvbWUgc3BlY2lmaWMgcGFydGljdWxhciB1c2VyLiBGb3IgZXhhbXBsZSwgYSB1c2VyIGZyb20gdGhlIHNhbGVzIGRlcGFydG1lbnQgd2lsbCBzZWUgb25seSBzYWxlcyByZWxhdGVkIGRhdGEuDQoNCjIuIEZhY3RzIGFib3V0IGV4dGVybmFsIHNjaGVtYToNCiAgICAqIEFuIGV4dGVybmFsIGxldmVsIGlzIG9ubHkgcmVsYXRlZCB0byB0aGUgZGF0YSB3aGljaCBpcyB2aWV3ZWQgYnkgc3BlY2lmaWMgZW5kIHVzZXJzLg0KICAgICogVGhpcyBsZXZlbCBpbmNsdWRlcyBzb21lIGV4dGVybmFsIHNjaGVtYXMuDQogICAgKiBFeHRlcm5hbCBzY2hlbWEgbGV2ZWwgaXMgbmVhcmVzdCB0byB0aGUgdXNlcg0KICAgICogVGhlIGV4dGVybmFsIHNjaGVtYSBkZXNjcmliZXMgdGhlIHNlZ21lbnQgb2YgdGhlIGRhdGFiYXNlIHdoaWNoIGlzIG5lZWRlZCBmb3IgYSBjZXJ0YWluIHVzZXIgICAgICAgICAgIGdyb3VwIGFuZCBoaWRlcyB0aGUgcmVtYWluaW5nIGRldGFpbHMgZnJvbSB0aGUgZGF0YWJhc2UgZnJvbSB0aGUgc3BlY2lmaWMgdXNlciBncm91cA0KDQoNCg0KDQogICAgICANCiAgICAgIA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpHT0FMIE9GIDMgTEVWRUwvU0NIRU1BDQoNCiAgKiBFdmVyeSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgc2FtZSBkYXRhIGJ1dCBhYmxlIHRvIHNlZSBhIGN1c3RvbWl6ZWQgdmlldyBvZiB0aGUgZGF0YS4NCiogVGhlIHVzZXIgbmVlZCBub3QgdG8gZGVhbCBkaXJlY3RseSB3aXRoIHBoeXNpY2FsIGRhdGFiYXNlIHN0b3JhZ2UgZGV0YWlsLg0KKiBUaGUgREJBIHNob3VsZCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgZGF0YWJhc2Ugc3RvcmFnZSBzdHJ1Y3R1cmUgd2l0aG91dCBkaXN0dXJiaW5nIHRoZSB1c2VyJ3MgICAgICAgICAgdmlld3MNCiogVGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgZGF0YWJhc2Ugc2hvdWxkIHJlbWFpbiB1bmFmZmVjdGVkIHdoZW4gY2hhbmdlcyBtYWRlIHRvIHRoZSBwaHlzaWNhbCAgICAgICBhc3BlY3RzIG9mIHN0b3JhZ2UuDQoNCg0KDQpBRFZBTlRBR0VTIERBVEFCQVNFIFNDSEVNQQ0KDQoqIFlvdSBjYW4gbWFuYWdlIGRhdGEgaW5kZXBlbmRlbnQgb2YgdGhlIHBoeXNpY2FsIHN0b3JhZ2UNCiogRmFzdGVyIE1pZ3JhdGlvbiB0byBuZXcgZ3JhcGhpY2FsIGVudmlyb25tZW50cw0KKiBEQk1TIEFyY2hpdGVjdHVyZSBhbGxvd3MgeW91IHRvIG1ha2UgY2hhbmdlcyBvbiB0aGUgcHJlc2VudGF0aW9uIGxldmVsIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvdGhlciB0d28gbGF5ZXJzDQoqIEFzIGVhY2ggdGllciBpcyBzZXBhcmF0ZSwgaXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBzZXRzIG9mIGRldmVsb3BlcnMNCiogSXQgaXMgbW9yZSBzZWN1cmUgYXMgdGhlIGNsaWVudCBkb2Vzbid0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgZGF0YWJhc2UgYnVzaW5lc3MgbG9naWMNCiogSW4gY2FzZSBvZiB0aGUgZmFpbHVyZSBvZiB0aGUgb25lLXRpZXIgbm8gZGF0YSBsb3NzIGFzIHlvdSBhcmUgYWx3YXlzIHNlY3VyZSBieSBhY2Nlc3NpbmcgdGhlIG90aGVyIHRpZXINCg0KDQoNCkRJU0FEVkFOVEFHRVMgREFUQUJBU0UgU0NIRU1BDQoNCiogQ29tcGxldGUgREIgU2NoZW1hIGlzIGEgY29tcGxleCBzdHJ1Y3R1cmUgd2hpY2ggaXMgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQgZm9yIGV2ZXJ5IG9uZQ0KKiBEaWZmaWN1bHQgdG8gc2V0IHVwIGFuZCBtYWludGFpbg0KKiBUaGUgcGh5c2ljYWwgc2VwYXJhdGlvbiBvZiB0aGUgdGllcnMgY2FuIGFmZmVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIERhdGFiYXNlDQoNCg0KDQoNCkFEVkFOVEFHRVMgT0YgVVNJTkcgUkVMQVRJT05BTCBNT0RFTA0KDQoqIF9fU2ltcGxpY2l0eV9fOiBBIHJlbGF0aW9uYWwgZGF0YSBtb2RlbCBpcyBzaW1wbGVyIHRoYW4gdGhlIGhpZXJhcmNoaWNhbCBhbmQgbmV0d29yayBtb2RlbC4NCiogX19TdHJ1Y3R1cmFsIEluZGVwZW5kZW5jZV9fOiBUaGUgcmVsYXRpb25hbCBkYXRhYmFzZSBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIGRhdGEgYW5kIG5vdCB3aXRoIGEgc3RydWN0dXJlLiBUaGlzIGNhbiBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbW9kZWwuDQoqIF9fRWFzeSB0byB1c2VfXzogVGhlIHJlbGF0aW9uYWwgbW9kZWwgaXMgZWFzeSBhcyB0YWJsZXMgY29uc2lzdGluZyBvZiByb3dzIGFuZCBjb2x1bW5zIGlzIHF1aXRlIG5hdHVyYWwgYW5kIHNpbXBsZSB0byB1bmRlcnN0YW5kDQoqIF9fUXVlcnkgY2FwYWJpbGl0eV9fOiBJdCBtYWtlcyBwb3NzaWJsZSBmb3IgYSBoaWdoLWxldmVsIHF1ZXJ5IGxhbmd1YWdlIGxpa2UgU1FMIHRvIGF2b2lkIGNvbXBsZXggZGF0YWJhc2UgbmF2aWdhdGlvbi4NCiogX19EYXRhIGluZGVwZW5kZW5jZV9fOiBUaGUgc3RydWN0dXJlIG9mIGEgZGF0YWJhc2UgY2FuIGJlIGNoYW5nZWQgd2l0aG91dCBoYXZpbmcgdG8gY2hhbmdlIGFueSBhcHBsaWNhdGlvbi4NCiogX19TY2FsYWJsZV9fOiBSZWdhcmRpbmcgYSBudW1iZXIgb2YgcmVjb3Jkcywgb3Igcm93cywgYW5kIHRoZSBudW1iZXIgb2YgZmllbGRzLCBhIGRhdGFiYXNlIHNob3VsZCBiZSBlbmxhcmdlZCB0byBlbmhhbmNlIGl0cyB1c2FiaWxpdHkuDQoNCg0KDQpESVNBRFZBTlRBR0VTIE9GIFVTSU5HIFJFTEFUSU9OQUwgTU9ERUwNCg0KKiBGZXcgcmVsYXRpb25hbCBkYXRhYmFzZXMgaGF2ZSBsaW1pdHMgb24gZmllbGQgbGVuZ3RocyB3aGljaCBjYW4ndCBiZSBleGNlZWRlZC4NCiogUmVsYXRpb25hbCBkYXRhYmFzZXMgY2FuIHNvbWV0aW1lcyBiZWNvbWUgY29tcGxleCBhcyB0aGUgYW1vdW50IG9mIGRhdGEgZ3Jvd3MsIGFuZCB0aGUgcmVsYXRpb25zIGJldHdlZW4gcGllY2VzIG9mIGRhdGEgYmVjb21lIG1vcmUgY29tcGxpY2F0ZWQuDQoqIENvbXBsZXggcmVsYXRpb25hbCBkYXRhYmFzZSBzeXN0ZW1zIG1heSBsZWFkIHRvIGlzb2xhdGVkIGRhdGFiYXNlcyB3aGVyZSB0aGUgaW5mb3JtYXRpb24gY2Fubm90IGJlIHNoYXJlZCBmcm9tIG9uZSBzeXN0ZW0gdG8gYW5vdGhlci4NCg0KDQoqKkVudGl0eSBSZWxhdGlvbnNoaXBzIERpYWdyYW0gKioNCg0KDQohW10ocmVsYXRpb24uanBnKQ0KDQo+IEZvciBtb3JlIGluZm8gRVIgRGlhZ3JhbTogaHR0cHM6Ly93d3cuZ3VydTk5LmNvbS9lci1kaWFncmFtLXR1dG9yaWFsLWRibXMuaHRtbA0KDQoNCioqR2FydG5lciBNYWdpYyBRdWFkcmFudCBEQk1TKioNCg0KDQoNCiFbXShnYXJ0bmVyZGJtcy5qcGcpDQoNCiFbXShnYXJ0bmVyZGF0YW1hbmFnZW1lbnQucG5nKQ0KDQoNCg0KPEJyPg0KDQoNCg0KIyBEYXRhIFdhcmVob3VzZQ0KDQoNCioqV2hhdCBpcyBEYXRhIFdhcmVob3VzaW5nPyAqKg0KDQoqIEEgZGF0YSB3YXJlaG91c2UgaXMgY29uc3RydWN0ZWQgYnkgaW50ZWdyYXRpbmcgZGF0YSBmcm9tIG11bHRpcGxlIGhldGVyb2dlbmVvdXMgc291cmNlcy4gSXQgc3VwcG9ydHMgYW5hbHl0aWNhbCByZXBvcnRpbmcsIHN0cnVjdHVyZWQgYW5kL29yIGFkIGhvYyBxdWVyaWVzIGFuZCBkZWNpc2lvbiBtYWtpbmcuDQoqIEEgZGF0YSB3YXJlaG91c2luZyBpcyBkZWZpbmVkIGFzIGEgdGVjaG5pcXVlIGZvciBjb2xsZWN0aW5nIGFuZCBtYW5hZ2luZyBkYXRhIGZyb20gdmFyaWVkIHNvdXJjZXMgdG8gcHJvdmlkZSBtZWFuaW5nZnVsIGJ1c2luZXNzIGluc2lnaHRzLiBJdCBpcyBhIGJsZW5kIG9mIHRlY2hub2xvZ2llcyBhbmQgY29tcG9uZW50cyB3aGljaCBhaWRzIHRoZSBzdHJhdGVnaWMgdXNlIG9mIGRhdGEuDQoqIEl0IGlzIGVsZWN0cm9uaWMgc3RvcmFnZSBvZiBhIGxhcmdlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBieSBhIGJ1c2luZXNzIHdoaWNoIGlzIGRlc2lnbmVkIGZvciBxdWVyeSBhbmQgYW5hbHlzaXMgaW5zdGVhZCBvZiB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nLiBJdCBpcyBhIHByb2Nlc3Mgb2YgdHJhbnNmb3JtaW5nIGRhdGEgaW50byBpbmZvcm1hdGlvbiBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSB0byB1c2VycyBpbiBhIHRpbWVseSBtYW5uZXIgdG8gbWFrZSBhIGRpZmZlcmVuY2UuDQoqIFRoZSBkZWNpc2lvbiBzdXBwb3J0IGRhdGFiYXNlIChEYXRhIFdhcmVob3VzZSkgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5IGZyb20gdGhlIG9yZ2FuaXphdGlvbidzIG9wZXJhdGlvbmFsIGRhdGFiYXNlLiANCiogVGhlIGRhdGEgd2FyZWhvdXNlIGlzIG5vdCBhIHByb2R1Y3QgYnV0IGFuIGVudmlyb25tZW50LiBJdCBpcyBhbiBhcmNoaXRlY3R1cmFsIGNvbnN0cnVjdCBvZiBhbiBpbmZvcm1hdGlvbiBzeXN0ZW0gd2hpY2ggcHJvdmlkZXMgdXNlcnMgd2l0aCBjdXJyZW50IGFuZCBoaXN0b3JpY2FsIGRlY2lzaW9uIHN1cHBvcnQgaW5mb3JtYXRpb24gd2hpY2ggaXMgZGlmZmljdWx0IHRvIGFjY2VzcyBvciBwcmVzZW50IGluIHRoZSB0cmFkaXRpb25hbCBvcGVyYXRpb25hbCBkYXRhIHN0b3JlLg0KKiBUaGUgZGF0YSB3YXJlaG91c2UgaXMgdGhlIGNvcmUgb2YgdGhlIEJJIHN5c3RlbSB3aGljaCBpcyBidWlsdCBmb3IgZGF0YSBhbmFseXNpcyBhbmQgcmVwb3J0aW5nLg0KKiBEYXRhIHdhcmVob3VzZSBzeXN0ZW0gaXMgYWxzbyBrbm93biBieSB0aGUgZm9sbG93aW5nIG5hbWU6DQogICAgKiBEZWNpc2lvbiBTdXBwb3J0IFN5c3RlbSAoRFNTKQ0KICAgICogRXhlY3V0aXZlIEluZm9ybWF0aW9uIFN5c3RlbQ0KICAgICogTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBTeXN0ZW0NCiAgICAqIEJ1c2luZXNzIEludGVsbGlnZW5jZSBTb2x1dGlvbg0KICAgICogQW5hbHl0aWMgQXBwbGljYXRpb24NCiAgICAqIERhdGEgV2FyZWhvdXNlDQogICAgDQohW10oZHduYW1lcy5wbmcpICAgDQogICAgDQoqIFRoZSBkaWZmZXJlbnQgYmV0d2VlbiBkYXRhYmFzZSBhbmQgZGF0YXdhcmVob3VzZSBhcmUgZm9sbG93aW5nLA0KDQohW10oZGJ2c2R3LmpwZykNCiAgICANCiAgICANCiAgICANCiAgICANCioqVW5kZXJzdGFuZGluZyBhIERhdGEgV2FyZWhvdXNlICoqDQoNCiogQSBkYXRhIHdhcmVob3VzZSBpcyBhIGRhdGFiYXNlLCB3aGljaCBpcyBrZXB0IHNlcGFyYXRlIGZyb20gdGhlIG9yZ2FuaXphdGlvbidzIG9wZXJhdGlvbmFsIGRhdGFiYXNlLg0KKiBUaGVyZSBpcyBubyBmcmVxdWVudCB1cGRhdGluZyBkb25lIGluIGEgZGF0YSB3YXJlaG91c2UuDQoqIEl0IHBvc3Nlc3NlcyBjb25zb2xpZGF0ZWQgaGlzdG9yaWNhbCBkYXRhLCB3aGljaCBoZWxwcyB0aGUgb3JnYW5pemF0aW9uIHRvIGFuYWx5emUgaXRzIGJ1c2luZXNzLg0KKiBBIGRhdGEgd2FyZWhvdXNlIGhlbHBzIGV4ZWN1dGl2ZXMgdG8gb3JnYW5pemUsIHVuZGVyc3RhbmQsIGFuZCB1c2UgdGhlaXIgZGF0YSB0byB0YWtlIHN0cmF0ZWdpYyBkZWNpc2lvbnMuDQoqIERhdGEgd2FyZWhvdXNlIHN5c3RlbXMgaGVscCBpbiB0aGUgaW50ZWdyYXRpb24gb2YgZGl2ZXJzaXR5IG9mIGFwcGxpY2F0aW9uIHN5c3RlbXMuDQoqIEEgZGF0YSB3YXJlaG91c2Ugc3lzdGVtIGhlbHBzIGluIGNvbnNvbGlkYXRlZCBoaXN0b3JpY2FsIGRhdGEgYW5hbHlzaXMuDQoNCg0KKipXaHkgYSBEYXRhIFdhcmVob3VzZSBpcyBTZXBhcmF0ZWQgZnJvbSBPcGVyYXRpb25hbCBEYXRhYmFzZXMgKioNCg0KQSBkYXRhIHdhcmVob3VzZXMgaXMga2VwdCBzZXBhcmF0ZSBmcm9tIG9wZXJhdGlvbmFsIGRhdGFiYXNlcyBkdWUgdG8gdGhlIGZvbGxvd2luZyByZWFzb25zLg0KDQoqIEFuIG9wZXJhdGlvbmFsIGRhdGFiYXNlIGlzIGNvbnN0cnVjdGVkIGZvciB3ZWxsLWtub3duIHRhc2tzIGFuZCB3b3JrbG9hZHMgc3VjaCBhcyBzZWFyY2hpbmcgcGFydGljdWxhciByZWNvcmRzLCBpbmRleGluZywgZXRjLiBJbiBjb250cmFjdCwgZGF0YSB3YXJlaG91c2UgcXVlcmllcyBhcmUgb2Z0ZW4gY29tcGxleCBhbmQgdGhleSBwcmVzZW50IGEgZ2VuZXJhbCBmb3JtIG9mIGRhdGEuDQoqIE9wZXJhdGlvbmFsIGRhdGFiYXNlcyBzdXBwb3J0IGNvbmN1cnJlbnQgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSB0cmFuc2FjdGlvbnMuIENvbmN1cnJlbmN5IGNvbnRyb2wgYW5kIHJlY292ZXJ5IG1lY2hhbmlzbXMgYXJlIHJlcXVpcmVkIGZvciBvcGVyYXRpb25hbCBkYXRhYmFzZXMgdG8gZW5zdXJlIHJvYnVzdG5lc3MgYW5kIGNvbnNpc3RlbmN5IG9mIHRoZSBkYXRhYmFzZS4NCiogQW4gb3BlcmF0aW9uYWwgZGF0YWJhc2UgcXVlcnkgYWxsb3dzIHRvIHJlYWQgYW5kIG1vZGlmeSBvcGVyYXRpb25zLCB3aGlsZSBhbiBPTEFQIHF1ZXJ5IG5lZWRzIG9ubHkgcmVhZCBvbmx5IGFjY2VzcyBvZiBzdG9yZWQgZGF0YS4NCiogQW4gb3BlcmF0aW9uYWwgZGF0YWJhc2UgbWFpbnRhaW5zIGN1cnJlbnQgZGF0YS4gT24gdGhlIG90aGVyIGhhbmQsIGEgZGF0YSB3YXJlaG91c2UgbWFpbnRhaW5zIGhpc3RvcmljYWwgZGF0YS4NCiAgICANCiAgICANCiAgICANCiAgICANCioqSGlzdG9yeSBvZiBEYXRhd2FyZWhvdXNlICoqICAgDQogICAgDQogICAgDQpUaGUgRGF0YXdhcmVob3VzZSBiZW5lZml0cyB1c2VycyB0byB1bmRlcnN0YW5kIGFuZCBlbmhhbmNlIHRoZWlyIG9yZ2FuaXphdGlvbidzIHBlcmZvcm1hbmNlLiBUaGUgbmVlZCB0byB3YXJlaG91c2UgZGF0YSBldm9sdmVkIGFzIGNvbXB1dGVyIHN5c3RlbXMgYmVjYW1lIG1vcmUgY29tcGxleCBhbmQgbmVlZGVkIHRvIGhhbmRsZSBpbmNyZWFzaW5nIGFtb3VudHMgb2YgSW5mb3JtYXRpb24uIEhvd2V2ZXIsIERhdGEgV2FyZWhvdXNpbmcgaXMgYSBub3QgYSBuZXcgdGhpbmcuDQoNCkhlcmUgYXJlIHNvbWUga2V5IGV2ZW50cyBpbiBldm9sdXRpb24gb2YgRGF0YSBXYXJlaG91c2UtDQoNCiogMTk2MC0gRGFydG1vdXRoIGFuZCBHZW5lcmFsIE1pbGxzIGluIGEgam9pbnQgcmVzZWFyY2ggcHJvamVjdCwgZGV2ZWxvcCB0aGUgdGVybXMgZGltZW5zaW9ucyBhbmQgZmFjdHMuDQoqIDE5NzAtIEEgTmllbHNlbiBhbmQgSVJJIGludHJvZHVjZXMgZGltZW5zaW9uYWwgZGF0YSBtYXJ0cyBmb3IgcmV0YWlsIHNhbGVzLg0KKiAxOTgzLSBUZXJhIERhdGEgQ29ycG9yYXRpb24gaW50cm9kdWNlcyBhIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtIHdoaWNoIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgZGVjaXNpb24gc3VwcG9ydA0KKiBEYXRhIHdhcmVob3VzaW5nIHN0YXJ0ZWQgaW4gdGhlIGxhdGUgMTk4MHMgd2hlbiBJQk0gd29ya2VyIFBhdWwgTXVycGh5IGFuZCBCYXJyeSBEZXZsaW4gZGV2ZWxvcGVkIHRoZSBCdXNpbmVzcyBEYXRhIFdhcmVob3VzZS4NCiogSG93ZXZlciwgdGhlIHJlYWwgY29uY2VwdCB3YXMgZ2l2ZW4gYnkgSW5tb24gQmlsbC4gSGUgd2FzIGNvbnNpZGVyZWQgYXMgYSBmYXRoZXIgb2YgZGF0YSB3YXJlaG91c2UuIEhlIGhhZCB3cml0dGVuIGFib3V0IGEgdmFyaWV0eSBvZiB0b3BpY3MgZm9yIGJ1aWxkaW5nLCB1c2FnZSwgYW5kIG1haW50ZW5hbmNlIG9mIHRoZSB3YXJlaG91c2UgJiB0aGUgQ29ycG9yYXRlIEluZm9ybWF0aW9uIEZhY3RvcnkuIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KKipIb3cgRGF0YXdhcmVob3VzZSB3b3Jrcz8gKioNCg0KQSBEYXRhIFdhcmVob3VzZSB3b3JrcyBhcyBhIGNlbnRyYWwgcmVwb3NpdG9yeSB3aGVyZSBpbmZvcm1hdGlvbiBhcnJpdmVzIGZyb20gb25lIG9yIG1vcmUgZGF0YSBzb3VyY2VzLiBEYXRhIGZsb3dzIGludG8gYSBkYXRhIHdhcmVob3VzZSBmcm9tIHRoZSB0cmFuc2FjdGlvbmFsIHN5c3RlbSBhbmQgb3RoZXIgcmVsYXRpb25hbCBkYXRhYmFzZXMuIA0KDQpEYXRhIG1heSBiZToNCg0KKiBTdHJ1Y3R1cmVkDQoqIFNlbWktc3RydWN0dXJlZA0KKiBVbnN0cnVjdHVyZWQgZGF0YQ0KICAgIA0KDQpUaGUgZGF0YSBpcyBwcm9jZXNzZWQsIHRyYW5zZm9ybWVkLCBhbmQgaW5nZXN0ZWQgc28gdGhhdCB1c2VycyBjYW4gYWNjZXNzIHRoZSBwcm9jZXNzZWQgZGF0YSBpbiB0aGUgRGF0YSBXYXJlaG91c2UgdGhyb3VnaCBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UgdG9vbHMsIFNRTCBjbGllbnRzLCBhbmQgc3ByZWFkc2hlZXRzLiBBIGRhdGEgd2FyZWhvdXNlIG1lcmdlcyBpbmZvcm1hdGlvbiBjb21pbmcgZnJvbSBkaWZmZXJlbnQgc291cmNlcyBpbnRvIG9uZSBjb21wcmVoZW5zaXZlIGRhdGFiYXNlLg0KDQpCeSBtZXJnaW5nIGFsbCBvZiB0aGlzIGluZm9ybWF0aW9uIGluIG9uZSBwbGFjZSwgYW4gb3JnYW5pemF0aW9uIGNhbiBhbmFseXplIGl0cyBjdXN0b21lcnMgbW9yZSBob2xpc3RpY2FsbHkuIFRoaXMgaGVscHMgdG8gZW5zdXJlIHRoYXQgaXQgaGFzIGNvbnNpZGVyZWQgYWxsIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUuIERhdGEgd2FyZWhvdXNpbmcgbWFrZXMgZGF0YSBtaW5pbmcgcG9zc2libGUuIERhdGEgbWluaW5nIGlzIGxvb2tpbmcgZm9yIHBhdHRlcm5zIGluIHRoZSBkYXRhIHRoYXQgbWF5IGxlYWQgdG8gaGlnaGVyIHNhbGVzIGFuZCBwcm9maXRzLg0KDQohW10oZHd3b3Jrcy5qcGcpDQogICAgDQogICAgDQogICAgDQoNCioqRGF0YSBXYXJlaG91c2UgRmVhdHVyZXMgKioNCg0KDQpUaGUga2V5IGZlYXR1cmVzIG9mIGEgZGF0YSB3YXJlaG91c2UgYXJlIGRpc2N1c3NlZCBiZWxvdyANCg0KKiAgX19TdWJqZWN0IE9yaWVudGVkX186IEEgZGF0YSB3YXJlaG91c2UgaXMgc3ViamVjdCBvcmllbnRlZCBiZWNhdXNlIGl0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFyb3VuZCBhIHN1YmplY3QgcmF0aGVyIHRoYW4gdGhlIG9yZ2FuaXphdGlvbidzIG9uZ29pbmcgb3BlcmF0aW9ucy4gVGhlc2Ugc3ViamVjdHMgY2FuIGJlIHByb2R1Y3QsIGN1c3RvbWVycywgc3VwcGxpZXJzLCBzYWxlcywgcmV2ZW51ZSwgZXRjLiBBIGRhdGEgd2FyZWhvdXNlIGRvZXMgbm90IGZvY3VzIG9uIHRoZSBvbmdvaW5nIG9wZXJhdGlvbnMsIHJhdGhlciBpdCBmb2N1c2VzIG9uIG1vZGVsbGluZyBhbmQgYW5hbHlzaXMgb2YgZGF0YSBmb3IgZGVjaXNpb24gbWFraW5nLg0KKiAgX19JbnRlZ3JhdGVkX186IEEgZGF0YSB3YXJlaG91c2UgaXMgY29uc3RydWN0ZWQgYnkgaW50ZWdyYXRpbmcgZGF0YSBmcm9tIGhldGVyb2dlbmVvdXMgc291cmNlcyBzdWNoIGFzIHJlbGF0aW9uYWwgZGF0YWJhc2VzLCBmbGF0IGZpbGVzLCBldGMuIFRoaXMgaW50ZWdyYXRpb24gZW5oYW5jZXMgdGhlIGVmZmVjdGl2ZSBhbmFseXNpcyBvZiBkYXRhLg0KKiAgX19UaW1lIFZhcmlhbnRfXzogVGhlIGRhdGEgY29sbGVjdGVkIGluIGEgZGF0YSB3YXJlaG91c2UgaXMgaWRlbnRpZmllZCB3aXRoIGEgcGFydGljdWxhciB0aW1lIHBlcmlvZC4gVGhlIGRhdGEgaW4gYSBkYXRhIHdhcmVob3VzZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoaXN0b3JpY2FsIHBvaW50IG9mIHZpZXcuDQoNCiogIF9fTm9uLXZvbGF0aWxlX186IE5vbi12b2xhdGlsZSBtZWFucyB0aGUgcHJldmlvdXMgZGF0YSBpcyBub3QgZXJhc2VkIHdoZW4gbmV3IGRhdGEgaXMgYWRkZWQgdG8gaXQuIEEgZGF0YSB3YXJlaG91c2UgaXMga2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBvcGVyYXRpb25hbCBkYXRhYmFzZSBhbmQgdGhlcmVmb3JlIGZyZXF1ZW50IGNoYW5nZXMgaW4gb3BlcmF0aW9uYWwgZGF0YWJhc2UgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgZGF0YSB3YXJlaG91c2UuDQogICAgDQoNCj4gTm90ZSEgQSBkYXRhIHdhcmVob3VzZSBkb2VzIG5vdCByZXF1aXJlIHRyYW5zYWN0aW9uIHByb2Nlc3NpbmcsIHJlY292ZXJ5LCBhbmQgY29uY3VycmVuY3kgY29udHJvbHMsIGJlY2F1c2UgaXQgaXMgcGh5c2ljYWxseSBzdG9yZWQgYW5kIHNlcGFyYXRlIGZyb20gdGhlIG9wZXJhdGlvbmFsIGRhdGFiYXNlLg0KDQoNCioqRGF0YSBXYXJlaG91c2UgQXBwbGljYXRpb25zICoqDQoNCk1hbnkgb2YgdGhlIHBvaW50cyBleHByZXNzZWQgaGVyZSBhcmUgbm90IHRydWx5IGFwcGxpY2F0aW9ucyBidXQgd2F5cyBpbiB3aGljaCB0aGUgRFcgKGluY2x1ZGluZyBkYXRhIG1pbmluZz1nZXQgdGhlIGluc2lnaHQgZnJvbSBkYXRhKSBpcyB1c2VkIGJ5IHRoZXNlIGluZHVzdHJpZXMuDQoNCg0KKiBDb25zdW1lciBHb29kcyANCg0KICAgICogRm9yZWNhc3RpbmcNCiAgICAqIEludmVudG9yeSByZXBsZW5pc2htZW50DQogICAgKiBFZmZlY3RzIG9mIG1hcmtldGluZyBjYW1wYWlnbnMsIGFkdmVydGlzaW5nLCBjb3Vwb25zIGFuZCBzdG9yZSBkaXNwbGF5cw0KICAgICogU2FsZXMgYW5kIG1hcmtldGluZyBhbmFseXNpcw0KICAgICogU2hhcmluZyBpbmZvcm1hdGlvbiB3aXRoIGRpc3RyaWJ1dGlvbiBzaXRlcywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHByb2R1Y3QgbWFuYWdlcnMNCiAgICAqIFBhY2thZ2VkIEdvb2RzOiBJZGVudGlmeSByZXF1aXJlZCBwcm9kdWN0IGZlYXR1cmVzDQoNCiogRGlzdHJpYnV0aW9uDQoNCiAgICAqIFN1cHBseSBjaGFpbiBhbmFseXNlcw0KICAgICogVW5kZXJzdGFuZCBwaXBlbGluZSBpc3N1ZXMNCiAgICANCiAgICANCiogRmluYW5jZS9CYW5raW5nDQoNCiAgICAqIEV2YWx1YXRpbmcgYnVzaW5lc3MgY29uY2VudHJhdGlvbiBhbmQgcmlzayBleHBvc3VyZSBsZWFkaW5nIHRvIG1vZGlmaWVkIGNyZWRpdCBwb2xpY2llcyBhbmQgbG9hbiBsb3NzIHJlc2VydmVzDQogICAgKiBDb25zdW1lciBhc3NldCBkYXRhDQogICAgKiBTcG90IG1hcmtldCB0cmVuZHMNCiAgICAqIEdvdmVybm1lbnQgcmVndWxhdGlvbiByZXBvcnRpbmcNCiAgICAqIE1hcmtldGluZw0KICAgICogTWVyZ2Vycw0KICAgICAgICAqIEdlb2dyYXBoaWMgb3ZlcmxhcCBhbmQgc2F0dXJhdGlvbg0KICAgICAgICAqIEluZm9ybWF0aW9uIGZvciBnb3Zlcm5tZW50IHJlZ3VsYXRpb24gYW5kIGFwcHJvdmFsDQogICAgKiBUbyBzdXBwb3J0IG1hbmFnZW1lbnQgcGxhbm5pbmcsIG1hcmtldGluZyBhbmQgZmluYW5jaWFsIGRlY2lzaW9uIG1ha2luZw0KICAgICogQWJpbGl0eSB0byB0cmFjayBhbmQgY3V0IGNvc3RzDQogICAgKiBNYW5hZ2UgcmVzb3VyY2VzIG1vcmUgZWZmZWN0aXZlbHkNCiAgICAqIFByb3ZpZGUgZmVlZGJhY2sgdG8gYmFua2VycyByZWdhcmRpbmcgY3VzdG9tZXIgcmVsYXRpb25zaGlwcyBhbmQgcHJvZml0YWJpbGl0eQ0KICAgICogSW5mb3JtYXRpb24gb24gc3BlbmRpbmcgcGF0dGVybnMgb24gYSBzZWdtZW50IG9mIGlzc3VpbmcgbWVtYmVycyBjYXJkIGJhc2UgKGNvLWJyYW5kKQ0KICAgICogVGFyZ2V0IG1hcmtldGluZyAmIFByb21vdGlvbiBwZXJmb3JtYW5jZQ0KICAgICogTWVtYmVycyB1c2UgaXQgdG8gYW5hbHl6ZSBwZXJmb3JtYW5jZSBieSBwcm9kdWN0LCBnZW9ncmFwaHksIGludGVyY2hhbmdlIHJhdGVzLCB2b2x1bWUgYnkgICAgICAgICAgICAgbWVyY2hhbnQsIGxvY2F0aW9uLCBwcm9tb3Rpb25zLCBvcGVyYXRpb25hbCBwZXJmb3JtYW5jZQ0KICAgICogQ2FyZGhvbGRlciBzcGVuZGluZyBieSBzdGF0ZSBhbmQgbWVyY2hhbnQgY2xhc3NpZmljYXRpb24gdG8gZGV2ZWxvcCBkaXJlY3QgbWFpbCBwcm9tb3Rpb24gd2l0aCAgICAgICAga2V5IG1lcmNoYW50cy4NCiAgICAqIEFiaWxpdHkgdG8gc2VsZWN0IGJldHRlciBtYXJrZXRpbmcgcGFydG5lcnMsIGJ1aWxkIGlubm92YXRpdmUgYW5kIHN1Y2Nlc3NmdWwgbmV3IHByb2R1Y3QgYW5kICAgICAgICAgIGJ1aWxkIGJyYW5kIGxveWFsdHkNCiAgICAqIENvLWJyYW5kaW5nIC0gZGV0ZXJtaW5pbmcgd2hlcmUgdGhlaXIgY2FyZHMgKFNpZXJyYSBDbHViKSBhcmUgYmVpbmcgdXNlZCBhbmQgZGV2ZWxvcCB0YXJnZXQgICAgICAgICAgIG1hcmtldGluZyBwbGFucw0KICAgICogQ29tYmluZSB3aXRoIHByb3ByaWV0YXJ5IGRhdGEgdG8gZGV0ZXJtaW5lIHB1cmNoYXNlIHBhdHRlcm5zIHRvIGRldmVsb3AgbWFya2V0aW5nIHByb2dyYW1zDQogICAgKiBBZ2VudCBhbGVydHM6DQogICAgICAgICogRWFybHkgd2FybmluZ3MgZm9yIGNoYW5naW5nIHNwZW5kaW5nIHBhdHRlcm5zDQogICAgICAgICogT3Bwb3J0dW5pdHkgZm9yIHNwZWNpYWwgb2ZmZXIgYmFzZWQgb24gYWJub3JtYWwgY2FyZGhvbGRlciBhY3Rpdml0eQ0KICAgICAgICAqIFdoZW4gcmVzcG9uc2UgcmF0ZSB0byBwcm9tb3Rpb25zIGhpdHMgdGFyZ2V0DQogICAgKiBUZXN0IHByb21vdGlvbmFsIG9wcG9ydHVuaXRpZXMNCiAgICAqIFRoZWlyIG1lbWJlciBiYW5rcyBvciBjby1icmFuZHMgY2FuIGFkZCBkYXRhIGZyb20gdGhlIERXIHRvIHRoZWlyIG93biBwcm9wcmlldGFyeSBkYXRhYmFzZXMNCiAgICAqIE1vcnRnYWdlIExvYW4gcG9ydGZvbGlvDQogICAgKiBOZXcgbG9hbnMgaW4gcHJvY2VzcyAocGlwZWxpbmUpDQogICAgKiBTZWNvbmRhcnkgbWFya2V0aW5nDQogICAgKiBDcmVkaXQgQ2FyZHMgDQogICAgICAgICogSWRlbnRpZnkgbmV3IGN1c3RvbWVycw0KICAgICAgICAqIE1hbmFnZSBhbmQgY29udHJvbCBjb2xsZWN0aW9ucw0KICAgICAgICAqIERldmVsb3AgbmV3IHByb2R1Y3RzDQogICAgICAgICogRGV0ZXJtaW5lIG9wdGltYWwgbWFya2V0aW5nIGVmZm9ydHMgZm9yIG5ldyBwcm9kdWN0cw0KICAgICAgICAqIE1hbmFnZXIgY3VzdG9tZXIgc2VydmljZSBwZXJmb3JtYW5jZQ0KICAgICAgICAqIElkZW50aWZ5IHBvdGVudGlhbCByaXNrIG9mIGRlZmF1bHQNCiAgICAqIEJyb2tlcmFnZSwgQ29tbW9kaXR5IFRyYWRpbmcgDQogICAgICAgICogSWRlbnRpZnkgdGFyZ2V0IGludmVzdG1lbnQgc2VydmljZXMsIHByb2R1Y3RzIGFuZCBwcm9tb3Rpb25zDQogICAgICAgICogUmlzayBtYW5hZ2VtZW50DQogICAgICAgICogUXVhbGl0eSBvZiB0cmFkZXIgdHJhbnNhY3Rpb25zDQogIA0KICAgICogRmluYW5jaWFsIFNlcnZpY2VzOiBUcmFja2luZyBpbnZlc3RtZW50IG1hbmFnZXJzDQogICAgKiBQZXJzb25hbCBUcnVzdA0KICAgICAgICAqIFRyYWNraW5nIG1hbmFnZXJzIG9uIHBlcmZvcm1hbmNlIHJlbGF0aXZlIHRvIGluZGV4ZXMNCiAgICAgICAgKiBUcmFja2luZyBtYW5hZ2VycyBvbiB0aGUgdHlwZXMgb2Ygc3RvY2tzIHRoZXkgcHVyY2hhc2UNCiAgICAqIERhdGEgTWluaW5nDQogICAgICAgICogUHJvZHVjdCBhbmFseXNpcw0KICAgICAgICAqIEN1c3RvbWVyIHNlZ21lbnRhdGlvbg0KICAgICAgICAqIEN1c3RvbWVyIHByb2ZpdGFiaWxpdHkNCiAgICAgICAgKiBUYXJnZXQgbWFya2V0aW5nIGNhbXBhaWducw0KICAgICAgICAqIEZyYXVkIGRldGVjdGlvbiAoY3JlZGl0IGNhcmRzKQ0KICAgIA0KKiBGaW5hbmNlIEdlbmVyYWwgIA0KICAgICogRXhwZW5zZSBldmFsdWF0aW9uIC0gdHJlbmRzDQogICAgKiBDdXN0b21lciBJbmZvcm1hdGlvbiBTeXN0ZW1zDQogICAgKiBDdXN0b21lciBwcm9maXRhYmlsaXR5DQogICAgKiBGZWUgdG9sZXJhbmNlICAgDQogICAgDQoqIEdvdmVybm1lbnQgYW5kIEVkdWNhdGlvbg0KICAgICogRmVkZXJhbCBHb3Zlcm5tZW50OiBDb21wbGlhbmNlIHJlc2VhcmNoDQogICAgKiBTdGF0ZSBHb3Zlcm5tZW50OiANCiAgICAgICAgKiBBY2NvdW50aW5nDQogICAgICAgICogUGF5cm9sbA0KICAgICAgICAqIFByb2N1cmVtZW50DQogICAgICAgICogSHVtYW4gUmVzb3VyY2VzDQogICAgKiBTdGF0ZSBHb3Zlcm5tZW50OiBBdWRpdGluZyBhbmQgZnJhdWQgaW52ZXN0aWdhdGlvbiBvZiBzb2NpYWwgc2VydmljZXMNCiAgICAqIFVuaXZlcnNpdHk6IA0KICAgICAgICAqIFByb3ZpZGUgaW5mb3JtYXRpb24gdG8gYmUgdXNlZCBpbiBhIGdyYW50IHByb3Bvc2FsDQogICAgICAgICogVW5pdmVyc2l0eSBmaW5hbmNlcw0KICAgICAgICAqIEh1bWFuIHJlc291cmNlcw0KICAgICAgICAqIFN0dWRlbnQgZGVtb2dyYXBoaWNzDQogICAgICAgICogRmluYW5jaWFsIGFpZA0KICAgICAgICAqIFJvb20gYW5kIGNvdXJzZSBzY2hlZHVsaW5nDQogICAgICAgICogRGF0YSB3b3VsZCBiZSBjYXB0dXJlZCBvbiB0aGUgY2hhcmFjdGVyaXN0aWNzL2RlbW9ncmFwaGljcyBvZiBzdHVkZW50cyB0byBiZXR0ZXIgdW5kZXJzdGFuZCAgICAgICAgICAgcmV0ZW50aW9uIGFuZCBzdWNjZXNzIGFtb25nIG1pbm9yaXRpZXMuDQogICAgKiBHb3Zlcm5tZW50OiBTb2NpYWwgU2VydmljZXMNCiAgICAgICAgKiBGcmF1ZCBkZXRlY3Rpb24NCiAgICAgICAgKiBFZmZlY3RpdmVuZXNzIG9mIHNlcnZpY2VzDQogICAgICAgICogUHJvZmlsZXMgb2Ygd2hvIGlzIHVzaW5nIHdoYXQgc2VydmljZXMNCiAgICAqIEdvdmVybm1lbnQgVGF4ZXM6IEF1ZGl0aW5nIHRheCByZWNvcmRzIGZvciBwYXR0ZXJucyBhbmQgYW5vbWFsaWVzDQogICAgKiBHb3Zlcm5tZW50IEhlYWx0aCBJbmZvcm1hdGlvbg0KICAgICAgICAqIFByb2dyYW0gcG9saWN5IGVmZmVjdGl2ZW5lc3MgKENvc3QgYW5kIG91dGNvbWVzKQ0KICAgICAgICAqIFByb3ZpZGVyIGNhcmUgYWRlcXVhY3kNCiAgICAqIEdvdmVybm1lbnQ6IFBvbGljZQ0KICAgICAgICAqIFBhdHRlcm5zIGFuZCB0cmVuZHMgb2YgY3JpbWluYWwgYWN0aXZpdHkNCiAgICAgICAgKiBKdXN0aWNlIHJlc291cmNlIGRlcGxveW1lbnQNCiAgICAgICAgKiBDb25zb2xpZGF0aW9uIGFuZCBpbnRlZ3JhdGlvbiBvZiBkYXRhIGZyb20gbXVsdGlwbGUgYWdlbmNpZXMNCiAgICAgICAgKiBFZmZlY3RpdmVuZXNzIG9mIHByb2dyYW1zIGFuZCBwYXR0ZXJucyBvZiBwb2xpY2luZw0KDQoqIEhlYWx0aCBDYXJlDQogICAgKiBGaW5hbmNpYWwNCiAgICAqIENsaW5pY2FsDQogICAgKiBTdHJhdGVnaWMgYW5kIG91dGNvbWVzIGRhdGENCiAgICAqIEhlbHBzIG1lYXN1cmUgYW5kIHRyYWNrIGFuZCBhbmFseXplIGhvdyB3ZWxsIHRoZSBob3NwaXRhbCBpcyBwcm92aWRpbmcgc2VydmljZXMNCiAgICAqIFJlcG9ydHMgb24gcGVyY2VudGFnZSBvZiBwYXRpZW50cyBiZWluZyBmZWQgaW50cmF2ZW5vdXNseQ0KICAgICogQ29tcGFyZXMgcGh5c2ljaWFucyB0byBwZWVyIGdyb3VwIG9uIGhvdyBsb25nIGhpcyBwYXRpZW50cyBvY2N1cHkgYSBiZWQsIGFuZCB0aGUgY29zdCBvZiBzdXJnZXJ5ICAgICAgIGJ5IHBoeXNpY2lhbg0KICAgICogRmluYW5jZSBkZXBhcnRtZW50IGdldHMgc3RhdGlzdGljcyBieSBwYXRpZW50IHR5cGUsIHJldmVudWUgY29kZSBhbmQgaW5zdXJhbmNlIGNhcnJpZXINCiAgICAqIFdoYXQgcGVyY2VudGFnZSBvZiBob3NwaXRhbCdzIGJpbGxpbmdzIGFyZSBmcm9tIE1lZGljYXJlLCBNZWRpY2FpZCBhbmQgZWFjaCBtYWpvciBpbnN1cmFuY2UgICAgICAgICAgIGNvbXBhbnkNCiAgICAqIEFiaWxpdHkgdG8gYmUgbW9yZSBwcm9hY3RpdmUgYWJvdXQgcmVzZWFyY2gNCiAgICAqIFJlc3BvbmQgdG8gbWFuYWdlZCBjYXJlIGNvbnRyYWN0cyBtb3JlIGtub3dsZWRnZWFibHkNCiAgICAqIEFiaWxpdHkgdG8gdHJhY2sgY29zdHMgYW5kIGN1dCBjb3N0cywgbWFuYWdlIHJlc291cmNlIG1vcmUgZWZmZWN0aXZlbHksIHByb3ZpZGUgZmVlZGJhY2sgdG8gICAgICAgICAgIHBoeXNpY2lhbnMgcmVnYXJkaW5nIG91dGNvbWVzIGFuZCB0aGUgY29zdCBvZiByZWFsaXppbmcgdGhlc2Ugb3V0Y29tZXMuDQogICAgKiBPdXRjb21lcyBhbmFseXNpcw0KICAgICogUHJvdmlkaW5nIGZlZWRiYWNrIHRvIHBoeXNpY2lhbnMgb24gcHJvY2VkdXJlcyBhbmQgdGVzdHMNCiAgICAqIFVzaW5nIGRhdGEgbWluaW5nLCBkZXRlY3RpbmcgaW5hcHByb3ByaWF0ZSB0ZXN0cw0KICAgICogUmVwb3J0cyB0byBkb2N0b3JzIG9mIHRlc3RpbmcgdHJlbmRzIGFuZCBwcmFjdGljZXMgd2l0aGluIHRoZWlyIHNwZWNpYWx0eQ0KICAgICogUmVzdWx0cyBvZiBzdHVkeSBnaXZlbiB0byBkb2N0b3JzIHNvIHRoZXkgY2FuIHJlZmluZSB0aGVpciBkZWNpc2lvbnMgZm9yIG9yZGVyaW5nIHRlc3RzDQogICAgKiBFdmFsdWF0aW5nIHNlcnZpY2UgdG8gZGV0ZXJtaW5lIGlmIHNob3VsZCBiZSBwcm92aWRpbmcgb3Igb3V0c291cmNpbmcgKGV4LiBkaWFseXNpcywgb3JnYW4gICAgICAgICAgICB0cmFuc3BsYW50YXRpb24pDQogICAgKiBOb3NvY29taWFsIGFuYWx5c2lzDQogICAgKiBDb250aW51aW5nIGVkdWNhdGlvbiBhbmQgY2VydGlmaWNhdGlvbiBvZiBoZWFsdGggY2FyZSBwcm9mZXNzaW9uYWxzDQogICAgKiBIZWFsdGggQ2FyZTogR2VuZXJhbA0KICAgICAgICAqIFBhaXJpbmcgY2xpbmljYWwgdG8gZmluYW5jaWFsIHJlY29yZHMgdG8gZGV0ZXJtaW5lIGNvc3QgZWZmZWN0aXZlbmVzcyBvZiBjYXJlDQogICAgICAgICogVXRpbGl6YXRpb24gcmV2aWV3DQogICAgICAgICogQ29udHJhY3QgbWFuYWdlbWVudA0KICAgICAgICAqIERhdGEgbWluaW5nIHRvIGlkZW50aWZ5IGRhdGEgcGF0dGVybnMgdGhhdCBjb3VsZCBwcmVkaWN0IGZ1dHVyZSBpbmRpdmlkdWFsIGhlYWx0aCBwcm9ibGVtcw0KICAgICAgICAqIERhdGEgbWluaW5nIHRvIGlkZW50aWZ5IHBhdGllbnRzIHdobyB3aWxsIHByb2JhYmx5IG5vdCByZXNwb25kIHdlbGwgdG8gc3BlY2lmaWMgcHJvY2VkdXJlcyAgICAgICAgICAgIGFuZCBvcGVyYXRpb25zDQogICAgICAgICogRGlzY292ZXIgImJlc3QgcHJhY3RpY2VzIiB0byBpbXByb3ZlIHF1YWxpdHkgYW5kIHJlZHVjZSBjb3N0cw0KICAgICAgICAqIEFuYWx5c2lzIG9mIGNhcmUgZGVsaXZlcnkNCiAgICAgICAgKiBSZXNlYXJjaCAocHJlc2NyaWJpbmcgcGF0dGVybnMsIHVzZSBvZiBhbnRpYmlvdGljcykNCiAgICAgICAgKiBQaHlzaWNpYW4gcGVyZm9ybWFuY2UNCiAgICAgICAgKiBSZXNvdXJjZSB1dGlsaXphdGlvbg0KICAgICAgICAqIEluZm9ybWF0aW9uIGZvciBiaWRzIG9uIG1hbmFnZWQgY2FyZSBjb250cmFjdHMNCiAgICAgICAgKiBJbmZvcm1hdGlvbiB0byBzdXBwb3J0IGF1ZGl0cyBhbmQgZXh0ZXJuYWwgcmVwb3J0cw0KICAgICAgICAqIERpc2Vhc2Ugc3RhdGUgc3VwcG9ydCAoY2FyZGlvdmFzY3VsYXIsIGVuZC1zdGFnZSByZW5hbCwgZXRjLikNCiAgICAqIFBoYXJtYWNldXRpY2FsDQogICAgICAgICogT3V0Y29tZXMgYW5hbHlzaXMNCiAgICAgICAgKiBEb2N0b3IgYWNjZXNzDQogICAgICAgIA0KKiBIb3NwaXRhbGl0eSAoSG90ZWxzLCBjYXIgcmVudGFsLCB0aW1lc2hhcmVzKQ0KICAgICogQ3Jvc3MtYnJhbmQgcHJvbW90aW9ucyAtIHRhcmdldCBjdXN0b21lcnMgd2l0aCBwcm9tb3Rpb25hbCBvZmZlcnMgdGFpbG9yZWQgdG8gdGhlaXIgZGVtb2dyYXBoaWNzICAgICAgIGFuZCB0cmF2ZWwgcGF0dGVybnMNCiAgICAqIEVzdGltYXRlIHJlc3BvbnNlIHRvIHByb21vdGlvbnMgYW5kIHByb2R1Y3RzIHRocm91Z2ggZGVtb2dyYXBoaWMgYW5hbHlzaXMNCiAgICAqIENyb3NzIG1hcmtlDQogICAgDQoqIEluc3VyYW5jZQ0KICAgICogSW5jb3Jwb3JhdGUgYm90aCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgZGF0YSAoaS5lLiBpbmZvcm1hdGlvbiBvbiBjb21wZXRpdG9ycyBhbmQgdGhlIGluc3VyYW5jZSAgICAgICAgIGluZHVzdHJ5IHRyZW5kcykNCiAgICAqIEZvcmVjYXN0IGFuZCBtb25pdG9yIGNoYW5nZXMgaW4gdGhlIGluZHVzdHJ5IHRoZXJlYnkgYWxsb3dpbmcgYmV0dGVyIHBvc2l0aW9uaW5nIGluIHRoZSAgICAgICAgICAgICAgIG1hcmtldHBsYWNlDQogICAgKiBJZGVudGlmeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvZml0YWJsZSBidXNpbmVzcw0KICAgICogQW5hbHl6ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHJldGVudGlvbiBvZiBidXNpbmVzcyBhdCByZW5ld2FsIGluY2x1ZGluZyBwYXR0ZXJucyBvZiBjdXN0b21lcnMgICAgIHdobyBkbyBub3QgcmVuZXcsIGRldGVybWluZSByZWFzb25zIHdoeSwgYW5kIHJlc29sdmUgaXNzdWVzIHRoYXQgd2lsbCBhc3Npc3QgaW4gcmV0YWluaW5nIHZhbHVlZCAgICAgICAgICBjbGllbnRzLg0KICAgICogQWNjdXJhdGUsIGNvbnNvbGlkYXRlZCB2aWV3IG9mIGN1c3RvbWVyIHBvcnRmb2xpb3MNCiAgICAqIEFuYWx5c2lzIG9mIHByb2ZpdGFiaWxpdHkgYnkgY3VzdG9tZXIsIHByb2R1Y3QsIGdlb2dyYXBoeSwgYW5kIHNhbGVzIGhpZXJhcmNoeQ0KICAgICogQW5hbHlzaXMgb2Ygc2FsZXMgb2ZmaWNlcyBmb3IgcHJvZml0IGFuZCBsb3NzDQogICAgKiBQcm9wZXJ0eSBhbmQgTGlhYmlsaXR5IEluc3VyYW5jZTogRGF0YSBtaW5pbmcgcmV2aWV3IG9mIGNsYWltcyBieSBhY3R1YXJpYWwgZGVwYXJ0bWVudA0KICAgICogV29ya2VycycgQ29tcGVuc2F0aW9uIEluc3VyYW5jZToNCiAgICAgICAgKiBSZWNvbW1lbmQgaGVhbHRoIGluc3VyYW5jZSBkZWR1Y3RpYmxlcy4NCiAgICAgICAgKiBBbmFseXNpcyBvZiBjbGFpbXMgYnkgdGhlIGVtcGxveWVyLCBjYXVzZSBvZiBpbmp1cnksIGJvZHkgcGFydCBpbmp1cmVkIGFuZCB0aGUgcGVyY2VudGFnZSBvZiAgICAgICAgICogZW1wbG95ZWVzIHdobyBoYXZlIHN1ZmZlcmVkIHNpbWlsYXIgaW5qdXJpZXMuDQogICAgICAgICogRnJhdWQgYW5hbHlzaXMgdXNpbmcgZGF0YSBtaW5pbmcNCiAgICAqIEhlYWx0aCBJbnN1cmFuY2U6DQogICAgICAgICogSW1wYWN0IG9uIHN1YnNjcmliZXIgc2VydmljZXMgYW5kIGNvc3QNCiAgICAgICAgKiBFbXBsb3llZSBjb3N0cyBwZXIgZW1wbG95ZXINCiAgICAgICAgKiBTZXJ2aWNlIHVzYWdlDQogICAgICAgICogUHJvdmlkZXIgZXZhbHVhdGlvbjoNCiAgICAgICAgICAgICogUGh5c2ljaWFucyBwcm9maWxlcw0KICAgICAgICAgICAgKiBDb3N0DQogICAgICAgICAgICAqIExlbmd0aCBvZiBob3NwaXRhbCBzdGF5DQogICAgICAgICAgICAqIFByb2NlZHVyZSBldmFsdWF0aW9ucw0KICAgICAgICAqIEZyYXVkIGRldGVjdGlvbiwgU2VhcmNoaW5nIGZvciBjbGFpbXMgd2hlcmUgdGhlIHNlcnZpY2UgaGFzIG5vdCBhY3R1YWxseSBiZWVuIHByb3ZpZGVkLiAgICAgICAgICAgICAqIExvb2tpbmcgZm9yIHBhdHRlcm5zIHRoYXQgd291bGQgc3VnZ2VzdCBmdXJ0aGVyIGlucXVpcnkgaW50byB0aGUgY2xhaW0uDQogICAgICAgICogQWJ1c2UgZGV0ZWN0aW9uLCBTZWFyY2hpbmcgZm9yIHBhdHRlcm5zIGluZGljYXRpbmcgdGhhdCBjZXJ0YWluIHByb3ZpZGVycyBhcmUgcGVyZm9ybWluZyAgICAgICAgICAgIHVubmVjZXNzYXJ5IHByb2NlZHVyZXMsIHByZXNjcmliaW5nIGV4cGVuc2l2ZSBtZWRpY2F0aW9uIHdoZXJlIGEgbGVzcyBleHBlbnNpdmUgZHJ1ZyB3b3VsZCBiZSAgICAgICAgIGFzIGVmZmVjdGl2ZSwgcGVyZm9ybWluZyB1bm5lY2Vzc2FyeSB0ZXN0cyBhbmQga2VlcGluZyBhIHBhdGllbnQgaW4gdGhlIGhvc3BpdGFsIGxvbmdlciB0aGFuICAgICAgICAgIG5lY2Vzc2FyeS4NCiAgICAqIEJsdWUgQ3Jvc3MgLyBCbHVlIFNoaWVsZDoNCiAgICAgICAgKiBBbmFseXNpcyBvZiBjbGFpbXMNCiAgICAgICAgKiBQcm92aWRlcnMgYW5hbHlzaXMNCiAgICAgICAgKiBSZXBvcnRpbmcgdG8gZ3JvdXBzLCBnb3Zlcm5tZW50IGFnZW5jaWVzLCB0cmFkZSBhc3NvY2lhdGlvbnMNCiAgICAgICAgKiBBbmFseXNpcyBvZiBxdWFsaXR5IG9mIGNhcmUgYW5kIGNvc3RzDQogICAgICAgICogTWFya2V0aW5nIG1hbmFnZWQtY2FyZSBjb250cmFjdHMNCiAgICAgICAgKiBBY3R1YXJpYWwNCiAgICAgICAgKiBVbmRlcndyaXRpbmcNCiAgICAgICAgKiBGaW5hbmNpYWwgYW5hbHlzaXMgKGFjdHVhbCBleHBlbnNlcyB2cy4gcGxhbm5lZCBleHBlbnNlcykNCiAgICAgICAgKiBQcm9maXRhYmlsaXR5IG9mIG1hbmFnZXIgY2FyZSBhcnJhbmdlbWVudHMNCiAgICAgICAgKiBDYXBpdGF0ZWQgY29udHJhY3QgcGVyZm9ybWFuY2UNCiAgICAgICAgKiBGcmF1ZCBhbmFseXNpcyBiYXNlZCBvbiB0aGUgcHJvdmlkZXIncyBoZWFsdGggY2FyZSBzcGVjaWFsdHkgYW5kIHRoZSBnZW9ncmFwaHkgb2YgdGhlIGNsYWltDQogICAgKiBQaGFybWFjZXV0aWNhbCBJbnN1cmFuY2U6DQogICAgICAgICogU2FsZXMgYW5kIG1hcmtldGluZw0KICAgICAgICAqIFByb3ZpZGVyIHByb2ZpbGluZw0KICAgICAgICAqIEdvdmVybm1lbnQgcmVwb3J0aW5nDQogICAgICAgICogVXRpbGl6YXRpb24NCiAgICAgICAgKiBDbGFpbXMNCiAgICAgICAgKiBBY3R1YXJpYWwNCiAgICAgICAgKiBJbnRlZ3JhdGluZyBwaGFybWFjZXV0aWNhbCBpbmZvcm1hdGlvbiB3aXRoIG1lZGljYWwgY2xhaW1zDQogICAgICAgICogQ29zdCBhbmFseXNpcyBieSBwYXRpZW50IGRlbW9ncmFwaGljcyBhbmQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbg0KICAgICAgICAqIENvc3QgYW5hbHlzaXMgYnkgcHJvdmlkZXIsIHByb3ZpZGVyIHNwZWNpYWx0aWVzIGFuZCB0cmVhdG1lbnQgcHJvdG9jb2xzDQogICAgICAgICogQW5hbHlzaXMgYnkgZGlhZ25vc2lzL3ByZXNjcmlwdGlvbg0KICAgICAgICAqIEdlbmVyaWMvYnJhbmQgbmFtZSBkcnVnIGNvbXBhcmlzb25zDQogICAgKiBJbnN1cmFuY2UgUmVzZWFyY2g6IENsYWltcyBpbmZvcm1hdGlvbiAoWnVyaWNoLUFtZXJpY2FuIC0gUmlza0ludGVsbGlnZW5jZSkNCg0KKiBNYW51ZmFjdHVyaW5nIGFuZCBEaXN0cmlidXRpb24NCiAgICAqIENvbXBhbnkgTSZEIChNYXJrZXRpbmcgJiBEZXZlbG9wbWVudCk6IA0KICAgICAgICAqIEFuYWx5emUgZW1lcmdpbmcgYnVzaW5lc3MgdHJlbmRzDQogICAgICAgICogRXhhbWluZSBwcm9kdWN0IGJvb2tpbmdzDQogICAgICAgICogRGV0ZXJtaW5lIHByb2R1Y3Qgc2hpcG1lbnRzLCBiYWNrbG9ncyBhbmQgY2FuY2VsbGF0aW9ucw0KICAgICAgICAqIEJldHRlciBtYW5hZ2UgcHJvZHVjdCBwb3J0Zm9saW8NCiAgICAgICAgKiBTaGFycGVyIGNvbnRyYWN0IG5lZ290aWF0aW9ucw0KICAgICAgICAqIEJldHRlciBtYW51ZmFjdHVyZSBmb3JlY2FzdGluZw0KICAgICAgICAqIEVhcmxpZXIgZGV0ZWN0aW9uIG9mIHdhcm5pbmcgY29uZGl0aW9ucw0KICAgICAgICAqIEFiaWxpdHkgdG8gZWxpbWluYXRlIHByb2R1Y3RzIGZyb20gcG9ydGZvbGlvDQogICAgICAgICogQWxsb3dzIHByb2R1Y3QgbWFuZ2VycyB0byBtb3JlIHF1aWNrbHkgaWRlbnRpZnkgcHJvZHVjdCBsaW5lcyB0aGF0IGFyZSBub3QgbG9uZ2VyIHJlcXVpcmVkIG9yIHByb2ZpdGFibGUNCiAgICAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBtYXJnaW5zLCBwcm9kdWN0IGJhY2tsb2dzIG9yIGhpc3RvcmljYWwgc2FsZXMgZGF0YSB0byBjcml0aWNhbCBkZWNpc2lvbnMuDQogICAgICAgICogVmlzaWJpbGl0eSB0byBpdHMgY3VzdG9tZXJzIC0gb24gYW4gaW5kaXZpZHVhbCBjdXN0b21lciBsZXZlbCwgd2hhdCBwcm9kdWN0cyB0aGUgY29tcGFueSBzZWxscywgd2hlcmUgaXQgc2VsbHMgdGhlIHByb2R1Y3RzIGFuZCBhdCB3aGF0IHByaWNlIHBvaW50Lg0KICAgICAgICAqIFdvcmxkd2lkZSB2aWV3IG9mIG1hcmtldGluZyBkZXZlbG9wbWVudHMNCiAgICAgICAgKiBDb21tb24gZ2xvYmFsIGxhbmd1YWdlDQogICAgICAgICogTWFya2V0aW5nIGV4ZWN1dGl2ZXMgYXJlIGJldHRlciBhYmxlIHRvIG1hbmFnZSB0aGVpciBwcm9kdWN0IGxpbmVzDQogICAgICAgICogQmV0dGVyIHZpc2liaWxpdHkgaW50byBwcm9kdWN0IGFuZCBjdXN0b21lciBwcm9maXQgbWFyZ2lucw0KICAgICAgICAqIEluZm9ybWF0aW9uIG9uIGN1c3RvbWVycywgcHJvZHVjdHMsIGNvc3RzLCBpbnZvaWNlcw0KICAgICAgICAqIEFjY2VzcyB0byBtYXJrZXQgZGVtYW5kIGRhdGEgKG9yZGVycyBhbmQgc2hpcG1lbnQgZGF0YSkgYnkgYm90aCBmaW5hbmNlIGFuZCBtYXRlcmlhbHMgZ3JvdXBzDQogICAgICAgICogTGVnYWwgZGVwYXJ0bWVudCB1c2VkIERXIHRvIHN1YnN0YW50aWF0ZSB0cmFkZW1hcmsgY2xhaW1zIGluIGZvcmVpZ24gbWFya2V0cw0KICAgICAgICAqIFNhbGVzIGFuYWx5c2lzIGZvciBwcm9kdWN0IG1vdmVtZW50DQogICAgICAgICogU2FsZXMgZGVjaXNpb24gc3VwcG9ydA0KICAgICAgICAgICAgICAqIGFyZSB0aGUgY29tcGFueSdzIHByb2R1Y3RzIG5vdCBiZWluZyBzdG9ja2VkDQogICAgICAgICAgICAgICogbWFya2V0IHNoYXJlDQogICAgICAgICAgICAgICogY29tcGV0aXRvcnMgbWFya2V0IHNoYXJlDQogICAgICAgICAgICAgICogd2hlbiBvdXIgY29tcGFueSBpbmNyZWFzZXMgaXRzIHNoYXJlIG9mIHRoZSBtYXJrZXQsIGl0IGlzIGNvbWluZyBmcm9tIGNvbXBldGl0b3JzIG9yICAgICAgICAgICAgICAgICAgYXJlIHdlIGNhbm5pYmFsaXppbmcgb3VyIG93biBsaW5lDQogICAgICAgICogQ29tcHV0ZXIgY29tcG9uZW50IG1hbnVmYWN0dXJlcg0KICAgICAgICAgICAgICAqIFByb3ZpZGUgc2VsZWN0ZWQgRFcgYWNjZXNzIHRvIGJvdGggY3VzdG9tZXJzIGFuZCBzdXBwbGllcnMNCiAgICAgICAgICAgICAgKiBFeHRlbnNpdmUgbWVhc3VyZW1lbnRzIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBwcm9kdWN0LCBxdWFsaXR5IG9mIGNvbXBvbmVudHMgc3VwcGxpZWQgICAgICAgICAgICAgICAgICBieSB0aGVpciB2ZW5kb3JzDQogICAgICAgICAgICAgICogRXh0ZW5zaXZlIGZlZWRiYWNrIGZyb20gY3VzdG9tZXJzIG9uIHF1YWxpdHkgb2YgdGhlIHByb2R1Y3RzDQogICAgICAgICogU2FsZXMgaGlzdG9yeS9zYWxlcyB0cmVuZHMNCiAgICAgICAgKiBDdXN0b21lciBwcm9maXRhYmlsaXR5DQogICAgICAgICogUGxhbnQgY2FwYWNpdHkgbWFuYWdlbWVudA0KICAgICAgICAqIFZhcmlhbmNlcyBiZXR3ZWVuIHN0YW5kYXJkIGFuZCBhY3R1YWwgcHJvZHVjdCBjb3N0cw0KICAgICAgICAqIEludmVudG9yeSB0dXJub3Zlcg0KICAgICAgICAqIEh1bWFuIHJlc291cmNlcw0KICAgICAgICAqIENvcmUgY29tcGV0ZW5jeSwgc2tpbGxzIGFuZCBkaXN0cmlidXRpb24gb2Ygc2tpbGxzDQogICAgICAgICogQW5hbHlzaXMgb2YgcHJvZHVjdGlvbiBwYXR0ZXJucyB0byBpbXByb3ZlIGludmVudG9yeSBhbmQgcHJpY2luZyBwcmFjdGljZXMNCiAgICAgICAgKiBEZW1hbmQgZm9yZWNhc3RpbmcgdG8gZGV0ZXJtaW5lIG9wdGltYWwgaW52ZW50b3J5DQogICAgICAgICogQW5hbHlzaXMgb2YgcHJvZHVjdCBwcmljaW5nIHRvIGVzdGFibGlzaCBkaXNjb3VudHMgYW5kIG1hcmdpbnMNCiAgICAqIEF1dG9tb2JpbGUgTWFudWZhY3R1cmVyOg0KICAgICAgICAqIFRyYWNrcyBhc3NlbWJseSBhbmQgd2FycmFudHkgcXVhbGl0eSBpbmZvcm1hdGlvbiBieSBzdXBwbGllcg0KICAgICAgICAqIFBsYW5zIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciBwcm9kdWN0IHBsYW5uaW5nIGFuZCBkZXNpZ24NCiAgICAgICAgKiBTdXBwbGllciBxdWFsaXR5IGluZm9ybWF0aW9uIHdpbGwgZ2l2ZSB0aGUgbWFudWZhY3R1cmVyIGEgYmV0dGVyIHBvc2l0aW9uIGZvciBuZWdvdGlhdGlvbiAgICAgICAgICAgICB3aXRoIHN1cHBsaWVyDQogICAgICAgICogUGxhbnMgdG8gcHJvdmlkZSBzdXBwbGllcnMgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGVpciBwcm9kdWN0cyB0aHJvdWdoIHRoZSBJbnRlcm5ldC4gVGhlIGdvYWwgaXMgdG8gZ2l2ZSB0aGVtIGVub3VnaCBpbmZvcm1hdGlvbiBzbyB0aGV5IHdpbGwgaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB0aGVpciBwcm9kdWN0cy4gW1RoZSBzdXBwbGllciBjb3VsZCBiZSBwcm92aWRlZCB3aXRoIGRhdGEgb24gdGhlIGNvc3Qgb2YgZGVmZWN0aXZlIHBhcnRzIHRvIHRoZSBhdXRvbW9iaWxlIG1hbnVmYWN0dXJlci5dDQogICAgICAgICogVGhlIGRhdGEgcHJvdmlkZXMgYSBxdWFudGl0YXRpdmUgbWVhc3VyZSBvZiBxdWFsaXR5IGZvciBib3RoIHRoZSBtYW51ZmFjdHVyZXIgYW5kIHRoZSBzdXBwbGllcg0KICAgICogQXBwbGlhbmNlIE1hbnVmYWN0dXJlcjoNCiAgICAgICAgKiBDdXN0b21lciBzZXJ2aWNlDQogICAgICAgICogU3VwcGxpZXJzJyBxdWFsaXR5DQogICAgICAgICogTmVnb3RpYXRpb24gd2l0aCBzdXBwbGllcnMNCiAgICAqIENsb3RoaW5nIE1hbnVmYWN0dXJlcjoNCiAgICAgICAgKiBBbmFseXplIHNhbGVzIGFuZCBwcm9kdWN0IHRyZW5kcyBieSBsb2NhdGlvbiB0byB1bmRlcnN0YW5kIGN1c3RvbWVyIGJ1eWluZyBwYXR0ZXJucw0KICAgICAgICAqIEFuYWx5emUgc2VsbCB0aHJvdWdoLCB3aGF0IHdhcyBzZWxsaW5nIGF0IHJldGFpbGVycw0KICAgICAgICAqIEFuYWx5emUgYW5kIHVuZGVyc3RhbmQgY2FuY2VsbGF0aW9ucywgdGhlIHJlYXNvbnMgZm9yIHRoZSBjYW5jZWxsYXRpb25zIHRvIGlkZW50aWZ5IHN0ZXBzIHRvIHJlbWVkeSBtYW51ZmFjdHVyaW5nIHByb2JsZW1zDQogICAgKiBDb21wdXRlciBNYW51ZmFjdHVyZXI6IE1hcmtldCBkZW1hbmQgcHJvamVjdGlvbnMNCiAgICAqIEZvb2QgTWFudWZhY3R1cmVyOg0KICAgICAgICAqIE1lYXN1cmUgYWdhaW5zdCBjb21wZXRpdGlvbg0KICAgICAgICAqIEFiaWxpdHkgdG8gcHJvamVjdCBob3cgYSBuZXcgcHJvZHVjdCB3aWxsIGRvDQogICAgICAgICogQWJpbGl0eSB0byBzaG93IGdyb2NlcnkgbWFuYWdlcnMgaG93IHByb2R1Y3QgaXMgc2VsbGluZyBhdCBjb21wZXRpdGl2ZSBzdG9yZXMsIGF0IHN0b3JlcyAgICAgICAgICAgICAgd2l0aGluIHRoZSBzYW1lIGNoYWluIGFuZCBhZ2FpbnN0IGNvbXBldGl0aXZlIHByb2R1Y3RzDQogICAgICAgICogVXNpbmcgYWdlbnRzLCBtb25pdG9ycyBjb25kaXRpb25zIHRoYXQgcmVxdWlyZSBhdHRlbnRpb24gaW5jbHVkaW5nIHZhcmlhbmNlcyBpbiBwcmljZXMgYW5kICAgICAgICAgICAgdm9sdW1lcyBpbiBjb21wYW55J3MgYW5kIGNvbXBldGl0b3JzJyBwcm9kdWN0cw0KICAgICAgICAqIEFuYWx5c2VzIGZpeGVkIGNvc3RzLCBlcXVpcG1lbnQgdXRpbGl6YXRpb24NCiAgICAgICAgKiBBbmFseXNlcyBtYW51ZmFjdHVyaW5nIGNvc3RzIGFuZCBwZXJmb3JtYW5jZQ0KICAgICAgICAqIEFuYWx5c2VzIHByb2R1Y3Rpdml0eQ0KICAgICAgICAqIEFuYWx5c2VzIGludmVudG9yeSBsZXZlbHMNCiAgICAqIFBoYXJtYWNldXRpY2FsIE1hbnVmYWN0dXJlcg0KICAgICAgICAqIEFuYWx5c2lzIG9mIHBoeXNpY2lhbnMgKGFsb25nIHdpdGggbWFuYWdlZC1jYXJlIGNvbm5lY3Rpb25zKSBhbmQgdGhlaXIgcHJlc2NyaWJpbmcgcGF0dGVybnMNCiAgICAgICAgKiBUYXJnZXQgbWFya2V0aW5nDQogICAgICAgICogSWRlbnRpZnkgZW1lcmdpbmcgcHJlc2NyaWJpbmcgdHJlbmRzDQogICAgICAgICogR2VuZXJhdGUgcmVwb3J0cyBmb3IgcHJlLWNsaW5pY2FsIGFwcHJvdmFsIHN0YWdlDQogICAgICAgICogTWVhc3VyZW1lbnQgb2YgdG94aWNvbG9neSBwYXJhbWV0ZXJzDQogICAgICAgICogUmVzZWFyY2ggYW5hbHlzaXMNCiAgICAgICAgKiBUZXN0aW5nIGFuYWx5c2lzDQogICAgKiBTdGVlbCBNYW51ZmFjdHVyZXINCiAgICAgICAgKiBDb250cm9sIChyZWR1Y2UpIGludmVudG9yeQ0KICAgICAgICAqIFVuZGVyc3RhbmQgaXRlbS1sZXZlbCBkZXRhaWwgYnkgY29zdCwgcmV2ZW51ZSwgcHJvZml0LCBpbnZlbnRvcnksIGN1c3RvbWVyLCBsb2NhdGlvbg0KICAgICAgICAqIEFuYWx5c2lzIG9mIHByb2R1Y3Rpb24gcHJvYmxlbXMNCiAgICAgICAgKiBSZWR1Y2UgYWNjb3VudHMgcmVjZWl2YWJsZQ0KICAgICAgICAqIFVuZGVyc3RhbmQgcHJvZml0YWJpbGl0eSBieSBjdXN0b21lcg0KICAgICAgICAqIFVuZGVyc3RhbmQgbWFyZ2lucyBhbmQgcHJvZml0YWJpbGl0eSBieSBtYW51ZmFjdHVyaW5nIGZhY2lsaXR5IGxlYWRpbmcgdG8gZGVjaXNpb25zIGFib3V0IHdoZXJlIHRvIG1hbnVmYWN0dXJlIGVhY2ggaXRlbQ0KICAgICAgICAqIEV2YWx1YXRlIHBvc3NpYmlsaXRpZXMgZm9yIHJlbmVnb3RpYXRpbmcgY29udHJhY3RzIHdpdGggY3VzdG9tZXJzDQogICAgICAgICogSWRlbnRpZnkgb3Bwb3J0dW5pdGllcyBmb3IgbmV3IHByb2R1Y3RzDQogICAgICAgICogSWRlbnRpZnkgb3Bwb3J0dW5pdGllcyBmb3IgbmV3IGxvY2F0aW9ucw0KICAgICAgICAqIENvbXBhcmUgcGxhbnMgdG8gYWN0dWFsIHBlcmZvcm1hbmNlDQogICAgICAgICogSW1wcm92ZSBwcm9kdWN0IGFuZCBjdXN0b21lciBtaXgNCiAgICAqIERhdGEgTWluaW5nDQogICAgICAgICogUXVhbGl0eSBhbmFseXNpcw0KICAgICAgICAqIFByb2ZpdGFiaWxpdHkgYW5kIHByb2JsZW1zIHdpdGggc3VwcGxpZXJzDQogICAgICAgICogUHJvZml0YWJpbGl0eSBhbmQgcHJvYmxlbXMgd2l0aCBjdXN0b21lcnMNCiAgICAqIEN1c3RvbWVyIHByb2ZpdGFiaWxpdHkNCiAgICAqIFByb2R1Y3QgcHJvZml0YWJpbGl0eSBhbmFseXNpcw0KICAgICogU3RyYXRlZ2ljIHBhcnRuZXJpbmc6IE5lZ290aWF0aW5nIHdpdGggc3VwcGxpZXJzLCBjdXN0b21lcnMNCiAgICAqIEN1c3RvbWVyIHB1cmNoYXNlcyB0byBpZGVudGlmeSB3aG8gc2hvdWxkIGdldCBuZXcgTWF0ZXJpYWwgU2FmZXR5IERhdGEgU2hlZXRzDQoqIE1hcmtldGluZyBHZW5lcmFsDQogICAgKiBDb21wYXJpbmcgcHJvZHVjdCBsaW5lcw0KICAgICogTWVkaWEgcmVzZWFyY2ggKE5pZWxzZW4gTWVkaWEgUmVzZWFyY2gpDQoqIFJldGFpbGVycw0KICAgICogVHJhY2tpbmcgYW4gaXRlbXMgY29udHJpYnV0aW9uIHRvIG1hcmdpbiBmb3IgaXRzIGNhdGVnb3J5DQogICAgKiBUcmFja2luZyBob3cgcHJvbW90aW9ucyBhbmQgb25lLXRpbWUgYnV5cyBhcmUgZG9pbmcgaW5jbHVkaW5nIHVzaW5nIHRyZW5kIGFuYWx5c2lzDQogICAgKiBCdXllcnMgdXNpbmcgaXQgdG8gYW5hbHl6ZSBzYWxlcyBkYXRhDQogICAgKiBBbGxvd2luZyBzbG93IHNlbGxpbmcgbGluZXMgYW5kIGl0ZW1zIHRvIGJlIGRyb3BwZWQgZnJvbSB0aGUgc3RvcmVzIHdoaWxlIGdpdmluZyB0aGVpciBzaGVsZiBzcGFjZSB0byBtb3JlIHByb2ZpdGFibGUgb25lcw0KICAgICogQmV0dGVyIHVuZGVyc3RhbmQgY3VzdG9tZXJzIGFuZCB0aGVpciBidXlpbmcgcGF0dGVybnM6DQogICAgICAgICogIERyaXZlcyBwcm9tb3Rpb25zIGJ5IGhhdmluZyBhY2Nlc3MgdG8gYWxsIGRhdGEsIG1hcmtldGluZyBzdGFmZiBjYW4gbWFrZSBtb3JlIGFjY3VyYXRlIGFuZCBlZmZlY3RpdmUgcHJvbW90aW9uIGRlY2lzaW9ucw0KICAgICAgICAqIEZlZWRzIHRhcmdldGVkIGFuZCBtYXNzIG1haWxpbmdzDQogICAgICAgICogRW5hYmxlIHJldGFpbGVyIHRvIHByb2FjdGl2ZWx5IGRldmVsb3AgYSByZWxhdGlvbnNoaXAgd2l0aCBpdHMgYmVzdCBjdXN0b21lcnMgb3IgaW5kaXZpZHVhbHMgdGhhdCBzaG91bGQgYmUgYnV5aW5nIG1vcmUgdGhhbiB0aGV5IGN1cnJlbnRseSBhcmUuDQogICAgKiBNYXJrZXRpbmcgc3RhZmYgY2FuIGFzayAid2hhdCBpZiIgbWFya2V0aW5nIHF1ZXN0aW9ucyBhbmQgZ2V0IGZhc3QgcmVzcG9uc2UNCiAgICAqIE1lZXRzIHRoZSBvYmplY3RpdmVzIG9mIGluY3JlYXNpbmcgc2FsZXMsIGluY3JlYXNpbmcgcHJvZml0LCBpbmNyZWFzaW5nIG1hcmtldGluZyBhbmFseXN0IHByb2R1Y3Rpdml0eSBhbmQgZGVjcmVhc2luZyBtYWlsIGV4cGVuc2UgYW5kIHByb21vdGlvbiBjeWNsZSB0aW1lLg0KICAgICogTWFpbCBwcm9tb3Rpb24gZWZmZWN0aXZlbmVzcyBpcyBlYXNpbHkgYW5kIHF1aWNrbHkgcXVhbnRpZmllZA0KICAgICogU2FsZXMgYW5hbHlzaXMNCiAgICAqIFRhcmdldCBtYXJrZXRpbmcNCiAgICAqIENhcmRob2xkZXIgYmFzZQ0KICAgICogRXZhbHVhdGUgdGVjaG5pY2lhbiB0cmFpbmluZw0KICAgICogRXZhbHVhdGUgbWFpbnRlbmFuY2UgdG9vbCBhbmQgZXF1aXBtZW50IGludmVudG9yeQ0KICAgICogTWVyY2hhbmRpc2luZw0KICAgICogSW52ZW50b3J5IG1hbmFnZW1lbnQNCiAgICAqIEZsb3cgb2YgZ29vZHMgbWFuYWdlbWVudA0KICAgICogUmVsYXRpb25zaGlwIG1hcmtldGluZw0KICAgICogU3VwcGxpZXIgaW50ZWdyYXRpb24NCiAgICAqIE1hcmtldGluZyBzdHJhdGVneQ0KICAgICogQnV5aW5nIHN0cmF0ZWd5DQogICAgKiBNZXJjaGFuZGl6aW5nIHN0cmF0ZWd5DQogICAgKiBTYWxlcyB0cmFja2luZyBieSBpdGVtDQogICAgKiBTYWxlcyBhbmFseXNpcw0KICAgICogRm9yZWNhc3RpbmcNCiAgICAqIEludmVudG9yeSB0cmFja2luZw0KICAgICogTWFya2V0IGJhc2tldCBhbmFseXNpcyAtIGUuZy4gRG8gcHJvZHVjdHMgb24gc2FsZSBnZW5lcmF0ZSBvdGhlciBzYWxlcz8NCiAgICAqIEluZGl2aWR1YWwgaXRlbXMgY29udHJpYnV0aW9uIHRvIHByb2ZpdHMNCiAgICAqIFZlbmRvcnMgKHN1cHBsaWVycykgaGF2ZSBhY2Nlc3MgdG8gaG93IHRoZWlyIHByb2R1Y3RzIGFyZSBzZWxsaW5nDQogICAgKiBTaGVsZiBzcGFjZSBhbGxvY2F0aW9ucw0KICAgICogRWZmZWN0aXZlbmVzcyBvZiBwcm9tb3Rpb25zLCBhZHZlcnRpc2luZw0KICAgICogUHJvZHVjdCBhbmFseXNpczoNCiAgICAgICAgKiByZXN0b2NraW5nDQogICAgICAgICogcHJvZml0YWJpbGl0eQ0KICAgICAgICAqIGludmVudG9yeSB0dXJucw0KICAgICAgICAqIHByaWNlIGNoYW5nZXMNCiAgICAqIENhdGVnb3J5IG1hbmFnZW1lbnQgKGRldGVybWluaW5nIG9wdGltYWwgcHJvZHVjdCBpbiBlYWNoIGNhdGVnb3J5IGFuZCB0aGUgb3B0aW1hbCBwcmljZSBmb3IgdGhhdCAgICAgICBwcm9kdWN0KQ0KICAgICogTWVyY2hhbmRpc2luZyBzdHJhdGVneSBzYWxlcyB0cmFja2luZw0KICAgICAgICAqIGFuYWx5c2lzIGJ5IFNLVSAoc3RvY2sga2VlcGluZyB1bml0KSBieSBzdG9yZQ0KICAgICAgICAqIHRyZW5kIGFuYWx5c2lzDQogICAgKiBDb21wZXRpdGl2ZSBhbmFseXNpcw0KICAgICogVW5kZXJzdGFuZGluZyBjb21wbGFpbnRzLCBjbGFpbXMgYW5kIHJldHVybnMNCiAgICAqIEFuYWx5emUgY3VzdG9tZXIgY29udGFjdHMgdG8gZGV0ZXJtaW5lIHByZWZlcmVuY2VzLCBhdHRyYWN0IGFuZCByZXRhaW4gcHJvZml0YWJsZSBjdXN0b21lcnMNCiAgICAqIFVuZGVyc3RhbmQgY3VzdG9tZXIgYW5kIHByZWRpY3QgYmVoYXZpb3INCiAgICAqIEdvYWwtPiBpbXByb3ZlIGdyb3NzIG1hcmdpbnMNCiAgICAqIEJldHRlciBtZXJjaGFuZGlzaW5nDQogICAgKiBCZXR0ZXIgYnV5aW5nIGRlY2lzaW9ucw0KICAgICogRW5kLW9mLXNlYXNvbiB2ZW5kb3IgbmVnb3RpYXRpb25zDQogICAgKiBJbnZlbnRvcnkgbWFuYWdlbWVudA0KICAgICogUHJpY2UgbWFuYWdlbWVudCBmb3IgbWFya2Rvd25zIGFuZCBwcm9tb3Rpb25zDQogICAgKiBWZW5kb3IgYW5hbHlzaXMNCiAgICAqIERlcGFydG1lbnQgU3RvcmU6DQogICAgICAgICogTWVyY2hhbmRpc2luZyBhbmQgYnV5aW5nIGRlY2lzaW9ucw0KICAgICAgICAqIEluZm9ybWF0aW9uIHRvIG5lZ290aWF0ZSBvbiBlbmQtb2Ytc2Vhc29uIG1lcmNoYW5kaXNlDQogICAgICAgICogSW52ZW50b3J5IGFuZCBwcmljZSBtYW5hZ2VtZW50IGZvciBwcm9tb3Rpb25zIGFuZCBtYXJrZG93bnMNCiAgICAgICAgKiBWZW5kb3IgYW5hbHlzaXMNCiAgICAqIEF1dG9tb2JpbGUgQ29udmVuaWVuY2UgU3RvcmUNCiAgICAgICAgKiBCZXR0ZXIgcHJvZHVjdCBtaXggYnkgbG9jYXRpb24gYW5kIGRlbW9ncmFwaGljcw0KICAgICAgICAqIFVuZGVyc3RhbmRpbmcgcHJpY2Ugem9uZXMsIHByb2ZpdCwgbWFyZ2lucywNCiAgICAgICAgKiBVbmRlcnN0YW5kaW5nIHRoZSBjb21wZXRpdGlvbg0KICAgICAgICAqIFVuZGVyc3RhbmRpbmcgY3VzdG9tZXJzIC0gaW1hZ2VzIG9mIHRoZSBjdXN0b21lcnMgKHdobyBhcmUgdGhleSkNCiAgICAgICAgICAgICogUmVzdWx0cyBvZiBzdXJ2ZXlzDQogICAgICAgICAgICAqIEJyYW5kIHJlY29nbml0aW9uDQogICAgICAgICAgICAqIEN1c3RvbWVyIGRlbW9ncmFwaGljcw0KICAgICAgICAgICAgKiBQcmljZSBzZW5zaXRpdml0eQ0KICAgICAgICAqIE5ldyBsb2NhdGlvbnMNCiAgICAgICAgKiBNb2RlbGluZy90ZXN0aW5nIHByb2ZpdGFiaWxpdHkgb2YgbmV3IGl0ZW1zLCBkaWZmZXJlbnQgcHJvZHVjdCBtaXhlcw0KICAgICAgICAqIEVmZmVjdGl2ZW5lc3Mgb2YgYWR2ZXJ0aXNpbmcgYW5kIHByb21vdGlvbnMNCiAgICAgICAgKiBVbmRlcnN0YW5kaW5nIHNocmlua2FnZSBieSBwcm9kdWN0LCBsb2NhdGlvbiwNCiAgICAgICAgKiBVbmRlcnN0YW5kaW5nIHByb2R1Y3QgdGllLWlucyAoY29mZmVlIGFuZCBkb3VnaG51dHMsIGhvdCBkb2dzIGFuZCBzb2Z0IGRyaW5rcywgZ2Fzb2xpbmUgYW5kIG9pbCwgc21vZyBjaGVjayBhbmQgdHVuZS11cCkgYW5kIHRyeWluZyBvdXQgd2F5cyB0byBleHBsb2l0IHRob3NlIHRpZS1pbnMuDQpTaGVsZiBhbGxvY2F0aW9uDQogICAgICAgICogVXNlIG9mIEFUTSBjYXJkcyB2cyBjYXNoIChhcmUgY3JlZGl0IGNhcmRzIGJlaW5nIGNvbnNpZGVyZWQ/KQ0KICAgICAgICAqIEVmZmVjdGl2ZW5lc3Mgb2YgYWx0ZXJuYXRpdmUgYnVzaW5lc3MgY29udHJvbHMNCiAgICAgICAgKiBTdGF0aXN0aWNhbCBzYW1wbGluZyB3aGVuIG5vdCBhbGwgZGF0YSBpcyBhdmFpbGFibGUNCiAgICAgICAgICAgIC0gU3VwcGxpZXJzL3ZlbmRvcnMNCiAgICAgICAgICAgIC0gUHJpY2UNCiAgICAgICAgICAgIC0gU3VwcG9ydC9zZXJ2aWNlDQogICAgICAgICAgICAtIERlbGl2ZXJ5DQogICAgICAgICAgICAtIFByb2ZpdGFiaWxpdHkNCiAgICAgICAgICAgIC0gUXVhbGl0eQ0KICAgICAgICAgICAgLSBBbHRlcm5hdGl2ZSBzdXBwbGllcnMNCiAgICAgICAgICAgIC0gU3VwcGxpZXIgbmVnb3RpYXRpb25zDQogICAgICAgICAgICAtIEpvaW50IHByb21vdGlvbnMNCiAgICAgICAgICAgIC0gRGVtb2dyYXBoaWMgZGF0YSBmcm9tIHN1cHBsaWVycw0KICAgICAgKiBGYXN0IEZvb2QNCiAgICAgICAgICAqIEFuYWx5c2lzIG9mIGZvb2QgY29zdHMNCiAgICAgICAgICAqIEFuYWx5c2lzIG9mIGxhYm9yIGNvc3RzDQogICAgICAgICAgKiBBbmFseXNpcyBvZiBzYWxlcyBkYXRhDQogICAgICAgICAgKiBTZXJ2aWNlIHF1YWxpdHkNCiAgICAgICAgICAqIEN1c3RvbWVyIGluZm9ybWF0aW9uDQogICAgICAqIERhdGEgTWluaW5nDQogICAgICAgICAgKiBBZHZlcnRpc2luZyBlZmZlY3RpdmVuZXNzDQogICAgICAgICAgKiBNYXJrZXQgYmFza2V0IGFuYWx5c2lzDQogICAgICAgICAgKiBQcm9maXRhYmlsaXR5DQogICAgICAqIFJldGFpbGluZyBHZW5lcmFsDQogICAgICAgICAgKiBQcm9kdWN0IHByb2ZpdGFiaWxpdHkgYW5hbHlzaXMNCiAgICAgICAgICAqIE1lcmNoYW5kaXNlIHBsYW5uaW5nDQogICAgICAgICAgKiBBbmFseXplIHNhbGVzIGZsdWN0dWF0aW9ucw0KICAgICAgICAgICogU2VsbGluZyBtYXJrZXRpbmcgZGF0YSB0byBzdXBwbGllcnMNCiAgICAgICAgICAqIE1hcmtkb3duIG1hbmFnZW1lbnQNCiAgICAgICAgICAqIElkZW50aWZ5IG1hcmtldHMgdG8gdGFyZ2V0IGZvciBuZXdzcGFwZXIgYWR2ZXJ0aXNpbmcgaW5zZXJ0cw0KICAgICAgKiBDYXRhbG9nOiBJZGVudGlmeSBsb3cgcHJvZml0IHByb2R1Y3RzDQoqIFNlcnZpY2VzDQogICAgKiBGaW5hbmNlDQogICAgKiBSZXZlbnVlDQogICAgKiBQdXJjaGFzZSBvcmRlcnMNCiAgICAqIEh1bWFuIHJlc291cmNlcw0KICAgICogQ3VzdG9tZXIgcHJvZmlsZXMNCiAgICAqIE1hdGVyaWFscyBtYW5hZ2VtZW50DQoqIFNwb3J0cw0KICAgICogV2lubmluZyBwbGF5ZXIgY29tYmluYXRpb25zDQogICAgKiBBbmFseXppbmcgc3RyYXRlZ2llcywgcGF0dGVybnMgb2YgcGxheXMsIGRlZmVuc2VzLCBwbGF5ZXJzIGludm9sdmVkDQogICAgKiBQbGF5ZXIgbmVnb3RpYXRpb24NCiAgICAqIEludGVybmV0IHN0YXRpc3RpY2FsIHNlYXJjaGVzIGJ5IGZhbnMNCiogVGVsZXBob25lDQogICAgKiBGaXhlZCBhc3NldCBhbmFseXNpcw0KICAgICogRmFjaWxpdHkgZm9yIHNhbGVzIHJlcHMgdG8gbWFya2V0IHRvIHZvbHVtZSBjdXN0b21lcnMgZGlmZmVyZW50IGxvbmctZGlzdGFuY2UgcGFja2FnZXMgYmFzZWQgb24gdGhlaXIgbGF0ZXN0IGNhbGxpbmcgcGF0dGVybnMuDQogICAgKiBJbnRlZ3JhdGVkIGN1c3RvbWVyIGFuZCBmaW5hbmNpYWwgZGF0YQ0KICAgICogV29yayByZXF1ZXN0IHRyYWNraW5nDQogICAgKiBDdXN0b21lciBpbmZvcm1hdGlvbiBzeXN0ZW1zOg0KICAgICAgICAqIEV4cGxvcmluZyBwcm9kdWN0ICJjaHVybiINCiAgICAgICAgKiBNYW5hZ2luZyBzdHJhdGVnaWMgYWNjb3VudHMNCiAgICAgICAgKiBCdWlsZGluZyBjdXN0b21lciBsb3lhbHR5DQogICAgICAgICogTWFya2V0IHNlZ21lbnRhdGlvbg0KICAgICAgICAqIFRhcmdldCBtYXJrZXRpbmcNCiAgICAqIFByb2R1Y3QgZGV2ZWxvcG1lbnQNCiAgICAqIFJpc2sgYW5kIGZyYXVkIGFzc2Vzc21lbnQNCiAgICAqIEN1c3RvbWVyIGFuYWx5c2lzOiANCiAgICAgICAgLSBXaGljaCBjdXN0b21lcnMgYXJlIG1vc3QgbGlrZWx5IHRvIHJlc3BvbmQgdG8gYW4gb2ZmZXINCiAgICAgICAgLSBXaGljaCBjdXN0b21lcnMgYXJlIGxpa2VseSB0byBhY2NlcHQgbmV3IHRlY2hub2xvZ3kNCiAgICAgICAgLSBXaGljaCBjdXN0b21lcnMgYXJlIGxpa2VseSB0byByZXNwb25kIHRvIGNvbXBldGl0b3JzJyBvZmZlcnMNCiAgICAgICAgLSBIb3cgbXVjaCBjYW4gd2UgZXhwZWN0IGN1c3RvbWVycyB0byBzcGVuZCBvbiB2YXJpb3VzIHByb2R1Y3RzDQogICAgICAgIC0gV2hpY2ggcHJvc3BlY3RzIChub24tY3VzdG9tZXJzKSBhcmUgbGlrZWx5IHRvIGFjY2VwdCBvdXIgb2ZmZXJzDQogICAgKiBJZGVudGlmeWluZyBkZWFkYmVhdCBjdXN0b21lcnMgYW5kIG5vdCBtYXJrZXRpbmcgdG8gdGhlc2UgY3VzdG9tZXJzDQogICAgKiBJZGVudGlmeWluZyBwb3RlbnRpYWxseSBwcm9maXRhYmxlIG1hcmtldCBzZWdtZW50cw0KICAgICogRmVlIHRvbGVyYW5jZQ0KICAgICogVGVsZW1hcmtldGluZw0KICAgICogUHJlZGljdGl2ZSBtb2RlbGluZw0KICAgICogTWVyZ2UgbGlmZXN0eWxlIGFuZCBkZW1vZ3JhcGhpYyBkYXRhIHRvIGV4aXN0aW5nIGN1c3RvbWVyIGluZm9ybWF0aW9uDQogICAgKiBEYXRhIE1pbmluZw0KICAgICAgICAqIEFuYWx5emluZyBjdXN0b21lcnMgbW9zdCBsaWtlbHkgdG8gc3dpdGNoIHRvIGFub3RoZXIgY2Fycmllcg0KICAgICAgICAqIFVuZGVyc3RhbmRpbmcgY3VzdG9tZXJzDQogICAgICAgICogVW5kZXJzdGFuZGluZyBjdXN0b21lcnMnIGRlc2lyZXMgYW5kIGV4cGVjdGF0aW9ucyBpbiBjb250cmFzdCB0byB3aGF0IHRoZXkgaGF2ZSBvcmRlcmVkIGFuZCAgICAgICAgICAgd2hhdCB0aGUgY29tcGFueSBjYW4gcHJvdmlkZQ0KKiBUcmFuc3BvcnRhdGlvbg0KICAgICogVGFyZ2V0IG1hcmtldGluZw0KICAgICogVW5kZXJzdGFuZGluZyBjdXN0b21lciByZXF1aXJlbWVudHMNCiAgICAqIFJhaWxyb2FkOg0KICAgICAgICAqIEN1c3RvbWVyIHNhdGlzZmFjdGlvbg0KICAgICAgICAqIFRyYWluIHBlcmZvcm1hbmNlDQogICAgICAgICogRGVyYWlsbWVudCBwcmV2ZW50aW9uDQogICAgICAgICogQ3JldyBtYW5hZ2VtZW50DQogICAgKiBSYWlscm9hZA0KICAgICAgICAqIEZsZWV0IG1hbmFnZW1lbnQsIGxvY29tb3RpdmUgaW5mb3JtYXRpb24NCiAgICAgICAgKiBDdXN0b21lciBmaW5hbmNpYWwgYW5hbHlzaXMNCiAgICAgICAgKiBSYXRlIGFuYWx5c2lzDQogICAgICAgICogUHJvZml0YWJpbGl0eSBhbmFseXNpcw0KICAgICAgICAqIEZsZWV0IG1haW50ZW5hbmNlIGFuYWx5c2lzDQogICAgICAgICogSWRlbnRpZnkgdGF4LWV4ZW1wdCBwdXJjaGFzZXMNCiAgICAgICAgKiBVbmRlcnN0YW5kaW5nIGNvbXBldGl0b3IncyBjYXJzIG9uIHJhaWxyb2FkJ3MgbGluZQ0KICAgICogQWlybGluZQ0KICAgICAgICAqIEN1c3RvbWVyIHNlcnZpY2UgcHJvZ3JhbSAtIGZpbmFuY2lhbCBkYXRhDQogICAgICAgICogQ2FyZ28gdm9sdW1lIGFuYWx5c2lzIHRvIHVuZGVyc3RhbmQgc291cmNlIG9mIHJldmVudWUNCiAgICAgICAgKiBGcmF1ZCBhbmFseXNpcyAtIGlzc3VpbmcgdGlja2V0cyBvbiBiYWQgY3JlZGl0IGNhcmRzDQogICAgKiBNdWx0aS1pbmR1c3RyeSAoY29uZ2xvbWVyYXRlcykNCiAgICAgICAgKiBQbGFubmluZyBhbmQgZm9yZWNhc3RpbmcNCiAgICAgICAgKiBNYWtlIGNvbXBhcmlzb25zIHRvIHBsYW5zDQoqIENyb3NzIEluZHVzdHJ5DQogICAgKiBMZWdhY3kgc3lzdGVtIHJldGlyZW1lbnQNCiAgICAqIFJlbGlhYmlsaXR5IG9mIHNhbGVzIGZvcmVjYXN0aW5nDQogICAgKiBDYWxsIGNlbnRlcnMsIGV2YWx1YXRpbmcgcHJvZHVjdGl2aXR5IGFuZCBjb3N0cyBhc3NvY2lhdGVkIHdpdGggdmFyeWluZyByZXNwb25zZXMgdG8gY3VzdG9tZXIgcHJvYmxlbXMNCiAgICAqIENvbnRyb2wgb2YgcHJvcGVydHkgYW5kIGluY29tZSB0YXgNCiAgICAqIEZpbmFuY2lhbA0KICAgICAgICAqIEJ1ZGdldHMNCiAgICAgICAgKiBVbmNvdmVyIHByb2JsZW1zIGluIGZpbmFuY2lhbCBudW1iZXJzIGJlZm9yZSB0aGV5IGFyZSByZXBvcnRlZCB0byB1cHBlciBtYW5hZ2VtZW50DQoqIFV0aWxpdGllcw0KICAgICogUHJpY2luZw0KICAgICogU3VwcGx5IGNoYWluDQogICAgKiBBc3NldCBtYW5hZ2VtZW50DQogICAgKiBIdW1hbiBSZXNvdXJjZXMsIE1lZGljYWwgYmVuZWZpdHMgcGFja2FnZSBldmFsdWF0aW9uDQogICAgKiBGaW5hbmNlLCBXaG9sZXNhbGUgcHJpY2luZyBtb2RlbHMNCiAgICAqIEFjY291bnRzIFJlY2VpdmFibGUsIG1heGltaXppbmcgY29sbGVjdGlvbnMgZm9yIGN1c3RvbWVycyB3aG8gbWlzc2VkIGEgcGF5bWVudA0KICAgICogQWNjb3VudHMgUmVjZWl2YWJsZSwgYW5hbHl6aW5nIHByb2Nlc3NlcyB0byBtYXhpbWl6ZSBjb2xsZWN0aW9ucyBmb3Igb3ZlcmR1ZSBhY2NvdW50cw0KICAgICogRml4ZWQgQXNzZXRzDQogICAgKiBDdXN0b21lciBJbmZvcm1hdGlvbiBTeXN0ZW1zDQogICAgICAgICogTWFya2V0aW5nDQogICAgICAgICogQ3VzdG9tZXIgU2F0aXNmYWN0aW9uDQogICAgICAgICogRmluYW5jaWFsDQogICAgICAgICogQ29uc2VydmF0aW9uDQogICAgKiBNYXJrZXRpbmcgUXVlcmllcw0KICAgICAgICAqIERldGVybWluaW5nIGN1c3RvbWVyIHVzYWdlDQogICAgICAgICogVW5kZXJzdGFuZGluZyBkZW1vZ3JhcGhpY3MgYW5kIHVzYWdlIGJ5IGRlbW9ncmFwaGljcw0KICAgICAgICAqIFRyYWNraW5nIG1hcmtldGluZyBwcm9ncmFtcw0KICAgICAgICAqIE1vZGVsaW5nIGEgbmV3IHByb2dyYW0NCiAgICAgICAgKiBDb3N0IGp1c3RpZnlpbmcgYSBuZXcgcHJvZ3JhbQ0KICAgICAgICAqIENvbW1lcmNpYWwgY3VzdG9tZXJzLCBwcmljZSBzZW5zaXRpdml0eQ0KICAgICAgICAqIERhdGEgbWluaW5nLCBsb29raW5nIGZvciBwYXR0ZXJucyB0aGF0IG1heSBiZSBtYXJrZXRpbmcgb3Bwb3J0dW5pdGllcw0KICAgICAgICAqIERhdGEgbWluaW5nLCBsb29raW5nIGZvciBwYXR0ZXJucyB0aGF0IHByZWRpY3QgZGVsaW5xdWVuY2llcw0KICAgICogQ3VzdG9tZXIgU2F0aXNmYWN0aW9uIFF1ZXJpZXMNCiAgICAgICAgKiBUcmFja2luZyBjdXN0b21lciBjb21tZW50cyBhbmQgY29tcGxhaW50cyAoQnkgZGVtb2dyYXBoaWNzICYgQnkgcHN5Y2hvZ3JhcGhpY3MpDQogICAgICAgICogVHJhY2tpbmcgY3VzdG9tZXIgc3VydmV5cw0KICAgICAgICAqIFJlcG9ydGluZyB0byB0aGUgVXRpbGl0eSBDb21taXNzaW9uIGFuZCB0aGUgUHJlc3MNCiAgICAgICAgKiBEYXRhIG1pbmluZw0KICAgICogRmluYW5jaWFsIFF1ZXJpZXMNCiAgICAgICAgKiBDdXN0b21lciBwcm9maXRhYmlsaXR5DQogICAgICAgICogRXZhbHVhdGluZyByZWxhdGlvbnNoaXAgcHJpY2luZw0KICAgICAgICAqIEFzc2Vzc2luZyBhbHRlcm5hdGl2ZSBkZWxpdmVyeSBjaGFubmVscw0KICAgICAgICAqIEFzc2VzcyBvdXRzb3VyY2luZyBwb3NzaWJpbGl0aWVzDQogICAgICAgICogVHJhY2sgcHJvZml0cyBhY3Jvc3MgZGl2aXNpb25zDQogICAgKiBDb25zZXJ2YXRpb24gUXVlcmllcw0KICAgICAgICAqIE1vbml0b3JpbmcgY29uc2VydmF0aW9uIHByb2dyYW1zIGJ5IGN1c3RvbWVyDQogICAgICAgICogSWRlbnRpZnkgcGF0dGVybiBvZiBjdXN0b21lciAoZGVtb2dyYXBoaWNzKSB0aGF0IGNvdWxkIGJlIGNhbmRpZGF0ZSBmb3IgY29uc2VydmF0aW9uIHByb2dyYW0NCiAgICAgICAgKiBJZGVudGlmeWluZyBjdXN0b21lcnMgd2hvIGhhdmUgKG9yIGhhdmUgbm90KSBzaWduZWQgdXAgZm9yIHNwZWNpYWwgcHJvZ3JhbXMNCiAgICAgICAgKiBQZWFrLXBlcmlvZCBBL0MgZGlzYWJsZWQNCiAgICAgICAgKiBPbGQgcmVmcmlnZXJhdG9yIHN1cnJlbmRlcg0KICAgICAgICAqIEZsb3Jlc2NlbnQgYnVsYnMNCg0KDQoqKlR5cGVzIG9mIERhdGEgV2FyZWhvdXNlICoqDQoNCiogQS4gRW50ZXJwcmlzZSBEYXRhIFdhcmVob3VzZToNCg0KRW50ZXJwcmlzZSBEYXRhIFdhcmVob3VzZSBpcyBhIGNlbnRyYWxpemVkIHdhcmVob3VzZS4gSXQgcHJvdmlkZXMgZGVjaXNpb24gc3VwcG9ydCBzZXJ2aWNlIGFjcm9zcyB0aGUgZW50ZXJwcmlzZS4gSXQgb2ZmZXJzIGEgdW5pZmllZCBhcHByb2FjaCBmb3Igb3JnYW5pemluZyBhbmQgcmVwcmVzZW50aW5nIGRhdGEuIEl0IGFsc28gcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBjbGFzc2lmeSBkYXRhIGFjY29yZGluZyB0byB0aGUgc3ViamVjdCBhbmQgZ2l2ZSBhY2Nlc3MgYWNjb3JkaW5nIHRvIHRob3NlIGRpdmlzaW9ucy4NCg0KKiBCLiBPcGVyYXRpb25hbCBEYXRhIFN0b3JlOg0KDQpPcGVyYXRpb25hbCBEYXRhIFN0b3JlLCB3aGljaCBpcyBhbHNvIGNhbGxlZCBPRFMsIGFyZSBub3RoaW5nIGJ1dCBkYXRhIHN0b3JlIHJlcXVpcmVkIHdoZW4gbmVpdGhlciBEYXRhIHdhcmVob3VzZSBub3IgT0xUUCBzeXN0ZW1zIHN1cHBvcnQgb3JnYW5pemF0aW9ucyByZXBvcnRpbmcgbmVlZHMuIEluIE9EUywgRGF0YSB3YXJlaG91c2UgaXMgcmVmcmVzaGVkIGluIHJlYWwgdGltZS4gSGVuY2UsIGl0IGlzIHdpZGVseSBwcmVmZXJyZWQgZm9yIHJvdXRpbmUgYWN0aXZpdGllcyBsaWtlIHN0b3JpbmcgcmVjb3JkcyBvZiB0aGUgRW1wbG95ZWVzLg0KDQoqIEMuIERhdGEgTWFydDoNCg0KQSBkYXRhIG1hcnQgaXMgYSBzdWJzZXQgb2YgdGhlIGRhdGEgd2FyZWhvdXNlLiBJdCBzcGVjaWFsbHkgZGVzaWduZWQgZm9yIGEgcGFydGljdWxhciBsaW5lIG9mIGJ1c2luZXNzLCBzdWNoIGFzIHNhbGVzLCBmaW5hbmNlLCBzYWxlcyBvciBmaW5hbmNlLiBJbiBhbiBpbmRlcGVuZGVudCBkYXRhIG1hcnQsIGRhdGEgY2FuIGNvbGxlY3QgZGlyZWN0bHkgZnJvbSBzb3VyY2VzLg0KDQoNCiogRC4gSW5mb3JtYXRpb24gUHJvY2Vzc2luZw0KDQpBIGRhdGEgd2FyZWhvdXNlIGFsbG93cyB0byBwcm9jZXNzIHRoZSBkYXRhIHN0b3JlZCBpbiBpdC4gVGhlIGRhdGEgY2FuIGJlIHByb2Nlc3NlZCBieSBtZWFucyBvZiBxdWVyeWluZywgYmFzaWMgc3RhdGlzdGljYWwgYW5hbHlzaXMsIHJlcG9ydGluZyB1c2luZyBjcm9zc3RhYnMsIHRhYmxlcywgY2hhcnRzLCBvciBncmFwaHMuDQoNCg0KKiBFLiBBbmFseXRpY2FsIFByb2Nlc3NpbmcgDQoNCkEgZGF0YSB3YXJlaG91c2Ugc3VwcG9ydHMgYW5hbHl0aWNhbCBwcm9jZXNzaW5nIG9mIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gaXQuIFRoZSBkYXRhIGNhbiBiZSBhbmFseXplZCBieSBtZWFucyBvZiBiYXNpYyBPTEFQIG9wZXJhdGlvbnMsIGluY2x1ZGluZyBzbGljZS1hbmQtZGljZSwgZHJpbGwgZG93biwgZHJpbGwgdXAsIGFuZCBwaXZvdGluZy4NCg0KKiBGLiBEYXRhIE1pbmluZw0KDQpEYXRhIG1pbmluZyBzdXBwb3J0cyBrbm93bGVkZ2UgZGlzY292ZXJ5IGJ5IGZpbmRpbmcgaGlkZGVuIHBhdHRlcm5zIGFuZCBhc3NvY2lhdGlvbnMsIGNvbnN0cnVjdGluZyBhbmFseXRpY2FsIG1vZGVscywgcGVyZm9ybWluZyBjbGFzc2lmaWNhdGlvbiBhbmQgcHJlZGljdGlvbi4gVGhlc2UgbWluaW5nIHJlc3VsdHMgY2FuIGJlIHByZXNlbnRlZCB1c2luZyB0aGUgdmlzdWFsaXphdGlvbiB0b29scy4NCg0KDQoNCioqRGF0YXdhcmVob3VzZSAoT0xBUCkgdnMgRGF0YmFzZSAoT0xUUCkgKioNCg0KDQohW10ob2xhcHZzb2x0cC5wbmcpDQoNCg0KDQoqKkdlbmVyYWwgc3RhZ2VzIG9mIERhdGEgV2FyZWhvdXNlICAqKg0KDQpFYXJsaWVyLCBvcmdhbml6YXRpb25zIHN0YXJ0ZWQgcmVsYXRpdmVseSBzaW1wbGUgdXNlIG9mIGRhdGEgd2FyZWhvdXNpbmcuIEhvd2V2ZXIsIG92ZXIgdGltZSwgbW9yZSBzb3BoaXN0aWNhdGVkIHVzZSBvZiBkYXRhIHdhcmVob3VzaW5nIGJlZ3VuLiBUaGUgZm9sbG93aW5nIGFyZSBnZW5lcmFsIHN0YWdlcyBvZiB1c2Ugb2YgdGhlIGRhdGEgd2FyZWhvdXNlOg0KDQoNCiogT2ZmbGluZSBPcGVyYXRpb25hbCBEYXRhYmFzZTogSW4gdGhpcyBzdGFnZSwgZGF0YSBpcyBqdXN0IGNvcGllZCBmcm9tIGFuIG9wZXJhdGlvbmFsIHN5c3RlbSB0byBhbm90aGVyIHNlcnZlci4gSW4gdGhpcyB3YXksIGxvYWRpbmcsIHByb2Nlc3NpbmcsIGFuZCByZXBvcnRpbmcgb2YgdGhlIGNvcGllZCBkYXRhIGRvIG5vdCBpbXBhY3QgdGhlIG9wZXJhdGlvbmFsIHN5c3RlbSdzIHBlcmZvcm1hbmNlLg0KDQoqIE9mZmxpbmUgRGF0YSBXYXJlaG91c2U6IERhdGEgaW4gdGhlIERhdGF3YXJlaG91c2UgaXMgcmVndWxhcmx5IHVwZGF0ZWQgZnJvbSB0aGUgT3BlcmF0aW9uYWwgRGF0YWJhc2UuIFRoZSBkYXRhIGluIERhdGF3YXJlaG91c2UgaXMgbWFwcGVkIGFuZCB0cmFuc2Zvcm1lZCB0byBtZWV0IHRoZSBEYXRhd2FyZWhvdXNlIG9iamVjdGl2ZXMuDQoNCiogUmVhbCB0aW1lIERhdGEgV2FyZWhvdXNlOiBJbiB0aGlzIHN0YWdlLCBEYXRhIHdhcmVob3VzZXMgYXJlIHVwZGF0ZWQgd2hlbmV2ZXIgYW55IHRyYW5zYWN0aW9uIHRha2VzIHBsYWNlIGluIG9wZXJhdGlvbmFsIGRhdGFiYXNlLiBGb3IgZXhhbXBsZSwgQWlybGluZSBvciByYWlsd2F5IGJvb2tpbmcgc3lzdGVtLg0KDQoqIEludGVncmF0ZWQgRGF0YSBXYXJlaG91c2U6IEluIHRoaXMgc3RhZ2UsIERhdGEgV2FyZWhvdXNlcyBhcmUgdXBkYXRlZCBjb250aW51b3VzbHkgd2hlbiB0aGUgb3BlcmF0aW9uYWwgc3lzdGVtIHBlcmZvcm1zIGEgdHJhbnNhY3Rpb24uIFRoZSBEYXRhd2FyZWhvdXNlIHRoZW4gZ2VuZXJhdGVzIHRyYW5zYWN0aW9ucyB3aGljaCBhcmUgcGFzc2VkIGJhY2sgdG8gdGhlIG9wZXJhdGlvbmFsIHN5c3RlbS4NCg0KDQoNCioqV2hvIG5lZWRzIERhdGEgd2FyZWhvdXNlPyAqKg0KDQpEYXRhIHdhcmVob3VzZSBpcyBuZWVkZWQgZm9yIGFsbCB0eXBlcyBvZiB1c2VycyBsaWtlOg0KDQoqIERlY2lzaW9uIG1ha2VycyB3aG8gcmVseSBvbiBtYXNzIGFtb3VudCBvZiBkYXRhDQoqIFVzZXJzIHdobyB1c2UgY3VzdG9taXplZCwgY29tcGxleCBwcm9jZXNzZXMgdG8gb2J0YWluIGluZm9ybWF0aW9uIGZyb20gbXVsdGlwbGUgZGF0YSBzb3VyY2VzLg0KKiBJdCBpcyBhbHNvIHVzZWQgYnkgdGhlIHBlb3BsZSB3aG8gd2FudCBzaW1wbGUgdGVjaG5vbG9neSB0byBhY2Nlc3MgdGhlIGRhdGENCiogSXQgYWxzbyBlc3NlbnRpYWwgZm9yIHRob3NlIHBlb3BsZSB3aG8gd2FudCBhIHN5c3RlbWF0aWMgYXBwcm9hY2ggZm9yIG1ha2luZyBkZWNpc2lvbnMuDQoqIElmIHRoZSB1c2VyIHdhbnRzIGZhc3QgcGVyZm9ybWFuY2Ugb24gYSBodWdlIGFtb3VudCBvZiBkYXRhIHdoaWNoIGlzIGEgbmVjZXNzaXR5IGZvciByZXBvcnRzLCBncmlkcyBvciBjaGFydHMsIHRoZW4gRGF0YSB3YXJlaG91c2UgcHJvdmVzIHVzZWZ1bC4NCiogRGF0YSB3YXJlaG91c2UgaXMgYSBmaXJzdCBzdGVwIElmIHlvdSB3YW50IHRvIGRpc2NvdmVyICdoaWRkZW4gcGF0dGVybnMnIG9mIGRhdGEtZmxvd3MgYW5kIGdyb3VwaW5ncy4NCg0KDQoqKlN0ZXBzIHRvIEltcGxlbWVudCBEYXRhIFdhcmVob3VzZSAqKg0KDQpUaGUgYmVzdCB3YXkgdG8gYWRkcmVzcyB0aGUgYnVzaW5lc3MgcmlzayBhc3NvY2lhdGVkIHdpdGggYSBEYXRhd2FyZWhvdXNlIGltcGxlbWVudGF0aW9uIGlzIHRvIGVtcGxveSBhIHRocmVlIHN0cmF0ZWd5IGFzIGJlbG93DQoNCiogX19FbnRlcnByaXNlIHN0cmF0ZWd5X186IEhlcmUgd2UgaWRlbnRpZnkgdGVjaG5pY2FsIGluY2x1ZGluZyBjdXJyZW50IGFyY2hpdGVjdHVyZSBhbmQgdG9vbHMuIFdlIGFsc28gaWRlbnRpZnkgZmFjdHMsIGRpbWVuc2lvbnMsIGFuZCBhdHRyaWJ1dGVzLiBEYXRhIG1hcHBpbmcgYW5kIHRyYW5zZm9ybWF0aW9uIGlzIGFsc28gcGFzc2VkLg0KKiBfX1BoYXNlZCBkZWxpdmVyeV9fOiBEYXRhd2FyZWhvdXNlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBwaGFzZWQgYmFzZWQgb24gc3ViamVjdCBhcmVhcy4gUmVsYXRlZCBidXNpbmVzcyBlbnRpdGllcyBsaWtlIGJvb2tpbmcgYW5kIGJpbGxpbmcgc2hvdWxkIGJlIGZpcnN0IGltcGxlbWVudGVkIGFuZCB0aGVuIGludGVncmF0ZWQgd2l0aCBlYWNoIG90aGVyLg0KKiBfX0l0ZXJhdGl2ZSBQcm90b3R5cGluZ19fOiBSYXRoZXIgdGhhbiBhIGJpZyBiYW5nIGFwcHJvYWNoIHRvIGltcGxlbWVudGF0aW9uLCB0aGUgRGF0YXdhcmVob3VzZSBzaG91bGQgYmUgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgaXRlcmF0aXZlbHkuDQoNCg0KSGVyZSwgYXJlIGtleSBzdGVwcyBpbiBEYXRhd2FyZWhvdXNlIGltcGxlbWVudGF0aW9uIGFsb25nIHdpdGggaXRzIGRlbGl2ZXJhYmxlcy4NCg0KIVtdKHN0ZXBkdy5wbmcpDQoNCioqQmVzdCBwcmFjdGljZXMgdG8gaW1wbGVtZW50IGEgRGF0YSBXYXJlaG91c2UgKioNCg0KKiBEZWNpZGUgYSBwbGFuIHRvIHRlc3QgdGhlIGNvbnNpc3RlbmN5LCBhY2N1cmFjeSwgYW5kIGludGVncml0eSBvZiB0aGUgZGF0YS4NCiogVGhlIGRhdGEgd2FyZWhvdXNlIG11c3QgYmUgd2VsbCBpbnRlZ3JhdGVkLCB3ZWxsIGRlZmluZWQgYW5kIHRpbWUgc3RhbXBlZC4NCiogV2hpbGUgZGVzaWduaW5nIERhdGF3YXJlaG91c2UgbWFrZSBzdXJlIHlvdSB1c2UgcmlnaHQgdG9vbCwgc3RpY2sgdG8gbGlmZSBjeWNsZSwgdGFrZSBjYXJlIGFib3V0IGRhdGEgY29uZmxpY3RzIGFuZCByZWFkeSB0byBsZWFybiB5b3UncmUgeW91ciBtaXN0YWtlcy4NCiogTmV2ZXIgcmVwbGFjZSBvcGVyYXRpb25hbCBzeXN0ZW1zIGFuZCByZXBvcnRzDQoqIERvbid0IHNwZW5kIHRvbyBtdWNoIHRpbWUgb24gZXh0cmFjdGluZywgY2xlYW5pbmcgYW5kIGxvYWRpbmcgZGF0YS4NCiogRW5zdXJlIHRvIGludm9sdmUgYWxsIHN0YWtlaG9sZGVycyBpbmNsdWRpbmcgYnVzaW5lc3MgcGVyc29ubmVsIGluIERhdGF3YXJlaG91c2UgaW1wbGVtZW50YXRpb24gcHJvY2Vzcy4gRXN0YWJsaXNoIHRoYXQgRGF0YSB3YXJlaG91c2luZyBpcyBhIGpvaW50LyB0ZWFtIHByb2plY3QuIFlvdSBkb24ndCB3YW50IHRvIGNyZWF0ZSBEYXRhIHdhcmVob3VzZSB0aGF0IGlzIG5vdCB1c2VmdWwgdG8gdGhlIGVuZCB1c2Vycy4NCiogUHJlcGFyZSBhIHRyYWluaW5nIHBsYW4gZm9yIHRoZSBlbmQgdXNlcnMuDQoNCg0KKipBZHZhbnRhZ2VzIG9mIERhdGEgV2FyZWhvdXNlOiAqKg0KDQoqIERhdGEgd2FyZWhvdXNlIGFsbG93cyBidXNpbmVzcyB1c2VycyB0byBxdWlja2x5IGFjY2VzcyBjcml0aWNhbCBkYXRhIGZyb20gc29tZSBzb3VyY2VzIGFsbCBpbiBvbmUgcGxhY2UuDQoqIERhdGEgd2FyZWhvdXNlIHByb3ZpZGVzIGNvbnNpc3RlbnQgaW5mb3JtYXRpb24gb24gdmFyaW91cyBjcm9zcy1mdW5jdGlvbmFsIGFjdGl2aXRpZXMuIEl0IGlzIGFsc28gc3VwcG9ydGluZyBhZC1ob2MgcmVwb3J0aW5nIGFuZCBxdWVyeS4NCiogRGF0YSBXYXJlaG91c2UgaGVscHMgdG8gaW50ZWdyYXRlIG1hbnkgc291cmNlcyBvZiBkYXRhIHRvIHJlZHVjZSBzdHJlc3Mgb24gdGhlIHByb2R1Y3Rpb24gc3lzdGVtLg0KKiBEYXRhIHdhcmVob3VzZSBoZWxwcyB0byByZWR1Y2UgdG90YWwgdHVybmFyb3VuZCB0aW1lIGZvciBhbmFseXNpcyBhbmQgcmVwb3J0aW5nLg0KKiBSZXN0cnVjdHVyaW5nIGFuZCBJbnRlZ3JhdGlvbiBtYWtlIGl0IGVhc2llciBmb3IgdGhlIHVzZXIgdG8gdXNlIGZvciByZXBvcnRpbmcgYW5kIGFuYWx5c2lzLg0KKiBEYXRhIHdhcmVob3VzZSBhbGxvd3MgdXNlcnMgdG8gYWNjZXNzIGNyaXRpY2FsIGRhdGEgZnJvbSB0aGUgbnVtYmVyIG9mIHNvdXJjZXMgaW4gYSBzaW5nbGUgcGxhY2UuIFRoZXJlZm9yZSwgaXQgc2F2ZXMgdXNlcidzIHRpbWUgb2YgcmV0cmlldmluZyBkYXRhIGZyb20gbXVsdGlwbGUgc291cmNlcy4NCiogRGF0YSB3YXJlaG91c2Ugc3RvcmVzIGEgbGFyZ2UgYW1vdW50IG9mIGhpc3RvcmljYWwgZGF0YS4gVGhpcyBoZWxwcyB1c2VycyB0byBhbmFseXplIGRpZmZlcmVudCB0aW1lIHBlcmlvZHMgYW5kIHRyZW5kcyB0byBtYWtlIGZ1dHVyZSBwcmVkaWN0aW9ucy4NCg0KKipEaXNhZHZhbnRhZ2VzIG9mIERhdGEgV2FyZWhvdXNlICoqDQoNCiogTm90IGFuIGlkZWFsIG9wdGlvbiBmb3IgdW5zdHJ1Y3R1cmVkIGRhdGEuDQoqIENyZWF0aW9uIGFuZCBJbXBsZW1lbnRhdGlvbiBvZiBEYXRhIFdhcmVob3VzZSBpcyBzdXJlbHkgdGltZSBjb25mdXNpbmcgYWZmYWlyLg0KKiBEYXRhIFdhcmVob3VzZSBjYW4gYmUgb3V0ZGF0ZWQgcmVsYXRpdmVseSBxdWlja2x5DQoqIERpZmZpY3VsdCB0byBtYWtlIGNoYW5nZXMgaW4gZGF0YSB0eXBlcyBhbmQgcmFuZ2VzLCBkYXRhIHNvdXJjZSBzY2hlbWEsIGluZGV4ZXMsIGFuZCBxdWVyaWVzLg0KKiBUaGUgZGF0YSB3YXJlaG91c2UgbWF5IHNlZW0gZWFzeSwgYnV0IGFjdHVhbGx5LCBpdCBpcyB0b28gY29tcGxleCBmb3IgdGhlIGF2ZXJhZ2UgdXNlcnMuDQoqIERlc3BpdGUgYmVzdCBlZmZvcnRzIGF0IHByb2plY3QgbWFuYWdlbWVudCwgZGF0YSB3YXJlaG91c2luZyBwcm9qZWN0IHNjb3BlIHdpbGwgYWx3YXlzIGluY3JlYXNlLg0KKiBTb21ldGltZSB3YXJlaG91c2UgdXNlcnMgd2lsbCBkZXZlbG9wIGRpZmZlcmVudCBidXNpbmVzcyBydWxlcy4NCiogT3JnYW5pc2F0aW9ucyBuZWVkIHRvIHNwZW5kIGxvdHMgb2YgdGhlaXIgcmVzb3VyY2VzIGZvciB0cmFpbmluZyBhbmQgSW1wbGVtZW50YXRpb24gcHVycG9zZS4NCg0KKipUaGUgRnV0dXJlIG9mIERhdGEgV2FyZWhvdXNpbmcgKioNCg0KKiBDaGFuZ2UgaW4gX19SZWd1bGF0b3J5IGNvbnN0cmFpbnNfXyBtYXkgbGltaXQgdGhlIGFiaWxpdHkgdG8gY29tYmluZSBzb3VyY2Ugb2YgZGlzcGFyYXRlIGRhdGEuIFRoZXNlIGRpc3BhcmF0ZSBzb3VyY2VzIG1heSBpbmNsdWRlIHVuc3RydWN0dXJlZCBkYXRhIHdoaWNoIGlzIGRpZmZpY3VsdCB0byBzdG9yZS4NCiogQXMgdGhlIF9fc2l6ZV9fIG9mIHRoZSBkYXRhYmFzZXMgZ3Jvd3MsIHRoZSBlc3RpbWF0ZXMgb2Ygd2hhdCBjb25zdGl0dXRlcyBhIHZlcnkgbGFyZ2UgZGF0YWJhc2UgY29udGludWUgdG8gZ3Jvdy4gSXQgaXMgY29tcGxleCB0byBidWlsZCBhbmQgcnVuIGRhdGEgd2FyZWhvdXNlIHN5c3RlbXMgd2hpY2ggYXJlIGFsd2F5cyBpbmNyZWFzaW5nIGluIHNpemUuIFRoZSBoYXJkd2FyZSBhbmQgc29mdHdhcmUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgdG9kYXkgZG8gbm90IGFsbG93IHRvIGtlZXAgYSBsYXJnZSBhbW91bnQgb2YgZGF0YSBvbmxpbmUuDQoqIF9fTXVsdGltZWRpYSBkYXRhX18gY2Fubm90IGJlIGVhc2lseSBtYW5pcHVsYXRlZCBhcyB0ZXh0IGRhdGEsIHdoZXJlYXMgdGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0cmlldmVkIGJ5IHRoZSByZWxhdGlvbmFsIHNvZnR3YXJlIGF2YWlsYWJsZSB0b2RheS4gVGhpcyBjb3VsZCBiZSBhIHJlc2VhcmNoIHN1YmplY3QuDQoNCg0KDQo8QnI+DQoNCiMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlDQoNCioqV2hhdCBpcyBCdXNpbmVzcyBJbnRlbGxpZ2VuY2U/ICoqDQoNCiogQkkoQnVzaW5lc3MgSW50ZWxsaWdlbmNlKSBpcyBhIHNldCBvZiBwcm9jZXNzZXMsIGFyY2hpdGVjdHVyZXMsIGFuZCB0ZWNobm9sb2dpZXMgdGhhdCBjb252ZXJ0IHJhdyBkYXRhIGludG8gbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbiB0aGF0IGRyaXZlcyBwcm9maXRhYmxlIGJ1c2luZXNzIGFjdGlvbnMuSXQgaXMgYSBzdWl0ZSBvZiBzb2Z0d2FyZSBhbmQgc2VydmljZXMgdG8gdHJhbnNmb3JtIGRhdGEgaW50byBhY3Rpb25hYmxlIGludGVsbGlnZW5jZSBhbmQga25vd2xlZGdlLg0KKiBCSSBoYXMgYSBkaXJlY3QgaW1wYWN0IG9uIG9yZ2FuaXphdGlvbidzIHN0cmF0ZWdpYywgdGFjdGljYWwgYW5kIG9wZXJhdGlvbmFsIGJ1c2luZXNzIGRlY2lzaW9ucy4gQkkgc3VwcG9ydHMgZmFjdC1iYXNlZCBkZWNpc2lvbiBtYWtpbmcgdXNpbmcgaGlzdG9yaWNhbCBkYXRhIHJhdGhlciB0aGFuIGFzc3VtcHRpb25zIGFuZCBndXQgZmVlbGluZy4NCiogQkkgdG9vbHMgcGVyZm9ybSBkYXRhIGFuYWx5c2lzIGFuZCBjcmVhdGUgcmVwb3J0cywgc3VtbWFyaWVzLCBkYXNoYm9hcmRzLCBtYXBzLCBncmFwaHMsIGFuZCBjaGFydHMgdG8gcHJvdmlkZSB1c2VycyB3aXRoIGRldGFpbGVkIGludGVsbGlnZW5jZSBhYm91dCB0aGUgbmF0dXJlIG9mIHRoZSBidXNpbmVzcy4NCg0KDQoqKldoeSBpcyBCSSBpbXBvcnRhbnQ/ICoqDQoNCiFbXShiaS5wbmcpDQoNCg0KPEJyPg0KDQoNCiFbXShiaXNwZWN0cnVtLmpwZykNCg0KDQoNCiogTWVhc3VyZW1lbnQ6IGNyZWF0aW5nIEtQSSAoS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcnMpIGJhc2VkIG9uIGhpc3RvcmljIGRhdGENCiogSWRlbnRpZnkgYW5kIHNldCBiZW5jaG1hcmtzIGZvciB2YXJpZWQgcHJvY2Vzc2VzLg0KKiBXaXRoIEJJIHN5c3RlbXMgb3JnYW5pemF0aW9ucyBjYW4gaWRlbnRpZnkgbWFya2V0IHRyZW5kcyBhbmQgc3BvdCBidXNpbmVzcyBwcm9ibGVtcyB0aGF0IG5lZWQgdG8gYmUgYWRkcmVzc2VkLg0KKiBCSSBoZWxwcyBvbiBkYXRhIHZpc3VhbGl6YXRpb24gdGhhdCBlbmhhbmNlcyB0aGUgZGF0YSBxdWFsaXR5IGFuZCB0aGVyZWJ5IHRoZSBxdWFsaXR5IG9mIGRlY2lzaW9uIG1ha2luZy4NCiogQkkgc3lzdGVtcyBjYW4gYmUgdXNlZCBub3QganVzdCBieSBlbnRlcnByaXNlcyBidXQgU01FIChTbWFsbCBhbmQgTWVkaXVtIEVudGVycHJpc2VzKQ0KKiBUbyBJbXByb3ZlIFZpc2liaWxpdHk6DQogICAgKiBEbyB5b3Uga25vdyB3aG8gdGhlIGJlc3QgcGVyZm9ybWVycyBhcmU/DQogICAgKiBDYW4geW91IGVhc2lseSBpZGVudGlmeSBhcmVhcyBmb3IgaW1wcm92ZW1lbnQ/DQogICAgKiBJcyBzdG9jayBnb2luZyBtaXNzaW5nIGFuZCB5b3UgY2Fu4oCZdCBpZGVudGlmeSB3aGVyZSBpdOKAmXMgZ29pbmc/DQoqIFRvIFR1cm4gRGF0YSBpbnRvIEFjdGlvbmFibGUgSW5mb3JtYXRpb24NCiogVG8gSW1wcm92ZSBFZmZpY2llbmN5DQoqIFRvIEdhaW4gU2FsZXMgJiBNYXJrZXQgSW50ZWxsaWdlbmNlDQoqIFRvIEdhaW4gQ29tcGV0aXRpdmUgSW50ZWxsaWdlbmNlDQoNCg0KKipIb3cgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHN5c3RlbXMgYXJlIGltcGxlbWVudGVkPyAqKg0KDQoqIF9fU3RlcCAxKV9fIFJhdyBEYXRhIGZyb20gY29ycG9yYXRlIGRhdGFiYXNlcyBpcyBleHRyYWN0ZWQuIFRoZSBkYXRhIGNvdWxkIGJlIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgc3lzdGVtcyBoZXRlcm9nZW5lb3VzIHN5c3RlbXMuDQoqIF9fU3RlcCAyKV9fIFRoZSBkYXRhIGlzIGNsZWFuZWQgYW5kIHRyYW5zZm9ybWVkIGludG8gdGhlIGRhdGEgd2FyZWhvdXNlLiBUaGUgdGFibGUgY2FuIGJlIGxpbmtlZCwgYW5kIGRhdGEgY3ViZXMgYXJlIGZvcm1lZC4NCiogX19TdGVwIDMpX18gVXNpbmcgQkkgc3lzdGVtIHRoZSB1c2VyIGNhbiBhc2sgcXVpcmVzLCByZXF1ZXN0ICoqYWQtaG9jIHJlcG9ydHMqKiBvciBjb25kdWN0IGFueSBvdGhlciBhbmFseXNpcy4NCg0KIVtdKGJpc3lzdGVtLmpwZWcpDQoNCg0KKipGb3VyIHR5cGVzIG9mIEJJIHVzZXJzICoqDQoNCkZvbGxvd2luZyBnaXZlbiBhcmUgdGhlIGZvdXIga2V5IHBsYXllcnMgd2hvIGFyZSB1c2VkIEJ1c2luZXNzIEludGVsbGlnZW5jZSBTeXN0ZW06DQoNCjEuIFRoZSBQcm9mZXNzaW9uYWwgRGF0YSBBbmFseXN0OiBUaGUgZGF0YSBhbmFseXN0IGlzIGEgc3RhdGlzdGljaWFuIHdobyBhbHdheXMgbmVlZHMgdG8gZHJpbGwgZGVlcCBkb3duIGludG8gZGF0YS4gQkkgc3lzdGVtIGhlbHBzIHRoZW0gdG8gZ2V0IGZyZXNoIGluc2lnaHRzIHRvIGRldmVsb3AgdW5pcXVlIGJ1c2luZXNzIHN0cmF0ZWdpZXMuDQoNCg0KMi4gVGhlIElUIHVzZXJzOiBUaGUgSVQgdXNlciBhbHNvIHBsYXlzIGEgZG9taW5hbnQgcm9sZSBpbiBtYWludGFpbmluZyB0aGUgQkkgaW5mcmFzdHJ1Y3R1cmUuDQoNCjMuIFRoZSBoZWFkIG9mIHRoZSBjb21wYW55OiBDRU8gb3IgQ1hPIGNhbiBpbmNyZWFzZSB0aGUgcHJvZml0IG9mIHRoZWlyIGJ1c2luZXNzIGJ5IGltcHJvdmluZyBvcGVyYXRpb25hbCBlZmZpY2llbmN5IGluIHRoZWlyIGJ1c2luZXNzLg0KDQo0LiBUaGUgQnVzaW5lc3MgVXNlcnM6IEJ1c2luZXNzIGludGVsbGlnZW5jZSB1c2VycyBjYW4gYmUgZm91bmQgZnJvbSBhY3Jvc3MgdGhlIG9yZ2FuaXphdGlvbi4gVGhlcmUgYXJlIG1haW5seSB0d28gdHlwZXMgb2YgYnVzaW5lc3MgdXNlcnMNCiAgICAqIENhc3VhbCBidXNpbmVzcyBpbnRlbGxpZ2VuY2UgdXNlcg0KICAgICogVGhlIHBvd2VyIHVzZXIuDQoNClRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYm90aCBvZiB0aGVtIGlzIHRoYXQgYSBwb3dlciB1c2VyIGhhcyB0aGUgY2FwYWJpbGl0eSBvZiB3b3JraW5nIHdpdGggY29tcGxleCBkYXRhIHNldHMsIHdoaWxlIHRoZSBjYXN1YWwgdXNlciBuZWVkIHdpbGwgbWFrZSBoaW0gdXNlIGRhc2hib2FyZHMgdG8gZXZhbHVhdGUgcHJlZGVmaW5lZCBzZXRzIG9mIGRhdGEuDQoNCg0KKipBZHZhbnRhZ2VzIG9mIEJ1c2luZXNzIEludGVsbGlnZW5jZSAqKg0KDQpIZXJlIGFyZSBzb21lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIHVzaW5nIEJ1c2luZXNzIEludGVsbGlnZW5jZSBTeXN0ZW06DQoNCjEuIEJvb3N0IHByb2R1Y3Rpdml0eQ0KDQoyLiBUbyBpbXByb3ZlIHZpc2liaWxpdHkNCg0KMy4gRml4IEFjY291bnRhYmlsaXR5DQoNCjQuIEl0IGdpdmVzIGEgYmlyZCdzIGV5ZSB2aWV3DQoNCjUuIEl0IHN0cmVhbWxpbmVzIGJ1c2luZXNzIHByb2Nlc3Nlcw0KDQo2LiBJdCBhbGxvd3MgZm9yIGVhc3kgYW5hbHl0aWNzDQoNCg0KDQoqKkJJIFN5c3RlbSBEaXNhZHZhbnRhZ2VzICoqDQoNCjEuIENvc3QNCg0KMi4gQ29tcGxleGl0eQ0KDQozLiBMaW1pdGVkIHVzZQ0KDQo0LiBUaW1lIENvbnN1bWluZyBJbXBsZW1lbnRhdGlvbg0KDQoNCioqVHJlbmRzIGluIEJ1c2luZXNzIEludGVsbGlnZW5jZSAqKg0KDQoqIEFydGlmaWNpYWwgSW50ZWxsaWdlbmNlOiBHYXJ0bmVyJyByZXBvcnQgaW5kaWNhdGVzIHRoYXQgQUkgYW5kIG1hY2hpbmUgbGVhcm5pbmcgbm93IHRha2Ugb24gY29tcGxleCB0YXNrcyBkb25lIGJ5IGh1bWFuIGludGVsbGlnZW5jZS4gVGhpcyBjYXBhYmlsaXR5IGlzIGJlaW5nIGxldmVyYWdlZCB0byBjb21lIHVwIHdpdGggcmVhbC10aW1lIGRhdGEgYW5hbHlzaXMgYW5kIGRhc2hib2FyZCByZXBvcnRpbmcuDQoqIENvbGxhYm9yYXRpdmUgQkk6IEJJIHNvZnR3YXJlIGNvbWJpbmVkIHdpdGggY29sbGFib3JhdGlvbiB0b29scywgaW5jbHVkaW5nIHNvY2lhbCBtZWRpYSwgYW5kIG90aGVyIGxhdGVzdCB0ZWNobm9sb2dpZXMgZW5oYW5jZSB0aGUgd29ya2luZyBhbmQgc2hhcmluZyBieSB0ZWFtcyBmb3IgY29sbGFib3JhdGl2ZSBkZWNpc2lvbiBtYWtpbmcuDQoqIEVtYmVkZGVkIEJJOiBFbWJlZGRlZCBCSSBhbGxvd3MgdGhlIGludGVncmF0aW9uIG9mIEJJIHNvZnR3YXJlIG9yIHNvbWUgb2YgaXRzIGZlYXR1cmVzIGludG8gYW5vdGhlciBidXNpbmVzcyBhcHBsaWNhdGlvbiBmb3IgZW5oYW5jaW5nIGFuZCBleHRlbmRpbmcgaXQncyByZXBvcnRpbmcgZnVuY3Rpb25hbGl0eS4NCiogQ2xvdWQgQW5hbHl0aWNzOiBCSSBhcHBsaWNhdGlvbnMgd2lsbCBiZSBzb29uIG9mZmVyZWQgaW4gdGhlIGNsb3VkLCBhbmQgbW9yZSBidXNpbmVzc2VzIHdpbGwgYmUgc2hpZnRpbmcgdG8gdGhpcyB0ZWNobm9sb2d5LiBBcyBwZXIgdGhlaXIgcHJlZGljdGlvbnMgd2l0aGluIGEgY291cGxlIG9mIHllYXJzLCB0aGUgc3BlbmRpbmcgb24gY2xvdWQtYmFzZWQgYW5hbHl0aWNzIHdpbGwgZ3JvdyA0LjUgdGltZXMgZmFzdGVyLg0KKiBTZWxmLXNlcnZpY2UgQkkNCg0KDQoqKldoYXQgaXMgU2VsZi1TZXJ2aWNlIEJJPyAqKg0KDQoqIFNlbGYtc2VydmljZSBhbmFseXRpY3Mgb3Igc2VsZi1zZXJ2aWNlIGJ1c2luZXNzIGludGVsbGlnZW5jZSByZWZlcnMgdG8gdG9vbHMgdXNlZCB0byBjb25uZWN0IGFuZCBhbmFseXplIGRhdGEsIGFuZCB3aGljaCBhcmUgb3BlcmF0ZWQgcHJpbWFyaWx5IGJ5IGJ1c2luZXNzIGRlcGFydG1lbnRzIGluIHRoZSBvcmdhbml6YXRpb24gLCByYXRoZXIgdGhhbiBJVCBwcm9mZXNzaW9uYWxzIG9yIGRlZGljYXRlZCBkYXRhIGFuYWx5c3RzLg0KKiANCg0KIVtdKHNzYmljb3Zlci5wbmcpDQoNCg0KDQoqKlRyYWRpdGlvbmFsIEJJIHZzIFNlbGYtU2VydmljZSBCST8gKioNCg0KIVtdKHRyYWRpdGlvbmFsLUJJLmpwZykNCg0KDQo8QnI+DQoNCg0KIVtdKHNzYmkucG5nKQ0KDQo8QnI+DQoNCiFbXShzc2JpMi5wbmcpDQoNCg0KDQo8QnI+DQoNCiFbXShzc2JpdnMuanBnKQ0KDQoNCg0KPEJyPg0KDQoNCioqQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHNvZnR3YXJlICoqDQoNCiFbXShnYXJ0bmVyYmkucG5nKQ0KDQoNCjxCcj4NCg0KIyBFeHRyYXMtMTogQmlnIERhdGENCg0KDQpfX0RhdGEgaXMgZXZlcnl3aGVyZV9fDQoNCg0KRG8geW91IGhhdmUgYSBTbWFydHBob25lPyBPZiBjb3Vyc2UsIHRoaXMga2luZCBvZiBxdWVzdGlvbnMgaXMgbm90IHJlbGV2YW50IGluIHRoaXMgZXJhLiBGcm9tIG91ciBsYXB0b3AsIHRhYmxldCwgUEMgb3Igb3VyIHNtYXJ0cGhvbmUuIFRoZXNlIGRldmljZSBjcmVhdGVzIG1vcmUgZGF0YSB0b2RheS4gRGF0YSBpcyBnZXR0aW5nIGJpZ2dlci4gVGhlIHdvcmxkIGhhcyBhbiBhc3Ryb25vbWljYWwgYW1vdW50IG9mIGRhdGEsIGFuIGFtb3VudCB0aGF0IGdyb3dzIGxhcmdlciBhbmQgbGFyZ2VyIGVhY2ggZGF5LiBUaGlzIEJpZyBEYXRhIGhhcyBjaGFuZ2VkIHRoZSB3YXkgdGhlIHdvcmxkIGludGVyYWN0cywgdW5jb3ZlcmVkIGJyZWFrdGhyb3VnaHMgaW4gZmFzdCBhbGwgb2Ygb3VyIGxpZmUsIGZyb20gZS1jb21tZXJjZSwgbWVkaWNpbmUsIGdlbmV0aWMsIGZpbmFuY2lhbCwgbGF3cywgYW5kIGNyaW1lLCBldGMuIA0KDQoNClRoZSBwcmluY2lwbGUgb2YgYSBCaWcgRGF0YSB3b3JrcyB0aGF0IHRoZSBtb3JlIHRoZSBjb21wYW55IGhhcyBkYXRhLCB0aGUgbW9yZSBhY2N1cmF0ZWx5IHRoZSBjb21wYW55IGdldCBuZXcgKippbnNpZ2h0cyoqIGFuZCBtYWtlICoqcHJlZGljdGlvbnMqKiBhYm91dCB3aGF0IHdpbGwgaGFwcGVuIGluIHRoZSBmdXR1cmUuIEFsc28gcmV2ZWFsZWQgbmV3IHdheXMgdG8gdW5kZXJzdGFuZCB0cmVuZHMgaW4gYnVzaW5lc3MuIEJ5IGNvbXBhcmluZyBtb3JlIGFuZCBtb3JlIGRhdGEgYW5kIGNyZWF0aW5nIHJlbGF0aW9uc2hpcHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaGlkZGVuIGVuYWJsZSB0aGUgY29tcGFueSB0byBsZWFybiBhbmQgbWFrZSBzbWFydGVyIGRlY2lzaW9ucyBvbiB0YXJnZXRpbmcgYnVzaW5lc3MgdmFsdWVzIHN1Y2ggYXMgc2FsZXMsIHByb2R1Y3Rpb24sIG1hcmtldGluZyBvciBmaW5hbmNpYWwgc2l0dWF0aW9ucy4NCg0KDQoNCkJhc2VkIG9uIGBmb3JiZXMuY29tYCBvbmx5ICoqNTMlKiogaGF2ZSBiaWcgZGF0YSBzdHJhdGVnaWVzIGFyb3VuZCB0aGUgd29ybGQuIFRoZSB0b3AgdGhyZWUgdXNlIGNhc2UgaXMgKipyZXRhaWwqKiwgKipzb2NpYWwgYW5hbHlzaXMqKiwgYW5kICoqcHJlZGljdGl2ZSBtYWludGVuYW5jZSoqLiBLZXkgcG9pbnRzIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoNCg0KKiBSZXBvcnRpbmcsIGRhc2hib2FyZHMsIGFkdmFuY2VkIHZpc3VhbGl6YXRpb24sIHNlbGYtc2VydmljZSBidXNpbmVzcyBpbnRlbGxpZ2VuY2UsIGFuZCBkYXRhIHdhcmVob3VzaW5nIGFyZSB0aGUgdG9wIGZpdmUgdGVjaG5vbG9naWVzLg0KDQohW10oMS5qcGcpDQoNCg0KKiBPbmx5IDUzJSBvZiBjb21wYW5pZXMgYXJlIHVzaW5nIGJpZyBkYXRhIGFuYWx5dGljcyB0b2RheSwgaXQgZ3JldyAxNyUgaW4gMjAxNS4gVGVsZWNvbW11bmljYXRpb25zIGFuZCBGaW5hbmNpYWwgU2VydmljZXMgSW5kdXN0cmllcyBhcmUgdGhlIGZhc3Rlc3QgYWRvcHRpb25zLg0KDQoNCg0KIVtdKDIuanBnKQ0KDQoNCg0KKiBUaGUgbW9zdCBpbXBvcnRhbnQgYmlnIGRhdGEgYW5hbHl0aWNzIHVzZSBjYXNlIGluIDIwMTcgaXMgZGF0YSB3YXJlaG91c2Ugb3B0aW1pemF0aW9uLiBUaGUgc2Vjb25kcyBhcmUgY3VzdG9tZXIvc29jaWFsIGFuYWx5c2lzIGFuZCBwcmVkaWN0aXZlIG1haW50ZW5hbmNlLg0KDQohW10oMy5qcGcpDQoNCg0KDQoqIEJpZyBkYXRhIGFuYWx5dGljcyB1c2UgY2FzZXMgdmFyeSBzaWduaWZpY2FudGx5IGJ5IGluZHVzdHJ5LiBEYXRhIHdhcmVob3VzZSBvcHRpbWl6YXRpb24gZG9taW5hdGVkIEZpbmFuY2lhbCBTZXJ2aWNlcyBhbmQgSGVhbHRoY2FyZSBJbmR1c3RyeS4gQ3VzdG9tZXIgLyBTb2NpYWwgQW5hbHlzaXMgaXMgdGhlIGxlYWRpbmcgdXNlIGNhc2UgaW4gdGVjaG5vbG9neS1iYXNlZCBjb21wYW5pZXMuDQoNCg0KIVtdKDQuanBnKQ0KDQoNCg0KKiBUaGUgZmlyc3QgYmlnIGRhdGEgaW5mcmFzdHJ1Y3R1cmUgaXMgU3BhcmsuIEFuZCBUaGUgb3RoZXIgdHdvIG1vc3QgcG9wdWxhciBzb2Z0d2FyZSBmb3IgYmlnIGRhdGEgaW5mcmFzdHJ1Y3R1cmUgaXMgTWFwUmVkdWNlIGFuZCBZYXJuLg0KDQoNCiFbXSg1LmpwZykNCg0KDQoNCg0KKiBTcGFyayBTUUwsIEhpdmUsIEhERlMsIGFuZCBBbWF6b24gUzMgYXJlIHRvcCB0aHJlZSB0aGUgYmlnIGRhdGEgYWNjZXNzIG1ldGhvZHMgYnkgcmVzcG9uZGVudHMuDQoNCiFbXSg2LmpwZykNCg0KDQoNCiogTWFjaGluZSBsZWFybmluZyB3aXRoIFNwYXJrIE1hY2hpbmUgTGVhcm5pbmcgTGlicmFyeSAoTUxpYikgZ290IG1vcmUgaW5kdXN0cnkgc3VwcG9ydCBhbmQgaW52ZXN0bWVudCBwbGFucy4gVGhlIGdyb3d0aCBwcm9qZWN0ZWQgYnkgNjAlIGluIHRoZSBuZXh0IDEyIG1vbnRocy4NCg0KIVtdKDcuanBnKQ0KDQoNCg0KVGhlIEJpZyBGb3VyIENvbnN1bHRhbnQgKERlbG9pdHRlLCBFcm5zdCAmIFlvdW5nLCBLUE1HIGFuZCBQcmljZXdhdGVyaG91c2VDb29wZXJzKSBhcmUgdGhlIGZvdXIgYmlnZ2VzdCBwcm9mZXNzaW9uYWwgc2VydmljZXMgbmV0d29ya3MgaW4gdGhlIHdvcmxkLiBUaGV5IGRpZCBhbHNvIHNvIG1hbnkgcmVzZWFyY2ggYWJvdXQgdGhpcyB0aGVtZS4gT25lIG9mIHRoZSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgcGFwZXIgYCJHdXQgJiBnaWdhYnl0ZXMiIGZyb20gUHJpY2V3YXRlcmhvdXNlQ29vcGVycyAoUHdDKWAuDQoNCg0KVGhlIHBvaW50IGlzIHRoYXQgZXhlY3V0aXZlcyByZWx5IG1vcmUgb24gZXhwZXJpZW5jZSBhbmQgYWR2aWNlIHRoYW4gZGF0YSB0byBtYWtlIGJ1c2luZXNzLWRlZmluaW5nIGNob2ljZXMgYnV0IHRoZSBkYXRhLWRyaXZlbiBjdWx0dXJlcyBjb3VsZCBiZSBpbXBhY3RlZCBtb3JlIGZvciBkZWNpc2lvbi1tYWtpbmcuIA0KDQoqKlRoZSBzdW1tYXJ5IG9mIHRoaXMgcGFwZXI6KioNCg0KPiAqIEhpZ2hseSBkYXRhLWRyaXZlbiBjb21wYW5pZXMgYXJlIHRocmVlIHRpbWVzIG1vcmUgbGlrZWx5IHRvIHJlcG9ydCBzaWduaWZpY2FudCBpbXByb3ZlbWVudCBpbiBtYWtpbmcgYmlnIGRlY2lzaW9ucywgYnV0IG9ubHkgMSBpbiAzIGV4ZWN1dGl2ZXMgc2F5IHRoZWlyIG9yZ2FuaXphdGlvbiBpcyBoaWdobHkgZGF0YS1kcml2ZW4uDQoNCg0KDQo+ICogTW9yZSBiaWcgZGVjaXNpb25zIGFyZSBtYWRlIG9wcG9ydHVuaXN0aWNhbGx5IHRoYW4gZGVsaWJlcmF0ZWx5LCBhbmQgYmlnIGRlY2lzaW9ucyBoYXZlIGEgYmlnIGltcGFjdCBvbiBmdXR1cmUgcHJvZml0YWJpbGl0eTsgbmVhcmx5IDEgaW4gMyBleGVjdXRpdmVzIHZhbHVlIHRob3NlIGRlY2lzaW9ucyBhdCAkMSBiaWxsaW9uKw0KDQoNCg0KPiAqIE1hbnkgZXhlY3V0aXZlcyBza2VwdGljYWwgb3IgZnJ1c3RyYXRlZCBieSB0aGUgcHJhY3RpY2FsIGFwcGxpY2F0aW9uIG9mIGRhdGEgYW5kIGFuYWx5dGljcyBmb3IgYmlnIGRlY2lzaW9ucywgZXNwZWNpYWxseSBpbiBlbWVyZ2luZyBtYXJrZXRzDQoNCg0KDQpBbmQgdGhlICoqZml2ZSBpbXBvcnRhbnQgKiogaXNzdWVzIGluIHRoaXMgc3VydmV5IGFyZSBncm93aW5nIHRoZSBleGlzdGluZyBidXNpbmVzcywgY29sbGFib3JhdGluZyB3aXRoIGNvbXBldGl0b3JzLCBzaHJpbmtpbmcgdGhlIGV4aXN0aW5nIGJ1c2luZXNzLCBlbnRlcmluZyBhIG5ldyBpbmR1c3RyeSBvciBzdGFydGluZyBhIG5ldyBidXNpbmVzcywgYW5kIGNvcnBvcmF0ZSBmaW5hbmNpbmcuDQoNCg0KVGhlIGxhc3QgcXVlc3Rpb25zIG9mIHRoaXMgaW50cm9kdWN0aW9uIGFyZSBob3cgZGF0YSBhbmFseXRpY3MgY2FuIGltcHJvdmUgeW91ciBidXNpbmVzc2VzPyBCZWxvdyBhcmUgdGhlIGFuc3dlcmVkLg0KDQoxLiBNYWtlIGRhdGEtZHJpdmVuIGJ1c2luZXNzIGRlY2lzaW9uczogDQoNCj4gKiBNYWtpbmcgZXZpZGVuY2UtYmFzZWQgcmF0aGVyIHRoYW4gaW50dWl0aW9uLWJhc2VkIGRlY2lzaW9ucw0KDQoyLiBHcm93IHlvdXIgYnVzaW5lc3Mg4oCTIGRpc2NvdmVyIG5ldyBvcHBvcnR1bml0aWVzDQoNCj4gKiBRdWlja2x5IGlkZW50aWZ5IGZ1dHVyZSBtYXJrZXRzIGFuZCB0aGUgYmVzdCBhcmVhcyBmb3IgbmV3IGludmVzdG1lbnRzDQoNCj4gKiBCb29zdCBncm93dGggdGhyb3VnaCBzdHJhdGVnaWMgcHJpY2luZyBtb2RlbHMgYW5kIGRhdGEtZHJpdmVuIG1hcmtldGluZw0KDQoNCg0KMy4gQ3JlYXRlIGEgbW9yZSBlZmZpY2llbnQgYW5kIHNtYXJ0ZXIgb3JnYW5pemF0aW9uDQoNCj4gKiBQcmVkaWN0IGFuZCBhbnRpY2lwYXRlIHRoZSBpbXBhY3RzIG9mIGVjb25vbWljLCBtYXJrZXQgYW5kIHJlZ3VsYXRvcnkNCmZvcmNlcyBvbiBidXNpbmVzcyBzdHJhdGVneSBhbmQgcmVzdWx0cw0KDQo+ICogVXNlIGF1dG9tYXRpb24gYW5kIGFkdmFuY2VkIHN0YXRpc3RpY2FsIHNvZnR3YXJlIHRvIGhhbmRsZSBhbmQgYW5hbHl6ZQ0KaHVnZSB2b2x1bWVzIG9mIGRhdGEgDQoNCg0KNC4gTWFuYWdlIHJpc2sgYW5kIHJlZ3VsYXRvcnkNCg0KPiAqIE1pbmltaXplIGNvbXBsaWFuY2Ugcmlza3MgYnkgZW5zdXJpbmcgdGhlIGNvbXBsZXRlbmVzcywNCmFjY3VyYWN5LCBhbmQgYXZhaWxhYmlsaXR5IG9mIGRhdGEgc291cmNlcw0KDQoNCg0KDQoNCl9fQmlnIERhdGEgRGVmaW5pdGlvbl9fDQoNCkFzIGRhdGEgYmVjb21lcyBiaWdnZXIsIG1hbmlwdWxhdGluZyBvZiBhdmFpbGFibGUgZGF0YSB0byBnZXQgaW5zaWdodHMgYW5kIG1ha2UgYnVzaW5lc3MgZGVjaXNpb25zIGNhbiBiZSB1c2VmdWwuIFN0YXRpc3RpY2FsIG1ldGhvZHMsIGFydGlmaWNpYWwgaW50ZWxsaWdlbmNlLCBtYWNoaW5lIGxlYXJuaW5nLCBhbmQgZGF0YSBtYW5pcHVsYXRpb24gYXJlIHNvbWUgb2YgdGhlIG5ldyB0ZXJtcyB0aGF0IGV2ZXJ5IGJ1c2luZXNzIGxlYWRlcnMgYXQgZXZlcnkgbGV2ZWwgbmVlZCB0byBiZWNvbWUgZGF0YSBsaXRlcmF0ZSBhbmQgYmUgYWJsZSB0byB1bmRlcnN0YW5kIGRhdGEgYW5kIGFuYWx5dGljYWwgY29uY2VwdHMuDQoNCg0KQmVmb3JlIGdvaW5nIGZ1cnRoZXIsIHdoYXQgaXMgYWN0dWFsbHkgQmlnIGRhdGE/LiBCaWcgZGF0YSB0ZXJtIGNvbWVzIGZyb20gYEpvaG4gTWFzaGV5YCBpbiAxOTkwLCBhIGNvbXB1dGVyIHNjaWVudGlzdCBmcm9tIFBlbm5zeWx2YW5pYSBTdGF0ZSBVbml2ZXJzaXR5LiAgSXQgYWxsIHN0YXJ0cyB3aXRoIHRoZSBiaWcgYmFuZyBleHBsb3Npb24gaW4gdGhlIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUgY3JlYXRlZCBzaW5jZSB0aGUgcmlzZSBvZiB0aGUgZGlnaXRhbCBlcmEuIFNpZGUgZWZmZWN0cyBvZiB0aGUgcmlzZSBvZiBjb21wdXRlcnMsIHRoZSBJbnRlcm5ldCBhbmQgdGVjaG5vbG9neSB0aGF0IGNhcGFibGUgb2YgY2FwdHVyaW5nIGRhdGEgZnJvbSBhbGwga2luZCBvZiBlbGVjdHJvbmljIHByb2Nlc3NpbmcuDQoNCg0KQmlnIERhdGEgaGFzIDMgZGVmaW5pbmcgcHJvcGVydGllcyBjYWxsIDNWLiBUaGlzIHRlcm0gaW50cm9kdWNlcyBieSBgR2FydG5lciBhbmFseXN0IERvdWcgTGFuZXlgIGluIGEgMjAwMSBNZXRhR3JvdXAgcmVzZWFyY2ggcHVibGljYXRpb24uIEhlIHB1Ymxpc2hlZCB0aGF0IHB1YmxpY2F0aW9uIHdpdGggdGhlIHRpdGxlIOKAnDNEIERhdGEgTWFuYWdlbWVudDogQ29udHJvbGxpbmcgZGF0YSB2b2x1bWUsIHZhcmlldHksIGFuZCB2ZWxvY2l0eeKAnS4gQWxzbywgbm90IGFsbCBkYXRhIGlzIGJpZyBkYXRhIGV4Y2VwdCB0aGV5IGhhdmUgMyBwcm9wZXJ0aWVzLiBTb21lIG90aGVyIGRhdGEgZXhwZXJ0IGFkZGVkIGFub3RoZXIgMlYsIHZhbHVlLCBhbmQgdmVyYWNpdHksIGJ1dCB0aGUgbWFpbiB0ZXJtIGlzIGFsd2F5cyAzVi4NCg0KKioxLiBWb2x1bWU6KiogVm9sdW1lIHJlZmVycyB0byB0aGUgaHVnZSBhbW91bnRzIG9mIGRhdGEgZ2VuZXJhdGVkIGVhY2ggdGltZSBmcm9tIGFsbCB0aGUgZWxlY3Ryb25pYyBkZXZpY2Ugc3VjaCBhcyB3ZWJzaXRlLCBzb2NpYWwgbWVkaWEsIGNlbGwgcGhvbmVzLCBjYXJzLCBjcmVkaXQgY2FyZHMsIHNlbnNvcnMsIHBob3RvZ3JhcGhzLCB2aWRlbywgZXRjLiBWb2x1bWUgaXMgdGhlICdWJyBtb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVybSBvZiBiaWcgZGF0YSBiZWNhdXNlIHZvbHVtZSBjYW4gYmUgaW5jcmVkaWJsZSBleHBsb2RpbmcgYmlnLiBCZWxvdyBpcyB0aGUgZXhwbGFuYXRpb24gZnJvbSBzaXNlbnNlLmNvbS4NCg0KIVtdKDguanBnKQ0KDQoNCkZvciBFeGFtcGxlIGluIHRoZSBpbnRlcm5ldCB3b3JsZC4gRmFjZWJvb2sgaXMgc3RvcmluZyAyNTAgYmlsbGlvbiBpbWFnZXMgQXMgZmFyIGJhY2sgYXMgMjAxNiwgRmFjZWJvb2sgaGFkIDIuNSB0cmlsbGlvbiBwb3N0cy4gQ2FuIHlvdSBpbWFnaW5lIGZvciB0aGUgb3RoZXIgb25saW5lIG1lZGlhIHN1Y2ggYXMgdHdpdHRlciwgYmxvZywgaW5zdGFncmFtIGFuZCBvdXIgc2VhcmNoaW5nIG9uIGdvb2dsZT8gSXQgaXMgYW4gZXh0cmVtZSBhbW91bnQgb2YgZGF0YS4gVGhpcyBsaW5rIHNob3dzIHRoZSBsaXZlIHN0YXRpc3RpY3Mgb2Ygc29tZSBvbmxpbmUgYXJlYSBzdWNoIGFzIGZhY2Vib29rLCB0d2l0dGVyLiwgaW50ZXJuZXQgdXNlcnMsIGV0Yy4NCg0KDQpodHRwOi8vd3d3LmludGVybmV0bGl2ZXN0YXRzLmNvbS8NCg0KIVtdKDkuUE5HKQ0KDQoNCg0KIVtdKDEwLlBORykNCg0KDQpPcg0KDQpodHRwOi8vd3d3Lndvcmxkb21ldGVycy5pbmZvLw0KDQoNClRoZSB3b3JsZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHBvcHVsYXRpb24sIGhlYWx0aCwgZWNvbm9taWNzLCBmb29kLCB3YXRlciwgZW5lcmd5LCBldGMuDQoNCiFbXSgxMS5QTkcpDQoNCg0KIVtdKDEyLlBORykNCg0KDQoqKjMuIHZlbG9jaXR5OioqIFRoZXJlIGlzIGZvdXIgdmVsb2NpdHkgdHlwZSBpbiBiaWcgZGF0YS4NCg0KKiBCYXRjaA0KKiBQZXJpb2RpYw0KKiBOZWFyIHJlYWwtdGltZQ0KKiBSZWFsLXRpbWUNCg0K4oCcRmlyZWhvc2XigJ0gZGF0YSBzb3VyY2VzIHN1Y2ggYXMgc29jaWFsIG1lZGlhIGFuZCBlLWNvbW1lcmNlIG5lZWQgcXVpY2tseSBhbmFseXRpY3MuIFVzaW5nIHJlYWwtdGltZSBhbGVydGluZywgYFdhbC1NYXJ0YCBjb21wYW55IHdhcyBhYmxlIHRvIGZpbmQgYSBwYXJ0aWN1bGFyIHNwb3J0IHNob2VzIHdoZXJlIGl0IHdhc27igJl0IHNlbGxpbmcgYXQgYWxsLiBNb3JlIHRoYW4gcmVhbHRpbWUgYnV0IHByZWRpY3RpdmUgYW5hbHl0aWNzLiANCg0KVGhlIGluZm9ncmFwaGljcyAmIGFuaW1hdGlvbnMgdG8gdW5kZXJzdGFuZCBtb3JlIG9mIHRoZSAzViBvZiBiaWcgZGF0YSBmcm9tIElCTSBhcmUgYmVsb3cgDQoNCg0KDQoNCiFbXSgxMy5qcGcpDQoNCg0KDQo8QnI+DQoNCiMgRXh0cmFzLTI6IEludHJvZHVjdGlvbiB0byBEYXRhIFZpeg0KDQoqIFtJbnRyb2R1Y3Rpb246XShodHRwczovL2dpdGh1Yi5jb20vZ2FzdG9uc3RhdC9pbnRybzJkYXRhdmlzL2Jsb2IvbWFzdGVyL3NsaWRlcy8wMS1pbnRyb2R1Y3Rpb24vMDEtaW50cm9kdWN0aW9uLnBkZikgDQoqIFtDbGFzc2ljIEV4YW1wbGVzOl0oaHR0cHM6Ly9naXRodWIuY29tL2dhc3RvbnN0YXQvaW50cm8yZGF0YXZpcy9ibG9iL21hc3Rlci9zbGlkZXMvMDItY2xhc3NpYy1leGFtcGxlcy8wMi1jbGFzc2ljLWV4YW1wbGVzLnBkZikgDQoqIFtWaXN1YWxpemF0aW9uIEJhc2ljc10oaHR0cHM6Ly9naXRodWIuY29tL2dhc3RvbnN0YXQvaW50cm8yZGF0YXZpcy9ibG9iL21hc3Rlci9zbGlkZXMvMDMtdmlzdWFsaXphdGlvbi1iYXNpY3MvMDMtdmlzdWFsaXphdGlvbi1iYXNpY3MucGRmKQ0KKiBbVmlzdWFsIFN5c3RlbV0oaHR0cHM6Ly9naXRodWIuY29tL2dhc3RvbnN0YXQvaW50cm8yZGF0YXZpcy9ibG9iL21hc3Rlci9zbGlkZXMvMDQtdmlzdWFsLXN5c3RlbS8wNC12aXN1YWwtc3lzdGVtLnBkZikNCiogW1Zpc3VhbCBQZXJjZXB0aW9uXShodHRwczovL2dpdGh1Yi5jb20vZ2FzdG9uc3RhdC9pbnRybzJkYXRhdmlzL2Jsb2IvbWFzdGVyL3NsaWRlcy8wNS12aXN1YWwtcGVyY2VwdGlvbi8wNS12aXN1YWwtcGVyY2VwdGlvbi5wZGYpDQoqIFtXaGF0LWlzLWNvbG9yXShodHRwczovL2dpdGh1Yi5jb20vZ2FzdG9uc3RhdC9pbnRybzJkYXRhdmlzL2Jsb2IvbWFzdGVyL3NsaWRlcy8wNy13aGF0LWlzLWNvbG9yLzA3LXdoYXQtaXMtY29sb3IucGRmKQ0KKiBbQ29sb3IgVmlzaW9uXShodHRwczovL2dpdGh1Yi5jb20vZ2FzdG9uc3RhdC9pbnRybzJkYXRhdmlzL2Jsb2IvbWFzdGVyL3NsaWRlcy8wOC1jb2xvci12aXNpb24vMDgtY29sb3ItdmlzaW9uLnBkZikNCiogW0VmZmVjdGl2ZSBjaGFydHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9nYXN0b25zdGF0L2ludHJvMmRhdGF2aXMvYmxvYi9tYXN0ZXIvc2xpZGVzLzEwLWVmZmVjdGl2ZS1jaGFydHMvMTAtZWZmZWN0aXZlLWNoYXJ0cy5wZGYpDQoqIFtWYXJpb3VzIEV4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vZ2FzdG9uc3RhdC9pbnRybzJkYXRhdmlzL2Jsb2IvbWFzdGVyL3NsaWRlcy8xMS12YXJpb3VzLWV4YW1wbGVzLzExLXZhcmlvdXMtZXhhbXBsZXMucGRmKQ0KKiBbR3JhcGhpbmcgUHJvY2Vzc10oaHR0cHM6Ly9naXRodWIuY29tL2dhc3RvbnN0YXQvaW50cm8yZGF0YXZpcy9ibG9iL21hc3Rlci9zbGlkZXMvMTItZ3JhcGhpbmctcHJvY2Vzcy8xMi1ncmFwaGluZy1wcm9jZXNzLnBkZikNCiogW0VudGVydGFpbm1lbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9nYXN0b25zdGF0L2ludHJvMmRhdGF2aXMvYmxvYi9tYXN0ZXIvc2xpZGVzLzEzLWVudGVydGFpbm1lbnQvMTMtZW50ZXJ0YWlubWVudC5wZGYpDQoNCg0KDQoNCjxCcj4NCg0KIyBFeHRyYXMtMzogQ29tcHV0aW5nIHdpdGggRGF0YQ0KDQoqIFtUaGUgRGF0YSBBbmFseXNpcyBDeWNsZS1EQUNdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3ByZXNlbnRhdGlvbi9kLzFmSjFjdlZQNzV3UG5aaFktcWQxcWZFLTdTV0JDYWJRcFpXUVJXanoxbzljL3B1Yj9zdGFydD1mYWxzZSZsb29wPWZhbHNlJmRlbGF5bXM9MzAwMCZzbGlkZT1pZC5nZDMwZDc2NDA1XzBfMjkpDQoqIFtEYXRhIFBlcnNwZWN0aXZlc10oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vcHJlc2VudGF0aW9uL2QvZS8yUEFDWC0xdlJqTlVIb0NMZGdxQkFIclV1c1ZvQ3JJSk5DVXNYZlVwSXBMcFJha3kwV1ZEbVlldVJ6ejUxWDVXYUlZcmhkWG04QWVZWnJoUjNPUEUwUC9wdWI/c3RhcnQ9ZmFsc2UmbG9vcD1mYWxzZSZkZWxheW1zPTMwMDAmc2xpZGU9aWQuZ2QzMGQ3NjQwNV8wXzI5KQ0KKiBbREFDIGFuZCB0aGUgZmlsZXN5c3RlbV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vcHJlc2VudGF0aW9uL2QvMTJCcW01UG43TlVMT0ZSeWpBekhSNUEzV3U0RXVCbGhTa09IbFRaaXpDN00vcHViP3N0YXJ0PWZhbHNlJmxvb3A9ZmFsc2UmZGVsYXltcz0zMDAwJnNsaWRlPWlkLmdkMzBkNzY0MDVfMF8yOSkNCiogW1JvbGUgb2YgRGF0YSBWaXN1YWxpemF0aW9uDQpdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3ByZXNlbnRhdGlvbi9kLzFWc3FjbDljNkdEUVFUNHFFcHNkVGdYV3B4d2lENWR0MmFWTkFtMlpDQWlNL3B1Yj9zdGFydD1mYWxzZSZsb29wPWZhbHNlJmRlbGF5bXM9MzAwMCZzbGlkZT1pZC5nZDMwZDc2NDA1XzBfMjkpDQoNCjxCcj4NCg0KDQoNCiMgRGF0YSBMYWINCg0KV1MgMjAxOTogVGFibGVhdSBzb2Z0d2FyZTogaXRzbWVjZXZpLmdpdGh1Yi5pby90YWJsZWF1cHVibGljDQoNCg0KDQoNCjxCcj4NCg0KDQojIFN1bW1hcnkgKyBNRVFBDQoNCiMjIERhdGFiYXNlDQoNCg0KKioxLiBXaGF0IGlzIHRoZSBkaWZmZXJlbnQgYmV0d2VlbiBvbiBwcmVtaXNlcyBhbmQgY2xvdWQgc29mdHdhcmU/ICoqDQoNClRoZSBiaWdnZXN0IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28gc3lzdGVtcyBpcyBob3cgdGhleSBhcmUgZGVwbG95ZWQuIENsb3VkLWJhc2VkIHNvZnR3YXJlIGlzIGhvc3RlZCBvbiB0aGUgdmVuZG9yJ3Mgc2VydmVycyBhbmQgYWNjZXNzZWQgdGhyb3VnaCBhIHdlYiBicm93c2VyLiBPbi1wcmVtaXNlIHNvZnR3YXJlIGlzIGluc3RhbGxlZCBsb2NhbGx5LCBvbiBhIGNvbXBhbnkncyBvd24gY29tcHV0ZXJzIGFuZCBzZXJ2ZXJzLg0KDQoNCioqMi4gUGxlYXNlIGV4cGxhaW4gd2hhdCBpcyBxdWFsaXRhdGl2ZSBkYXRhLCBxdWFudGl0YXRpdmUgZGF0YSwgZGlzY3JldGUsIGFuZCBjb250aW51b3VzIGRhdGE/IFlvdSBjYW4gZXhwbGFpbiB3aXRoIGRpYWdyYW0gb3IgZXhhbXBsZS4qKg0KDQoNCkRhdGEgY2FuIGJlIHF1YWxpdGF0aXZlIG9yIHF1YW50aXRhdGl2ZS4gUHV0IHNpbXBseTogRGlzY3JldGUgZGF0YSBpcyBjb3VudGVkLCBDb250aW51b3VzIGRhdGEgaXMgbWVhc3VyZWQuIA0KDQoqIFF1YWxpdGF0aXZlIGRhdGEgaXMgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKGl0IGRlc2NyaWJlcyBzb21ldGhpbmcpDQoqIFF1YW50aXRhdGl2ZSBkYXRhIGlzIG51bWVyaWNhbCBpbmZvcm1hdGlvbiAobnVtYmVycyktPiBEaXNjcmV0ZSg1LDYsMTApOyBDb250aW51b3VzICgzLDE0KQ0KICAgICAgDQoNCioqMy4gQ3JlYXRlIHRoZSBkaWFncmFtIHdvcmtmbG93IGZyb20gZGF0YSB0byBCSSByZXBvcnRzLiAqKg0KDQohW10od29ya2Zsb3cucG5nKQ0KDQoNCioqNC4gRXhwbGFpbiBhIHVzZSBjYXNlIGltcGxlbWVudGF0aW9uIG9mIERCTVMgaW4gdGhlIGluZHVzdHJpZXM/IDIgaW5kdXN0cnkgc3VjaCBhcyBiYW5raW5nIGFuZCBmaW5hbmNlLiAqKg0KDQohW10oYXBwbGljYXRpb25kYm1zLnBuZykNCg0KDQoNCg0KDQoNCioqNS4gV2hhdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBkYXRhYmFzZSBhbmQgZGF0YSB3YXJlaG91c2U/IDUgZGlmZmVyZW50IHBvaW50IG9mIHZpZXdzICoqDQoNCg0KIVtdKGRhdGFiYXNldnNkYXRhd2FyZWhvdXNlLnBuZykNCg0KDQoNCiFbXShkYnZzZHcuanBnKQ0KDQoNCiFbXShkYnZzZHcyLmpwZykNCg0KDQoNCioqNi4gV2hhdCBhcmUgdGhlIHNpbWlsYXJpdGllcyBpbiBhIGRhdGFiYXNlIGFuZCBkYXRhIHdhcmVob3VzZT8gNSBzaW1pbGFyaXRpZXMgcG9pbnQgb2Ygdmlld3MgKioNCg0KDQpPdGhlciByZXNwb25zZXMgaGF2ZSBnaXZlbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdHdvLCBzaW1pbGFyaXRpZXMgYXJlOg0KDQoqIFRoZXkgYXJlIGJvdGggZGF0YSBzdG9yYWdlIHN5c3RlbXMuDQoqIEJvdGggY2FuIGJlIHVzZWQgYnkgbXVsdGlwbGUgdXNlcnMNCiogQm90aCBjYW4gYmUgY29tcGxleCB3aXRoIG1hbnkgdGFibGVzIGFuZCBsYXJnZSBhbW91bnRzIG9mIGRhdGEuDQoqIEJvdGggY2FuIGJlIHF1ZXJpZWQgdG8gZ2V0IGFuc3dlcnMgb3IgcHVsbCBvdXQgZGF0YSBzZXRzIGJhc2VkIG9uIGNvbW1vbmFsaXR5IG9yIGV4Y2x1c2lvbi4NCiogRGF0YWJhc2VzIGFuZCBkYXRhIHdhcmVob3VzZXMgY2FuIGJlIG9uIHByZW1pc2Ugb3IgY2xvdWQtYmFzZWQuDQoNCg0KDQoqKjcuIEdpdmUgdGhlIDUgdHlwZXMgb2YgZGF0YWJhc2VzPyAqKg0KDQoqIFJlbGF0aW9uYWwgZGF0YWJhc2VzDQoqIE9iamVjdC1vcmllbnRlZCBkYXRhYmFzZXMNCiogRGlzdHJpYnV0ZWQgZGF0YWJhc2VzDQoqIERhdGEgd2FyZWhvdXNlcw0KKiBOb1NRTCBkYXRhYmFzZXMNCiogR3JhcGggZGF0YWJhc2VzDQoqIE9MVFAgZGF0YWJhc2VzDQoqIE9wZW4gc291cmNlIGRhdGFiYXNlcw0KKiBDbG91ZCBkYXRhYmFzZXMNCiogTXVsdGltb2RlbCBkYXRhYmFzZQ0KKiBEb2N1bWVudC9KU09OIGRhdGFiYXNlDQoNCg0KKio4LiBXaGF0IGlzIHRoZSBsaXN0IG9mIERhdGFiYXNlIENoYWxsZW5nZXM/ICoqDQoNCiogQWJzb3JiaW5nIHNpZ25pZmljYW50IGluY3JlYXNlcyBpbiBkYXRhIHZvbHVtZQ0KKiBFbnN1cmluZyBkYXRhIHNlY3VyaXR5DQoqIEtlZXBpbmcgdXAgd2l0aCBkZW1hbmQNCiogTWFuYWdpbmcgYW5kIG1haW50YWluaW5nIHRoZSBkYXRhYmFzZSBhbmQgaW5mcmFzdHJ1Y3R1cmUNCiogUmVtb3ZpbmcgbGltaXRzIG9uIHNjYWxhYmlsaXR5DQoNCg0KDQoNCioqOS4gRXhwbGFpbiB0aGUgMyB1c2VycyBvZiBEQk1TPyAqKiANCg0KDQoNCiFbXSh1c2VyLnBuZykNCg0KDQoNCiogQWRtaW5pc3RyYXRvcnM6IEFkbWluaXN0cmF0b3JzIG1haW50YWluIHRoZSBEQk1TIGFuZCBhcmUgcmVzcG9uc2libGUgZm9yIGFkbWluaXN0cmF0aW5nIHRoZSBkYXRhYmFzZS4gVGhleSBhcmUgcmVzcG9uc2libGUgdG8gbG9vayBhZnRlciBpdHMgdXNhZ2UgYW5kIGJ5IHdob20gaXQgc2hvdWxkIGJlIHVzZWQuIFRoZXkgY3JlYXRlIGFjY2VzcyBwcm9maWxlcyBmb3IgdXNlcnMgYW5kIGFwcGx5IGxpbWl0YXRpb25zIHRvIG1haW50YWluIGlzb2xhdGlvbiBhbmQgZm9yY2Ugc2VjdXJpdHkuIEFkbWluaXN0cmF0b3JzIGFsc28gbG9vayBhZnRlciBEQk1TIHJlc291cmNlcyBsaWtlIHN5c3RlbSBsaWNlbnNlLCByZXF1aXJlZCB0b29scywgYW5kIG90aGVyIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSByZWxhdGVkIG1haW50ZW5hbmNlLg0KDQoqIERlc2lnbmVyczogRGVzaWduZXJzIGFyZSB0aGUgZ3JvdXAgb2YgcGVvcGxlIHdobyBhY3R1YWxseSB3b3JrIG9uIHRoZSBkZXNpZ25pbmcgcGFydCBvZiB0aGUgZGF0YWJhc2UuIFRoZXkga2VlcCBhIGNsb3NlIHdhdGNoIG9uIHdoYXQgZGF0YSBzaG91bGQgYmUga2VwdCBhbmQgaW4gd2hhdCBmb3JtYXQuIFRoZXkgaWRlbnRpZnkgYW5kIGRlc2lnbiB0aGUgd2hvbGUgc2V0IG9mIGVudGl0aWVzLCByZWxhdGlvbnMsIGNvbnN0cmFpbnRzLCBhbmQgdmlld3MuDQoNCiogRW5kIFVzZXJzOiBFbmQgdXNlcnMgYXJlIHRob3NlIHdobyBhY3R1YWxseSByZWFwIHRoZSBiZW5lZml0cyBvZiBoYXZpbmcgYSBEQk1TLiBFbmQgdXNlcnMgY2FuIHJhbmdlIGZyb20gc2ltcGxlIHZpZXdlcnMgd2hvIHBheSBhdHRlbnRpb24gdG8gdGhlIGxvZ3Mgb3IgbWFya2V0IHJhdGVzIHRvIHNvcGhpc3RpY2F0ZWQgdXNlcnMgc3VjaCBhcyBidXNpbmVzcyBhbmFseXN0cy4NCg0KDQoNCg0KKioxMC4gV2hhdCBpcyBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzIG9mIGRhdGFiYXNlIHNjaGVtYT8gKioNCg0KQURWQU5UQUdFUyBEQVRBQkFTRSBTQ0hFTUENCg0KKiBZb3UgY2FuIG1hbmFnZSBkYXRhIGluZGVwZW5kZW50IG9mIHRoZSBwaHlzaWNhbCBzdG9yYWdlDQoqIEZhc3RlciBNaWdyYXRpb24gdG8gbmV3IGdyYXBoaWNhbCBlbnZpcm9ubWVudHMNCiogREJNUyBBcmNoaXRlY3R1cmUgYWxsb3dzIHlvdSB0byBtYWtlIGNoYW5nZXMgb24gdGhlIHByZXNlbnRhdGlvbiBsZXZlbCB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3RoZXIgdHdvIGxheWVycw0KKiBBcyBlYWNoIHRpZXIgaXMgc2VwYXJhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgc2V0cyBvZiBkZXZlbG9wZXJzDQoqIEl0IGlzIG1vcmUgc2VjdXJlIGFzIHRoZSBjbGllbnQgZG9lc24ndCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGRhdGFiYXNlIGJ1c2luZXNzIGxvZ2ljDQoqIEluIGNhc2Ugb2YgdGhlIGZhaWx1cmUgb2YgdGhlIG9uZS10aWVyIG5vIGRhdGEgbG9zcyBhcyB5b3UgYXJlIGFsd2F5cyBzZWN1cmUgYnkgYWNjZXNzaW5nIHRoZSBvdGhlciB0aWVyDQoNCg0KDQpESVNBRFZBTlRBR0VTIERBVEFCQVNFIFNDSEVNQQ0KDQoqIENvbXBsZXRlIERCIFNjaGVtYSBpcyBhIGNvbXBsZXggc3RydWN0dXJlIHdoaWNoIGlzIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIGZvciBldmVyeSBvbmUNCiogRGlmZmljdWx0IHRvIHNldCB1cCBhbmQgbWFpbnRhaW4NCiogVGhlIHBoeXNpY2FsIHNlcGFyYXRpb24gb2YgdGhlIHRpZXJzIGNhbiBhZmZlY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBEYXRhYmFzZQ0KDQoNCioqMTEuIFdoYXQgaXMgYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlcyBvZiB1c2luZyByZWxhdGlvbmFsIG1vZGVsPyAqKg0KDQoNCg0KQURWQU5UQUdFUyBPRiBVU0lORyBSRUxBVElPTkFMIE1PREVMDQoNCiogX19TaW1wbGljaXR5X186IEEgcmVsYXRpb25hbCBkYXRhIG1vZGVsIGlzIHNpbXBsZXIgdGhhbiB0aGUgaGllcmFyY2hpY2FsIGFuZCBuZXR3b3JrIG1vZGVsLg0KKiBfX1N0cnVjdHVyYWwgSW5kZXBlbmRlbmNlX186IFRoZSByZWxhdGlvbmFsIGRhdGFiYXNlIGlzIG9ubHkgY29uY2VybmVkIHdpdGggZGF0YSBhbmQgbm90IHdpdGggYSBzdHJ1Y3R1cmUuIFRoaXMgY2FuIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBtb2RlbC4NCiogX19FYXN5IHRvIHVzZV9fOiBUaGUgcmVsYXRpb25hbCBtb2RlbCBpcyBlYXN5IGFzIHRhYmxlcyBjb25zaXN0aW5nIG9mIHJvd3MgYW5kIGNvbHVtbnMgaXMgcXVpdGUgbmF0dXJhbCBhbmQgc2ltcGxlIHRvIHVuZGVyc3RhbmQNCiogX19RdWVyeSBjYXBhYmlsaXR5X186IEl0IG1ha2VzIHBvc3NpYmxlIGZvciBhIGhpZ2gtbGV2ZWwgcXVlcnkgbGFuZ3VhZ2UgbGlrZSBTUUwgdG8gYXZvaWQgY29tcGxleCBkYXRhYmFzZSBuYXZpZ2F0aW9uLg0KKiBfX0RhdGEgaW5kZXBlbmRlbmNlX186IFRoZSBzdHJ1Y3R1cmUgb2YgYSBkYXRhYmFzZSBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGhhdmluZyB0byBjaGFuZ2UgYW55IGFwcGxpY2F0aW9uLg0KKiBfX1NjYWxhYmxlX186IFJlZ2FyZGluZyBhIG51bWJlciBvZiByZWNvcmRzLCBvciByb3dzLCBhbmQgdGhlIG51bWJlciBvZiBmaWVsZHMsIGEgZGF0YWJhc2Ugc2hvdWxkIGJlIGVubGFyZ2VkIHRvIGVuaGFuY2UgaXRzIHVzYWJpbGl0eS4NCg0KDQoNCkRJU0FEVkFOVEFHRVMgT0YgVVNJTkcgUkVMQVRJT05BTCBNT0RFTA0KDQoqIEZldyByZWxhdGlvbmFsIGRhdGFiYXNlcyBoYXZlIGxpbWl0cyBvbiBmaWVsZCBsZW5ndGhzIHdoaWNoIGNhbid0IGJlIGV4Y2VlZGVkLg0KKiBSZWxhdGlvbmFsIGRhdGFiYXNlcyBjYW4gc29tZXRpbWVzIGJlY29tZSBjb21wbGV4IGFzIHRoZSBhbW91bnQgb2YgZGF0YSBncm93cywgYW5kIHRoZSByZWxhdGlvbnMgYmV0d2VlbiBwaWVjZXMgb2YgZGF0YSBiZWNvbWUgbW9yZSBjb21wbGljYXRlZC4NCiogQ29tcGxleCByZWxhdGlvbmFsIGRhdGFiYXNlIHN5c3RlbXMgbWF5IGxlYWQgdG8gaXNvbGF0ZWQgZGF0YWJhc2VzIHdoZXJlIHRoZSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgc2hhcmVkIGZyb20gb25lIHN5c3RlbSB0byBhbm90aGVyLg0KDQoNCioqMTIuIEV4cGxhaW4gdGhlIHJlbGF0aW9uYWwgbW9kZWwgMToxLCAxOm4sIG46biB3aXRoIHRoZSBleGFtcGxlPyAqKg0KDQohW10ocmVsYXRpb24uanBnKQ0KDQoNCg0KPEJyPg0KDQojIyBEYXRhIFdhcmVob3VzZQ0KDQoNCioqMS4gRXhwbGFpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGF0YSBXYXJlaG91c2UgaW4gNSBpbmR1c3RyeT8gKioNCg0KKiBCYW5raW5nDQoqIFJldGFpbGVyDQoqIEluc3VyYW5jZQ0KKiBNYW51ZmFjdHVyaW5nDQoqIEhlYWx0aGNhcmUNCg0KDQoqKjIuIEV4cGxhaW4gdGhlIDYgdHlwZXMgb2YgRGF0YSBXYXJlaG91c2U/ICoqDQoNCiogMS4gRW50ZXJwcmlzZSBEYXRhIFdhcmVob3VzZToNCg0KRW50ZXJwcmlzZSBEYXRhIFdhcmVob3VzZSBpcyBhIGNlbnRyYWxpemVkIHdhcmVob3VzZS4gSXQgcHJvdmlkZXMgZGVjaXNpb24gc3VwcG9ydCBzZXJ2aWNlIGFjcm9zcyB0aGUgZW50ZXJwcmlzZS4gSXQgb2ZmZXJzIGEgdW5pZmllZCBhcHByb2FjaCBmb3Igb3JnYW5pemluZyBhbmQgcmVwcmVzZW50aW5nIGRhdGEuIEl0IGFsc28gcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBjbGFzc2lmeSBkYXRhIGFjY29yZGluZyB0byB0aGUgc3ViamVjdCBhbmQgZ2l2ZSBhY2Nlc3MgYWNjb3JkaW5nIHRvIHRob3NlIGRpdmlzaW9ucy4NCg0KKiAyLiBPcGVyYXRpb25hbCBEYXRhIFN0b3JlOg0KDQpPcGVyYXRpb25hbCBEYXRhIFN0b3JlLCB3aGljaCBpcyBhbHNvIGNhbGxlZCBPRFMsIGFyZSBub3RoaW5nIGJ1dCBkYXRhIHN0b3JlIHJlcXVpcmVkIHdoZW4gbmVpdGhlciBEYXRhIHdhcmVob3VzZSBub3IgT0xUUCBzeXN0ZW1zIHN1cHBvcnQgb3JnYW5pemF0aW9ucyByZXBvcnRpbmcgbmVlZHMuIEluIE9EUywgRGF0YSB3YXJlaG91c2UgaXMgcmVmcmVzaGVkIGluIHJlYWwgdGltZS4gSGVuY2UsIGl0IGlzIHdpZGVseSBwcmVmZXJyZWQgZm9yIHJvdXRpbmUgYWN0aXZpdGllcyBsaWtlIHN0b3JpbmcgcmVjb3JkcyBvZiB0aGUgRW1wbG95ZWVzLg0KDQoqIDMuIERhdGEgTWFydDoNCg0KQSBkYXRhIG1hcnQgaXMgYSBzdWJzZXQgb2YgdGhlIGRhdGEgd2FyZWhvdXNlLiBJdCBzcGVjaWFsbHkgZGVzaWduZWQgZm9yIGEgcGFydGljdWxhciBsaW5lIG9mIGJ1c2luZXNzLCBzdWNoIGFzIHNhbGVzLCBmaW5hbmNlLCBzYWxlcyBvciBmaW5hbmNlLiBJbiBhbiBpbmRlcGVuZGVudCBkYXRhIG1hcnQsIGRhdGEgY2FuIGNvbGxlY3QgZGlyZWN0bHkgZnJvbSBzb3VyY2VzLg0KDQoNCiogNC4gSW5mb3JtYXRpb24gUHJvY2Vzc2luZw0KDQpBIGRhdGEgd2FyZWhvdXNlIGFsbG93cyB0byBwcm9jZXNzIHRoZSBkYXRhIHN0b3JlZCBpbiBpdC4gVGhlIGRhdGEgY2FuIGJlIHByb2Nlc3NlZCBieSBtZWFucyBvZiBxdWVyeWluZywgYmFzaWMgc3RhdGlzdGljYWwgYW5hbHlzaXMsIHJlcG9ydGluZyB1c2luZyBjcm9zc3RhYnMsIHRhYmxlcywgY2hhcnRzLCBvciBncmFwaHMuDQoNCg0KKiA1LiBBbmFseXRpY2FsIFByb2Nlc3NpbmcgDQoNCkEgZGF0YSB3YXJlaG91c2Ugc3VwcG9ydHMgYW5hbHl0aWNhbCBwcm9jZXNzaW5nIG9mIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gaXQuIFRoZSBkYXRhIGNhbiBiZSBhbmFseXplZCBieSBtZWFucyBvZiBiYXNpYyBPTEFQIG9wZXJhdGlvbnMsIGluY2x1ZGluZyBzbGljZS1hbmQtZGljZSwgZHJpbGwgZG93biwgZHJpbGwgdXAsIGFuZCBwaXZvdGluZy4NCg0KKiA2LiBEYXRhIE1pbmluZw0KDQpEYXRhIG1pbmluZyBzdXBwb3J0cyBrbm93bGVkZ2UgZGlzY292ZXJ5IGJ5IGZpbmRpbmcgaGlkZGVuIHBhdHRlcm5zIGFuZCBhc3NvY2lhdGlvbnMsIGNvbnN0cnVjdGluZyBhbmFseXRpY2FsIG1vZGVscywgcGVyZm9ybWluZyBjbGFzc2lmaWNhdGlvbiBhbmQgcHJlZGljdGlvbi4gVGhlc2UgbWluaW5nIHJlc3VsdHMgY2FuIGJlIHByZXNlbnRlZCB1c2luZyB0aGUgdmlzdWFsaXphdGlvbiB0b29scy4NCg0KDQoNCioqMy4gRXhwbGFpbiB0aGUgZGlmZmVyZW50IGJldHdlZW4gT0xBUCBieSBkYXRhd2FyZWhvdXNlIGFuZCBPTFRQIGJ5IGRhdGFiYXNlPyAqKg0KDQohW10ob2xhcHZzb2x0cC5wbmcpDQoNCg0KKio0LiBFeHBsYWluIHRoZSBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzIG9mIHVzaW5nIERhdGEgV2FyZWhvdXNlPyAqKg0KDQoNCi0+IEFkdmFudGFnZXMgb2YgRGF0YSBXYXJlaG91c2U6IA0KDQoqIERhdGEgd2FyZWhvdXNlIGFsbG93cyBidXNpbmVzcyB1c2VycyB0byBxdWlja2x5IGFjY2VzcyBjcml0aWNhbCBkYXRhIGZyb20gc29tZSBzb3VyY2VzIGFsbCBpbiBvbmUgcGxhY2UuDQoqIERhdGEgd2FyZWhvdXNlIHByb3ZpZGVzIGNvbnNpc3RlbnQgaW5mb3JtYXRpb24gb24gdmFyaW91cyBjcm9zcy1mdW5jdGlvbmFsIGFjdGl2aXRpZXMuIEl0IGlzIGFsc28gc3VwcG9ydGluZyBhZC1ob2MgcmVwb3J0aW5nIGFuZCBxdWVyeS4NCiogRGF0YSBXYXJlaG91c2UgaGVscHMgdG8gaW50ZWdyYXRlIG1hbnkgc291cmNlcyBvZiBkYXRhIHRvIHJlZHVjZSBzdHJlc3Mgb24gdGhlIHByb2R1Y3Rpb24gc3lzdGVtLg0KKiBEYXRhIHdhcmVob3VzZSBoZWxwcyB0byByZWR1Y2UgdG90YWwgdHVybmFyb3VuZCB0aW1lIGZvciBhbmFseXNpcyBhbmQgcmVwb3J0aW5nLg0KKiBSZXN0cnVjdHVyaW5nIGFuZCBJbnRlZ3JhdGlvbiBtYWtlIGl0IGVhc2llciBmb3IgdGhlIHVzZXIgdG8gdXNlIGZvciByZXBvcnRpbmcgYW5kIGFuYWx5c2lzLg0KKiBEYXRhIHdhcmVob3VzZSBhbGxvd3MgdXNlcnMgdG8gYWNjZXNzIGNyaXRpY2FsIGRhdGEgZnJvbSB0aGUgbnVtYmVyIG9mIHNvdXJjZXMgaW4gYSBzaW5nbGUgcGxhY2UuIFRoZXJlZm9yZSwgaXQgc2F2ZXMgdXNlcidzIHRpbWUgb2YgcmV0cmlldmluZyBkYXRhIGZyb20gbXVsdGlwbGUgc291cmNlcy4NCiogRGF0YSB3YXJlaG91c2Ugc3RvcmVzIGEgbGFyZ2UgYW1vdW50IG9mIGhpc3RvcmljYWwgZGF0YS4gVGhpcyBoZWxwcyB1c2VycyB0byBhbmFseXplIGRpZmZlcmVudCB0aW1lIHBlcmlvZHMgYW5kIHRyZW5kcyB0byBtYWtlIGZ1dHVyZSBwcmVkaWN0aW9ucy4NCg0KLT4gRGlzYWR2YW50YWdlcyBvZiBEYXRhIFdhcmVob3VzZToNCg0KKiBOb3QgYW4gaWRlYWwgb3B0aW9uIGZvciB1bnN0cnVjdHVyZWQgZGF0YS4NCiogQ3JlYXRpb24gYW5kIEltcGxlbWVudGF0aW9uIG9mIERhdGEgV2FyZWhvdXNlIGlzIHN1cmVseSB0aW1lIGNvbmZ1c2luZyBhZmZhaXIuDQoqIERhdGEgV2FyZWhvdXNlIGNhbiBiZSBvdXRkYXRlZCByZWxhdGl2ZWx5IHF1aWNrbHkNCiogRGlmZmljdWx0IHRvIG1ha2UgY2hhbmdlcyBpbiBkYXRhIHR5cGVzIGFuZCByYW5nZXMsIGRhdGEgc291cmNlIHNjaGVtYSwgaW5kZXhlcywgYW5kIHF1ZXJpZXMuDQoqIFRoZSBkYXRhIHdhcmVob3VzZSBtYXkgc2VlbSBlYXN5LCBidXQgYWN0dWFsbHksIGl0IGlzIHRvbyBjb21wbGV4IGZvciB0aGUgYXZlcmFnZSB1c2Vycy4NCiogRGVzcGl0ZSBiZXN0IGVmZm9ydHMgYXQgcHJvamVjdCBtYW5hZ2VtZW50LCBkYXRhIHdhcmVob3VzaW5nIHByb2plY3Qgc2NvcGUgd2lsbCBhbHdheXMgaW5jcmVhc2UuDQoqIFNvbWV0aW1lIHdhcmVob3VzZSB1c2VycyB3aWxsIGRldmVsb3AgZGlmZmVyZW50IGJ1c2luZXNzIHJ1bGVzLg0KKiBPcmdhbmlzYXRpb25zIG5lZWQgdG8gc3BlbmQgbG90cyBvZiB0aGVpciByZXNvdXJjZXMgZm9yIHRyYWluaW5nIGFuZCBJbXBsZW1lbnRhdGlvbiBwdXJwb3NlLg0KDQoNCjxCcj4NCg0KIyMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlOiANCg0KDQpfX1JlYWQgdGhlIG1vZHVsIGh0dHBzOi8vaXRzbWVjZXZpLmdpdGh1Yi5pby90YWJsZWF1cHVibGljLyB0b28uX18NCg0KKioxLiBFeHBsYWluIHRoZSBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzIG9mIHVzaW5nIEJJIFN5c3RlbXM/ICoqDQoNCg0KDQotPiBBZHZhbnRhZ2VzIG9mIEJ1c2luZXNzIEludGVsbGlnZW5jZSANCg0KSGVyZSBhcmUgc29tZSBvZiB0aGUgYWR2YW50YWdlcyBvZiB1c2luZyBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UgU3lzdGVtOg0KDQoxLiBCb29zdCBwcm9kdWN0aXZpdHkNCg0KMi4gVG8gaW1wcm92ZSB2aXNpYmlsaXR5DQoNCjMuIEZpeCBBY2NvdW50YWJpbGl0eQ0KDQo0LiBJdCBnaXZlcyBhIGJpcmQncyBleWUgdmlldw0KDQo1LiBJdCBzdHJlYW1saW5lcyBidXNpbmVzcyBwcm9jZXNzZXMNCg0KNi4gSXQgYWxsb3dzIGZvciBlYXN5IGFuYWx5dGljcw0KDQoNCi0+IEJJIFN5c3RlbSBEaXNhZHZhbnRhZ2VzIA0KDQoxLiBDb3N0DQoNCjIuIENvbXBsZXhpdHkNCg0KMy4gTGltaXRlZCB1c2UNCg0KNC4gVGltZSBDb25zdW1pbmcgSW1wbGVtZW50YXRpb24NCg0KDQoNCg0KDQoNCioqMi4gRXhwbGFpbiB0aGUgZGlmZmVyZW50IGJldHdlZW4gVHJhZGl0aW9uYWwgQkkgdnMgU2VsZi1TZXJ2aWNlIEJJPyAqKg0KDQoNCg0KIVtdKHRyYWRpdGlvbmFsLUJJLmpwZykNCg0KDQo8QnI+DQoNCg0KDQoNCg0KIVtdKHNzYmkucG5nKQ0KDQo8QnI+DQoNCiFbXShzc2JpMi5wbmcpDQoNCg0KDQo8QnI+DQoNCg0KDQoNCiFbXShzc2JpdnMuanBnKQ0KDQoNCg0KDQo8QnI+DQoNCioqMy4gV2h5IGlzIEJJIGltcG9ydGFudD8gKioNCg0KIVtdKGJpLnBuZykNCg0KDQoNCiFbXShiaXNwZWN0cnVtLmpwZykNCg0KDQoNCiogTWVhc3VyZW1lbnQ6IGNyZWF0aW5nIEtQSSAoS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcnMpIGJhc2VkIG9uIGhpc3RvcmljIGRhdGENCiogSWRlbnRpZnkgYW5kIHNldCBiZW5jaG1hcmtzIGZvciB2YXJpZWQgcHJvY2Vzc2VzLg0KKiBXaXRoIEJJIHN5c3RlbXMgb3JnYW5pemF0aW9ucyBjYW4gaWRlbnRpZnkgbWFya2V0IHRyZW5kcyBhbmQgc3BvdCBidXNpbmVzcyBwcm9ibGVtcyB0aGF0IG5lZWQgdG8gYmUgYWRkcmVzc2VkLg0KKiBCSSBoZWxwcyBvbiBkYXRhIHZpc3VhbGl6YXRpb24gdGhhdCBlbmhhbmNlcyB0aGUgZGF0YSBxdWFsaXR5IGFuZCB0aGVyZWJ5IHRoZSBxdWFsaXR5IG9mIGRlY2lzaW9uIG1ha2luZy4NCiogQkkgc3lzdGVtcyBjYW4gYmUgdXNlZCBub3QganVzdCBieSBlbnRlcnByaXNlcyBidXQgU01FIChTbWFsbCBhbmQgTWVkaXVtIEVudGVycHJpc2VzKQ0KKiBUbyBJbXByb3ZlIFZpc2liaWxpdHk6DQogICAgKiBEbyB5b3Uga25vdyB3aG8gdGhlIGJlc3QgcGVyZm9ybWVycyBhcmU/DQogICAgKiBDYW4geW91IGVhc2lseSBpZGVudGlmeSBhcmVhcyBmb3IgaW1wcm92ZW1lbnQ/DQogICAgKiBJcyBzdG9jayBnb2luZyBtaXNzaW5nIGFuZCB5b3UgY2Fu4oCZdCBpZGVudGlmeSB3aGVyZSBpdOKAmXMgZ29pbmc/DQoqIFRvIFR1cm4gRGF0YSBpbnRvIEFjdGlvbmFibGUgSW5mb3JtYXRpb24NCiogVG8gSW1wcm92ZSBFZmZpY2llbmN5DQoqIFRvIEdhaW4gU2FsZXMgJiBNYXJrZXQgSW50ZWxsaWdlbmNlDQoqIFRvIEdhaW4gQ29tcGV0aXRpdmUgSW50ZWxsaWdlbmNlDQoNCg0KDQoNCg0KPEJyPg0KDQoNCl9fNC4gRXhwbGFpbiB0aGUgZGlmZmVyZW50IGJldHdlZW4gU3RhciBTY2hlbWEsIFNub3cgRmxha2UgU2NoZW1hLCBhbmQgR2FsYXh5IFNjaGVtYT8gYW5kIGNyZWF0ZSBhbiBleGFtcGxlIG9mIHRob3NlIHNjaGVtYSAoMyBzY2hlbWEpIV9fDQoNCg0KX19PdmVydmlldyBvZiBTdGFyIFNjaGVtYV9fDQoNCiogV2hhdCBpcyBzdGFyIHNjaGVtYT8gVGhlIHN0YXIgc2NoZW1hIGFyY2hpdGVjdHVyZSBpcyB0aGUgc2ltcGxlc3QgZGF0YSB3YXJlaG91c2Ugc2NoZW1hLiBJdCBpcyBjYWxsZWQgYSBzdGFyIHNjaGVtYSBiZWNhdXNlIHRoZSBkaWFncmFtIHJlc2VtYmxlcyBhIHN0YXIuIFRoZSBjZW50ZXIgb2YgdGhlIHN0YXIgY29uc2lzdHMgb2YgZmFjdCB0YWJsZSBhbmQgdGhlIHBvaW50cyBvZiB0aGUgc3RhciBhcmUgdGhlIGRpbWVuc2lvbiB0YWJsZXMuIA0KKiBGYWN0IFRhYmxlczogQSBmYWN0IHRhYmxlIHR5cGljYWxseSBoYXMgdHdvIHR5cGVzIG9mIGNvbHVtbnM6IGZvcmVpZ24ga2V5cyB0byBkaW1lbnNpb24gdGFibGVzIGFuZCBtZWFzdXJlcyB0aG9zZSB0aGF0IGNvbnRhaW4gbnVtZXJpYyBmYWN0cy4gQSBmYWN0IHRhYmxlIGNhbiBjb250YWluIGZhY3QncyBkYXRhIG9uIGRldGFpbCBvciBhZ2dyZWdhdGVkIGxldmVsLg0KKiBEaW1lbnNpb24gVGFibGVzOiBBIGRpbWVuc2lvbiBpcyBhIHN0cnVjdHVyZSB1c3VhbGx5IGNvbXBvc2VkIG9mIG9uZSBvciBtb3JlIGhpZXJhcmNoaWVzIHRoYXQgY2F0ZWdvcml6ZXMgZGF0YS4gSWYgYSBkaW1lbnNpb24gaGFzbid0IGdvdCBhIGhpZXJhcmNoaWVzIGFuZCBsZXZlbHMgaXQgaXMgY2FsbGVkIGZsYXQgZGltZW5zaW9uIG9yIGxpc3QuIFRoZSBwcmltYXJ5IGtleXMgb2YgZWFjaCBvZiB0aGUgZGltZW5zaW9uIHRhYmxlcyBhcmUgcGFydCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5IG9mIHRoZSBmYWN0IHRhYmxlLg0KDQoNClR5cGljYWwgZmFjdCB0YWJsZXMgc3RvcmUgZGF0YSBhYm91dCBzYWxlcyB3aGlsZSBkaW1lbnNpb24gdGFibGVzIGRhdGEgYWJvdXQgZ2VvZ3JhcGhpYyByZWdpb24obWFya2V0cywgY2l0aWVzKSAsIGNsaWVudHMsIHByb2R1Y3RzLCB0aW1lcywgY2hhbm5lbHMuDQoNCg0KVGhlIG1haW4gY2hhcmFjdGVyaXN0aWNzIG9mIHN0YXIgc2NoZW1hOg0KDQoNCiogU2ltcGxlIHN0cnVjdHVyZSAtPiBlYXN5IHRvIHVuZGVyc3RhbmQgc2NoZW1hDQoqIEdyZWF0IHF1ZXJ5IGVmZmVjdGl2ZXMgLT4gc21hbGwgbnVtYmVyIG9mIHRhYmxlcyB0byBqb2luDQoqIFJlbGF0aXZlbHkgbG9uZyB0aW1lIG9mIGxvYWRpbmcgZGF0YSBpbnRvIGRpbWVuc2lvbiB0YWJsZXMgLT4gZGUtbm9ybWFsaXphdGlvbiwgcmVkdW5kYW5jeSBkYXRhIGNhdXNlZCB0aGF0IHNpemUgb2YgdGhlIHRhYmxlIGNvdWxkIGJlIGxhcmdlLg0KKiBUaGUgbW9zdCBjb21tb25seSB1c2VkIGluIHRoZSBkYXRhIHdhcmVob3VzZSBpbXBsZW1lbnRhdGlvbnMgLT4gd2lkZWx5IHN1cHBvcnRlZCBieSBhIGxhcmdlIG51bWJlciBvZiBidXNpbmVzcyBpbnRlbGxpZ2VuY2UgdG9vbHMuDQoNCiFbXShzdGFyc2NoZW1hLnBuZykNCg0KDQoNCg0KDQpfX092ZXJ2aWV3IG9mIFNub3cgZmxha2Ugc2NoZW1hX18NCg0KKiBBIFNub3dmbGFrZSBTY2hlbWEgaXMgYW4gZXh0ZW5zaW9uIG9mIGEgU3RhciBTY2hlbWEsIGFuZCBpdCBhZGRzIGFkZGl0aW9uYWwgZGltZW5zaW9ucy4gSXQgaXMgY2FsbGVkIHNub3dmbGFrZSBiZWNhdXNlIGl0cyBkaWFncmFtIHJlc2VtYmxlcyBhIFNub3dmbGFrZS4gDQoNCiogVGhlIGRpbWVuc2lvbiB0YWJsZXMgYXJlIG5vcm1hbGl6ZWQgd2hpY2ggc3BsaXRzIGRhdGEgaW50byBhZGRpdGlvbmFsIHRhYmxlcy4gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBDb3VudHJ5IGlzIGZ1cnRoZXIgbm9ybWFsaXplZCBpbnRvIGFuIGluZGl2aWR1YWwgdGFibGUuDQoNCg0KQ2hhcmFjdGVyaXN0aWNzIG9mIFNub3dmbGFrZSBTY2hlbWE6DQoNCiogVGhlIG1haW4gYmVuZWZpdCBvZiB0aGUgc25vd2ZsYWtlIHNjaGVtYSBpdCB1c2VzIHNtYWxsZXIgZGlzayBzcGFjZS4NCiogRWFzaWVyIHRvIGltcGxlbWVudCBhIGRpbWVuc2lvbiBpcyBhZGRlZCB0byB0aGUgU2NoZW1hDQoqIER1ZSB0byBtdWx0aXBsZSB0YWJsZXMgcXVlcnkgcGVyZm9ybWFuY2UgaXMgcmVkdWNlZA0KKiBUaGUgcHJpbWFyeSBjaGFsbGVuZ2UgdGhhdCB5b3Ugd2lsbCBmYWNlIHdoaWxlIHVzaW5nIHRoZSBzbm93Zmxha2UgU2NoZW1hIGlzIHRoYXQgeW91IG5lZWQgdG8gcGVyZm9ybSBtb3JlIG1haW50ZW5hbmNlIGVmZm9ydHMgYmVjYXVzZSBvZiB0aGUgbW9yZSBsb29rdXAgdGFibGVzLg0KDQohW10oc25vd2ZsYWtlLnBuZykNCg0KDQoNCg0KDQoNCl9fU3RhciBzY2hlbWEgdnMgU25vdyBGbGFrZSBzY2hlbWFfXw0KDQohW10oc3RhcnZzc25vdy5QTkcpDQoNCg0KDQoNCg0KX19XaGF0IGlzIGEgR2FsYXh5IHNjaGVtYT9fXw0KDQpBIEdhbGF4eSBTY2hlbWEgY29udGFpbnMgdHdvIGZhY3QgdGFibGUgdGhhdCBzaGFyZXMgZGltZW5zaW9uIHRhYmxlcy4gSXQgaXMgYWxzbyBjYWxsZWQgRmFjdCBDb25zdGVsbGF0aW9uIFNjaGVtYS4gVGhlIHNjaGVtYSBpcyB2aWV3ZWQgYXMgYSBjb2xsZWN0aW9uIG9mIHN0YXJzIGhlbmNlIHRoZSBuYW1lIEdhbGF4eSBTY2hlbWEuDQoNCg0KIVtdKGdhbGF4eS5wbmcpDQoNCg0KDQpDaGFyYWN0ZXJpc3RpY3Mgb2YgR2FsYXh5IFNjaGVtYToNCg0KKiBUaGUgZGltZW5zaW9ucyBpbiB0aGlzIHNjaGVtYSBhcmUgc2VwYXJhdGVkIGludG8gc2VwYXJhdGUgZGltZW5zaW9ucyBiYXNlZCBvbiB0aGUgdmFyaW91cyBsZXZlbHMgb2YgaGllcmFyY2h5Lg0KKiBGb3IgZXhhbXBsZSwgaWYgZ2VvZ3JhcGh5IGhhcyBmb3VyIGxldmVscyBvZiBoaWVyYXJjaHkgbGlrZSByZWdpb24sIGNvdW50cnksIHN0YXRlLCBhbmQgY2l0eSB0aGVuIEdhbGF4eSBzY2hlbWEgc2hvdWxkIGhhdmUgZm91ciBkaW1lbnNpb25zLg0KKiBNb3Jlb3ZlciwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdGhpcyB0eXBlIG9mIHNjaGVtYSBieSBzcGxpdHRpbmcgdGhlIG9uZS1zdGFyIHNjaGVtYSBpbnRvIG1vcmUgU3RhciBzY2hlbWVzLg0KKiBUaGUgZGltZW5zaW9ucyBhcmUgbGFyZ2UgaW4gdGhpcyBzY2hlbWEgd2hpY2ggaXMgbmVlZGVkIHRvIGJ1aWxkIGJhc2VkIG9uIHRoZSBsZXZlbHMgb2YgaGllcmFyY2h5Lg0KKiBUaGlzIHNjaGVtYSBpcyBoZWxwZnVsIGZvciBhZ2dyZWdhdGluZyBmYWN0IHRhYmxlcyBmb3IgYmV0dGVyIHVuZGVyc3RhbmRpbmcuDQoNCg0KDQpfXzUuIFdoYXQgaXMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIGFuZCBTZWxmLXNlcnZpY2UgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIChTU0JJKV9fDQoNCiogVGhlIHRlcm0gQnVzaW5lc3MgSW50ZWxsaWdlbmNlIChCSSkgcmVmZXJzIHRvIF9fdGVjaG5vbG9naWVzX18sIF9fYXBwbGljYXRpb25zX18gYW5kIF9fcHJhY3RpY2VzX18gZm9yIHRoZSBjb2xsZWN0aW9uLCBpbnRlZ3JhdGlvbiwgYW5hbHlzaXMsIGFuZCBwcmVzZW50YXRpb24gb2YgYnVzaW5lc3MgaW5mb3JtYXRpb24uIFRoZSBwdXJwb3NlIG9mIEJ1c2luZXNzIEludGVsbGlnZW5jZSBpcyB0byBzdXBwb3J0IGJldHRlciBidXNpbmVzcyBkZWNpc2lvbiBtYWtpbmcuIA0KKiBFc3NlbnRpYWxseSwgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHN5c3RlbXMgYXJlIGRhdGEtZHJpdmVuIERlY2lzaW9uIFN1cHBvcnQgU3lzdGVtcyAoRFNTKS4gQnVzaW5lc3MgSW50ZWxsaWdlbmNlIGlzIHNvbWV0aW1lcyB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGJyaWVmaW5nIGJvb2tzLCByZXBvcnQgYW5kIHF1ZXJ5IHRvb2xzIGFuZCBleGVjdXRpdmUgaW5mb3JtYXRpb24gc3lzdGVtcy4NCiogQnVzaW5lc3MgaW50ZWxsaWdlbmNlIChCSSkgY29tYmluZXMgYnVzaW5lc3MgYW5hbHl0aWNzLCBkYXRhIG1pbmluZywgZGF0YSB2aXN1YWxpemF0aW9uLCBkYXRhIHRvb2xzIGFuZCBpbmZyYXN0cnVjdHVyZSwgYW5kIGJlc3QgcHJhY3RpY2VzIHRvIGhlbHAgb3JnYW5pemF0aW9ucyB0byBtYWtlIG1vcmUgZGF0YS1kcml2ZW4gZGVjaXNpb25zLiANCg0KX19TZWxmLXNlcnZpY2UgYnVzaW5lc3MgaW50ZWxsaWdlbmNlIChTU0JJKV9fIGludm9sdmVzIHRoZSBidXNpbmVzcyBzeXN0ZW1zIGFuZCBkYXRhIGFuYWx5dGljcyB0aGF0IGdpdmUgYnVzaW5lc3MgZW5kLXVzZXJzIGFjY2VzcyB0byBhbiBvcmdhbml6YXRpb27igJlzIGluZm9ybWF0aW9uIHdpdGhvdXQgZGlyZWN0IElUIGludm9sdmVtZW50LiBTZWxmLXNlcnZpY2UgQnVzaW5lc3MgaW50ZWxsaWdlbmNlIGdpdmVzIGVuZC11c2VycyB0aGUgYWJpbGl0eSB0byBkbyBtb3JlIHdpdGggdGhlaXIgZGF0YSB3aXRob3V0IG5lY2Vzc2FyaWx5IGhhdmluZyB0ZWNobmljYWwgc2tpbGxzLiBUaGVzZSBzb2x1dGlvbnMgYXJlIHVzdWFsbHkgY3JlYXRlZCB0byBiZSBmbGV4aWJsZSBhbmQgZWFzeS10by11c2Ugc28gdGhhdCBlbmQtdXNlcnMgY2FuIGFuYWx5emUgZGF0YSwgbWFrZSBkZWNpc2lvbnMsIHBsYW4gYW5kDQpmb3JlY2FzdCBvbiB0aGVpciBvd24uDQoNCg0KT3ZlciB0aGUgcGFzdCBmZXcgeWVhcnMsIGJ1c2luZXNzIGludGVsbGlnZW5jZSBoYXMgZXZvbHZlZCB0byBpbmNsdWRlIG1vcmUgcHJvY2Vzc2VzIGFuZCBhY3Rpdml0aWVzIHRvIGhlbHAgaW1wcm92ZSBwZXJmb3JtYW5jZS4gVGhlc2UgcHJvY2Vzc2VzIGluY2x1ZGU6DQoNCiogX19EYXRhIG1pbmluZ19fOiBVc2luZyBkYXRhYmFzZXMsIHN0YXRpc3RpY3MgYW5kIG1hY2hpbmUgbGVhcm5pbmcgdG8gdW5jb3ZlciB0cmVuZHMgaW4gbGFyZ2UgZGF0YXNldHMuDQoqIF9fUmVwb3J0aW5nX186IFNoYXJpbmcgZGF0YSBhbmFseXNpcyB0byBzdGFrZWhvbGRlcnMgc28gdGhleSBjYW4gZHJhdyBjb25jbHVzaW9ucyBhbmQgbWFrZSBkZWNpc2lvbnMuDQoqIF9fUGVyZm9ybWFuY2UgbWV0cmljcyBhbmQgYmVuY2htYXJraW5nX186IENvbXBhcmluZyBjdXJyZW50IHBlcmZvcm1hbmNlIGRhdGEgdG8gaGlzdG9yaWNhbCBkYXRhIHRvIHRyYWNrIHBlcmZvcm1hbmNlIGFnYWluc3QgZ29hbHMsIHR5cGljYWxseSB1c2luZyBjdXN0b21pemVkIGRhc2hib2FyZHMuDQoqIF9fRGVzY3JpcHRpdmUgYW5hbHl0aWNzX186IFVzaW5nIHByZWxpbWluYXJ5IGRhdGEgYW5hbHlzaXMgdG8gZmluZCBvdXQgd2hhdCBoYXBwZW5lZC4NCiogX19RdWVyeWluZ19fOiBBc2tpbmcgdGhlIGRhdGEgc3BlY2lmaWMgcXVlc3Rpb25zLCBCSSBwdWxsaW5nIHRoZSBhbnN3ZXJzIGZyb20gdGhlIGRhdGFzZXRzLg0KKiBfX1N0YXRpc3RpY2FsIGFuYWx5c2lzX186IFRha2luZyB0aGUgcmVzdWx0cyBmcm9tIGRlc2NyaXB0aXZlIGFuYWx5dGljcyBhbmQgZnVydGhlciBleHBsb3JpbmcgdGhlIGRhdGEgdXNpbmcgc3RhdGlzdGljcyBzdWNoIGFzIGhvdyB0aGlzIHRyZW5kIGhhcHBlbmVkIGFuZCB3aHkuDQoqIF9fRGF0YSB2aXN1YWxpemF0aW9uX186IFR1cm5pbmcgZGF0YSBhbmFseXNpcyBpbnRvIHZpc3VhbCByZXByZXNlbnRhdGlvbnMgc3VjaCBhcyBjaGFydHMsIGdyYXBocywgYW5kIGhpc3RvZ3JhbXMgdG8gbW9yZSBlYXNpbHkgY29uc3VtZSBkYXRhLg0KKiBfX1Zpc3VhbCBhbmFseXNpc19fOiBFeHBsb3JpbmcgZGF0YSB0aHJvdWdoIHZpc3VhbCBzdG9yeXRlbGxpbmcgdG8gY29tbXVuaWNhdGUgaW5zaWdodHMgb24gdGhlIGZseSBhbmQgc3RheSBpbiB0aGUgZmxvdyBvZiBhbmFseXNpcy4NCiogX19EYXRhIHByZXBhcmF0aW9uX186IENvbXBpbGluZyBtdWx0aXBsZSBkYXRhIHNvdXJjZXMsIGlkZW50aWZ5aW5nIHRoZSBkaW1lbnNpb25zIGFuZCBtZWFzdXJlbWVudHMsIHByZXBhcmluZyBpdCBmb3IgZGF0YSBhbmFseXNpcy4NCg0KDQoNCg0KPEJyPg0KDQojIENoYW5nZSBsb2cgdXBkYXRlDQoNCiogMjUuMDkuMjAxOQ0KKiAyNi4wOS4yMDE5DQoqIDI4LjA5LjIwMTkNCiogMjkuMDkuMjAxOQ0KKiAwMi4wOS4yMDE5DQoqIDA0LjEwLjIwMTkNCiogMDcuMTAuMjAxOQ0KKiAxMC4xMC4yMDE5DQoNCjxCcj4NCg0KIyBQcmVmZXJlbmNlcw0KDQoqIFtBdXRob3JpbmcgQm9va3MgYW5kIFRlY2huaWNhbCBEb2N1bWVudHMgd2l0aCBSIE1hcmtkb3duXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi8pDQoqIFtSIE1hcmtkb3duOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZV0oaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLykNCiogW0RhdGVuYmFua2VuIFZlcnN0ZWhlbl0oaHR0cDovL3d3dy5kYXRlbmJhbmtlbi12ZXJzdGVoZW4uZGUvKQ0KKiBbVHV0b3JpYWxzcG9pbnRdKGh0dHBzOi8vd3d3LnR1dG9yaWFsc3BvaW50LmNvbS9pbmRleC5odG0pDQoqIFtTb2Z0d2FyZSBBZHZpY2VdKGh0dHBzOi8vd3d3LnNvZnR3YXJlYWR2aWNlLmNvbS8pDQoqIFtPcmFjbGVdKG9yYWNsZS5jb20pDQoqIFtNYXRoIGlzIEZ1bl0obWF0aHNpc2Z1bi5jb20pDQoqIFtKYXZhIFQgUG9pbnRdKGh0dHBzOi8vd3d3LmphdmF0cG9pbnQuY29tLykNCiogW01lZGl1bV0obWVkaXVtLmNvbSkNCiogW0Fsb29tYSBEYXRhIFBpcGVsaW5lXShodHRwczovL3d3dy5hbG9vbWEuY29tLykNCiogW1NRbCBEYXRhYmFzZSBNb2RlbGVyXShodHRwczovL3NxbGRibS5jb20vSG9tZS8pDQoqIFtEYXRlbmJhbmtzeXN0ZW1lOiBFaW5lIEVpbmY/aHJ1bmddKGh0dHBzOi8vd3d3LmFtYXpvbi5kZS9EYXRlbmJhbmtzeXN0ZW1lLUVpbmUtRWluZiVDMyVCQ2hydW5nLUdydXl0ZXItU3R1ZGl1bS9kcC8zMTEwNDQzNzU5L3JlZj1zcl8xXzI/X19ta19kZV9ERT0lQzMlODVNJUMzJTg1JUM1JUJEJUMzJTk1JUMzJTkxJmtleXdvcmRzPWRhdGVuYmFua2VuJnFpZD0xNTY5NDI2NTQ0JnM9Ym9va3Mmc3I9MS0yKQ0KKiBbRGF0ZW5iYW5rZW4gdW5kIFNRTF0oaHR0cHM6Ly93d3cuYW1hem9uLmRlL0RhdGVuYmFua2VuLVNRTC1wcmF4aXNvcmllbnRpZXJ0ZS1FaW5mJUMzJUJDaHJ1bmctQW53ZW5kdW5nZW4vZHAvMzY1ODE2MTI4MC9yZWY9c3JfMV81P19fbWtfZGVfREU9JUMzJTg1TSVDMyU4NSVDNSVCRCVDMyU5NSVDMyU5MSZrZXl3b3Jkcz1kYXRlbmJhbmtlbiZxaWQ9MTU2OTQyNjU0NCZzPWJvb2tzJnNyPTEtNSkNCiogW0RhdGVubWFuYWdlbWVudDpEYXRlbi1EYXRlbmJhbmtlbi1EYXRlbnNpY2hlcmhlaXRdKERhdGVuYmFua2VuIHVuZCBTUUwpDQoqIFtaYXBpZXItQXV0b21hdGUgYW55dGhpbmddKGh0dHBzOi8vemFwaWVyLmNvbS8pDQoqIFtDYXB0ZXJyYS1GaW5kaW5nIHNvZnR3YXJlXShodHRwczovL3d3dy5jYXB0ZXJyYS5jb20vKQ0KKiBbSW5zaWRlIEJpZyBEYXRhXShodHRwczovL2luc2lkZWJpZ2RhdGEuY29tLykNCiogW011bHRpLW1vZGVsIERhdGEgTWFuYWdlbWVudF0oaHR0cHM6Ly93d3cuc2xpZGVzaGFyZS5uZXQvSmlhaGVuZ0x1MS9tdWx0aW1vZGVsLWRhdGFiYXNlKQ0KKiBbVGhlIERhdGEgQWRtaW5pc3RyYXRpb24gTmV3c2xldHRlciBdKGh0dHA6Ly90ZGFuLmNvbS8pDQoqIFtZYXNzIEFsLUhhc3NhbmkgTVNjIEJTY10oaHR0cHM6Ly91ay5saW5rZWRpbi5jb20vaW4veWFzcy1hbC1oYXNzYW5pLW1zYy1ic2MtMWE2NTc3YjU/dHJrPWF1dGhvcl9taW5pLXByb2ZpbGVfdGl0bGUpDQoqIFtTaXNlbnNlXShodHRwczovL3d3dy5zaXNlbnNlLmNvbS8pDQoqIFtQcmVkaWN0aXZlYW5hbHl0aWNzdG9kYXldKGh0dHBzOi8vd3d3LnByZWRpY3RpdmVhbmFseXRpY3N0b2RheS5jb20vKQ0KKiBbVGVjaCBUYXJnZXRdKGh0dHBzOi8vd3d3LnRlY2h0YXJnZXQuY29tLykNCiogW1Jvb3Nib2FyZF0oaHR0cHM6Ly9yb29zYm9hcmQuY29tLykNCiogW0ZvcmJlc10oZm9yYmVzLmNvbSkNCiogW1ByaWNld2F0ZXJob3VzZUNvb3BlcnNdKGh0dHBzOi8vd3d3LnB3Yy5jb20vKQ0KKiBbSW50ZXJuZXQgTGl2ZSBTdGF0c10oaHR0cHM6Ly93d3cuaW50ZXJuZXRsaXZlc3RhdHMuY29tLykNCiogW1dvcmxkb21ldGVyc10oaHR0cHM6Ly93d3cud29ybGRvbWV0ZXJzLmluZm8vKQ0KKiBbR2FzdG9uIFNhbmNoZXpdKGh0dHBzOi8vd3d3Lmdhc3RvbnNhbmNoZXouY29tLykNCg0KPEJyPg0KDQojIExpY2Vuc2UNCg0KW01JVF0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQp