Introduction
Conceptual domain modeling (or conceptual data modeling) is a process used in database design, systems design, and software engineering to create a high-level representation of the information that will be managed by a system. This type of modeling focuses on identifying the key concepts and their relationships within a specific domain of interest, rather than detailing the technical implementation. It serves as a foundation for further development and design activities, including the creation of more detailed models and the actual database and system implementation. Here are the main aspects of conceptual domain modeling:
Identifying Key Concepts: The first step is to identify the main entities or concepts within the domain. These could be physical objects, events, or ideas relevant to the domain of interest.
Defining Relationships: After identifying the key concepts, the next step is to define the relationships between them. This includes understanding how entities interact with each other, their dependencies, and their hierarchies.
Capturing Attributes: While the primary focus is on concepts and their relationships, conceptual modeling also involves capturing the essential attributes of each concept. These attributes represent the properties or characteristics of the entities.
Abstraction: Conceptual domain modeling abstracts away the technical details and focuses on the domain itself. It aims to create a model that is understandable by stakeholders who may not have a technical background, such as business analysts, domain experts, and end-users.
Purpose and Use: The model serves as a communication tool among stakeholders and as a guide for system designers and developers. It helps ensure that the system development aligns with the business requirements and domain needs.
Techniques and Notations: Various modeling techniques and notations can be used for conceptual domain modeling, including Entity-Relationship Diagrams (ERD), Unified Modeling Language (UML), and domain-specific languages designed for particular domains or industries.
Conceptual domain modeling is essential in the early stages of system development as it helps clarify requirements, reduce complexity, and prevent misunderstandings later in the development process. It ensures that the system’s design and implementation will meet the users’ needs and align with the business objectives.
Conceptual vs Logical Data Modeling
Conceptual modeling and logical data modeling are both key steps in the process of database design and system development, but they operate at different levels of abstraction and serve distinct purposes. Understanding the differences between these two modeling phases is essential for effectively capturing requirements and designing a system that meets its intended goals. Below a breakdown of how conceptual modeling differs from logical data modeling:
Conceptual Modeling:
- Level of Abstraction: Conceptual modeling is at a higher level of abstraction. It focuses on the broad and fundamental structure of the domain without getting into the specifics of how the model will be implemented in a database system.
- Purpose: The primary goal is to capture and represent the main entities, concepts, and relationships within the domain of interest. It’s about understanding what the system needs to represent, rather than how it will be technically achieved.
- Audience: It is intended for a wide range of stakeholders, including domain experts, business analysts, and end-users, to ensure that the model accurately reflects the real-world context it aims to represent.
- Detail Level: Conceptual models are less detailed and do not specify attributes or primary keys. They focus on the high-level relationships and entities.
- Notation: Commonly uses Entity-Relationship Diagrams (ERD) without much detail, Unified Modeling Language (UML) class diagrams, or other high-level diagrams to illustrate the concepts and relationships.
Logical Data Modeling:
- Level of Abstraction: Logical data modeling is one step lower in the abstraction level than conceptual modeling. It starts to consider how the conceptual model will be implemented, without being tied to a specific database technology.
- Purpose: The goal is to translate the conceptual model into a more detailed model that specifies tables, columns, data types, and constraints. It defines the structure of the data as it will be stored in the database.
- Audience: It is mainly intended for database designers and developers who are responsible for implementing the model in a database management system.
- Detail Level: Logical models are more detailed than conceptual models. They specify entity attributes, primary keys, foreign keys, and the normalization of tables to eliminate redundancy.
- Notation: Uses detailed ERDs that include specific attributes and data types, or other database modeling notations, to prepare for the physical implementation.
In essence, conceptual modeling is about understanding and documenting the domain from a high-level perspective, while logical data modeling takes that understanding and begins the process of designing how it will be technically realized in a database, focusing on table structures and integrity constraints. These steps are complementary and sequentially linked in the system development lifecycle, ensuring that the transition from domain-specific concepts to a technical implementation is smooth and aligned with the initial requirements.
Role of UML
The Unified Modeling Language (UML) is a standardized modeling language used in the field of software engineering and systems design to specify, visualize, construct, and document the artifacts of software systems, as well as non-software systems. UML was developed to unify the diverse modeling notations that were used in the early days of object-oriented design and to provide a consistent and comprehensive modeling approach applicable across different types of systems and domains. It is now widely adopted for modeling software applications and is supported by many tools that facilitate the design and development process.
Overview of UML
Purpose: UML aims to provide a standard way to visualize the design of a system, facilitating a common understanding among stakeholders, such as business analysts, developers, and testers.
Use Cases: It is used across the software development lifecycle, from requirements gathering and analysis, through design, to implementation. UML can model application structures, behaviors, and architectures, among other aspects.
Diagrams: UML includes a set of graphic notation techniques to create visual models of software systems. These diagrams are categorized into two main types: structure diagrams and behavior diagrams.
Structure Diagrams
These diagrams emphasize what components make up a system and how they are related. Key structure diagrams include:
- Class Diagram: Shows how classes (the building blocks of an application) relate to each other and the static structure of the system.
- Component Diagram: Describes how a software system is split up into components and shows the dependencies among these components.
- Composite Structure Diagram: Highlights the internal structure of a class and the collaborations that this structure makes possible.
- Deployment Diagram: Focuses on the physical deployment of artifacts (e.g., software) on nodes (e.g., hardware).
- Object Diagram: Represents instances of classes and their relationships at a specific point in time.
- Package Diagram: Shows how the system is divided into packages and the dependencies among them.
Behavior Diagrams
These diagrams represent the dynamic aspects of a system, showing how the system behaves and interacts. Key behavior diagrams include:
- Use Case Diagram: Illustrates the functionality provided by the system in terms of actors, their goals represented as use cases, and any dependencies among those use cases.
- Sequence Diagram: Shows how objects interact in a particular scenario of a use case, in a sequential order.
- Activity Diagram: Represents the flow of control or data flow within a system, highlighting the sequence and conditions for coordinating lower-level behaviors.
- State Machine Diagram: Describes the states an object or an interaction may be in, as well as the transitions between these states.
- Communication Diagram: Focuses on the interaction between objects, emphasizing the structural organization of objects that send and receive messages.
- Interaction Overview Diagram: Offers an overview of the flow of control where nodes are interactions or interaction uses.
Standardization and Usage
UML has been standardized by the Object Management Group (OMG), an international technology standards consortium. The standard undergoes periodic revisions to incorporate new methodologies and improvements.
UML’s versatility allows it to be applied in various domains, not just software engineering. It can be used for business process modeling, systems engineering, and more. Despite its comprehensive nature, the complexity of UML means that projects may only use a subset of its diagrams and features, tailored to their specific needs.
This lesson focuses on one of the diagrams in the UML: Class Diagrams. They are used for modeling structure, specifically data, so they are ideal for visually expressing a conceptual domain data model.
UML Class Diagrams
The Class Diagram is one of the most widely used diagrams in the modeling of domains, ontologies, and object-oriented systems. It serves as a cornerstone for both the system’s structure and its behavior, providing a static view of an application or a domain’s information objects. A UML Class Diagram describes the types of objects (classes/entities/concepts) in a domain and the various kinds of static relationships that exist among them. Here’s an overview of its key components and how they are used:
Classes
A class is depicted as a rectangle divided into three parts: the top part contains the class’s name, the middle part contains the class’s attributes, and the bottom part lists the methods or operations the class can perform. Classes represent the main objects and concepts in a domain. For ontology modeling, methods are often omitted and the third compartment is often used for the class’ glossary entry or description.
Attributes
Attributes, shown in the second section of a class, represent the properties, characteristics, or data that objects of the class hold. They are typically variables or types associated with the class.
Operations
Operations, detailed in the third section, are the functions or methods the class can execute. These include the behaviors that objects of the class can perform. For ontology modeling, methods are often omitted and the third compartment is often used for the class’ glossary entry or description.
Relationships
Class diagrams include several types of relationships to show how classes interact with one another:
Association: This represents a general ‘uses-a’ relationship between two or more classes, indicating that instances of one class connect to instances of another. The association can be unidirectional or bidirectional, depicted with a line connecting the classes.
Aggregation: A special type of association that represents a ‘has-a’ relationship but with a whole/part distinction, suggesting that one class is a part of another but can exist independently.
Composition: A stronger form of aggregation implying a strong lifecycle dependency between the whole and its parts. When the whole is destroyed, its parts are also destroyed.
Inheritance (Generalization): This depicts an ‘is-a’ relationship, indicating that one class (the subclass) is a specialized form of another class (the superclass). It is shown with a line and an empty arrowhead pointing from the subclass to the superclass.
Dependency: A relationship where one class depends on another because it uses it at some point in time. It’s a weaker relationship than association, represented by a dashed line.
Realization: A relationship where an interface class is implemented by another class. The interface class defines a set of operations that the implementing class must perform.
Multiplicity
Multiplicity notations are used to indicate the number of instances of one class that can be associated with one instance of another class. For example, “1..*” indicates that one instance of the first class can be associated with many instances of the second class.
Visibility
Visibility symbols (such as + for public, - for private, and # for protected) can precede attribute and operation names to indicate their accessibility.
Use Cases
Class diagrams are fundamental in object-oriented design and development, used for:
- Visualizing the ontology of a business domain.
- Visualizing the object-oriented structure of a system.
- Planning the system before coding begins.
- Documenting class and object interactions in a system.
By providing a high-level view of a system or of a domain, class diagrams help developers and data architects understand the overall structure, making it easier to build and maintain the system or to manage an ontology. They are essential tools in the software and data development lifecycle, particularly during the design phase, where they guide the creation of the system’s data architecture or a domain’s ontology.
Defining Model Scope
A conceptual model is a model of all necessary classes and attributes plus relationships that are needed to address the needs defined in the “use cases”. So, a data architect or system designers needs to first define the use cases, i.e., how the model will support users and data needs. We commonly use the “user story” format for this, for example:
- As an instructor, I want to post an assignment.
- As an instructor, I want to see when the student submitted the assignment.
- As a student, I want to submit a solution to an assignment.
So, from that you can identify the necessary classes, attributes, and relationships:
- Instructor
- Assignment
- Submission (with date)
- Solution
- Student
Without the use cases, there is no scope boundary and it is not obvious to tell when modeling should stop.
Lectures
UML Class Diagrams are an alternative visual notation to ER Diagrams. They are commonly used for conceptual data modeling and ontology design. The Class Diagram is one of the 12 diagrams of the Unified Modeling Language. It is a diagram used to show the classes (or entities) in a system or domain. The two lectures below provide an overview of the purpose of conceptual modeling and how to construct a conceptual model in a UML Class Diagram.
Summary
In this lesson, we covered several topics related to visual modeling of object-oriented systems and domain ontologies:
Conceptual Domain Modeling: We discussed what conceptual domain modeling is, highlighting its focus on identifying key concepts and relationships within a specific domain of interest. This process aims to create a high-level representation of information to be managed by a system or database, emphasizing the importance of abstraction and serving as a foundation for further system and data architecture development activities.
Differences Between Conceptual and Logical Data Modeling: We explored the differences between conceptual modeling and logical data modeling. Conceptual modeling operates at a higher level of abstraction, focusing on the broad structure of the domain and its entities and relationships without delving into technical implementation details. In contrast, logical data modeling provides a more detailed blueprint that specifies tables, columns, data types, and constraints, preparing for the physical database design.
Unified Modeling Language (UML): An overview of UML was provided, outlining its purpose as a standardized modeling language to specify, visualize, construct, and document the artifacts of both software and non-software systems. We discussed the two main types of UML diagrams—structure diagrams and behavior diagrams—and their roles in visualizing different aspects of a system.
UML Class Diagram Overview: Finally, we delved into the specifics of the UML Class Diagram, one of the most fundamental diagrams in UML for object-oriented design, conceptual data modeling, and ontology visualization. We covered its key components, including classes, attributes, operations, and various types of relationships (association, aggregation, composition, inheritance, dependency, realization), as well as multiplicity and visibility.
LS0tCnRpdGxlOiAiRG9tYWluIE1vZGVsaW5nIHdpdGggVU1MIENsYXNzIERpYWdyYW1zIgpwYXJhbXM6CiAgY2F0ZWdvcnk6IDMwCiAgc3RhY2tzOiAiMCwwIgogIG51bWJlcjogMTUyCiAgdGltZTogNDUKICBsZXZlbDogYmVnaW5uZXIKICB0YWdzOiBVTUwsRVJELFZpc3VhbCBNb2RlbGluZyxPbnRvbG9neQogIGRlc2NyaXB0aW9uOiAiVGhpcyBsZXNzb24gZXhwbGFpbnMgaG93IHRvIHVzZSBVTUwgQ2xhc3MgRGlhZ3JhbXMKICAgICAgICAgICAgICAgIGZvciBleHByZXNzaW5nIGRvbWFpbiBvbnRvbG9naWVzIGF0IHRoZSBjb25jZXB0dWFsCiAgICAgICAgICAgICAgICBsZXZlbCB1c2luZyBVTUwgQ2xhc3MgRGlhZ3JhbXMuIEV4cGxhaW5zIHRoZQogICAgICAgICAgICAgICAgc3ltYm9scyBhbmQgbW9kZWxpbmcgZWxlbWVudHMgb2YgVU1MIENsYXNzIERpYWdyYW1zLiIKZGF0ZTogIjxzbWFsbD5gciBTeXMuRGF0ZSgpYDwvc21hbGw+IgphdXRob3I6ICI8c21hbGw+TWFydGluIFNjaGVkbGJhdWVyPC9zbWFsbD4iCmVtYWlsOiAibS5zY2hlZGxiYXVlckBuZXUuZWR1IgphZmZpbGl0YXRpb246ICJOb3J0aGVhc3Rlcm4gVW5pdmVyc2l0eSIKb3V0cHV0OiAKICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IHNwYWNlbGFiCiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKLS0tCnRpdGxlOiAiPHNtYWxsPmByIHBhcmFtcyRjYXRlZ29yeWAuYHIgcGFyYW1zJG51bWJlcmA8L3NtYWxsPjxici8+PHNwYW4gc3R5bGU9J2NvbG9yOiAjMkU0MDUzOyBmb250LXNpemU6IDAuOWVtJz5gciBybWFya2Rvd246Om1ldGFkYXRhJHRpdGxlYDwvc3Bhbj4iCi0tLQoKYGBge3IgY29kZT14ZnVuOjpyZWFkX3V0ZjgocGFzdGUwKGhlcmU6OmhlcmUoKSwnL1IvX2luc2VydDJEQi5SJykpLCBpbmNsdWRlID0gRkFMU0V9CmBgYAoKIyMgSW50cm9kdWN0aW9uCgpDb25jZXB0dWFsIGRvbWFpbiBtb2RlbGluZyAob3IgY29uY2VwdHVhbCBkYXRhIG1vZGVsaW5nKSBpcyBhIHByb2Nlc3MgdXNlZCBpbiBkYXRhYmFzZSBkZXNpZ24sIHN5c3RlbXMgZGVzaWduLCBhbmQgc29mdHdhcmUgZW5naW5lZXJpbmcgdG8gY3JlYXRlIGEgaGlnaC1sZXZlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIG1hbmFnZWQgYnkgYSBzeXN0ZW0uIFRoaXMgdHlwZSBvZiBtb2RlbGluZyBmb2N1c2VzIG9uIGlkZW50aWZ5aW5nIHRoZSBrZXkgY29uY2VwdHMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgd2l0aGluIGEgc3BlY2lmaWMgZG9tYWluIG9mIGludGVyZXN0LCByYXRoZXIgdGhhbiBkZXRhaWxpbmcgdGhlIHRlY2huaWNhbCBpbXBsZW1lbnRhdGlvbi4gSXQgc2VydmVzIGFzIGEgZm91bmRhdGlvbiBmb3IgZnVydGhlciBkZXZlbG9wbWVudCBhbmQgZGVzaWduIGFjdGl2aXRpZXMsIGluY2x1ZGluZyB0aGUgY3JlYXRpb24gb2YgbW9yZSBkZXRhaWxlZCBtb2RlbHMgYW5kIHRoZSBhY3R1YWwgZGF0YWJhc2UgYW5kIHN5c3RlbSBpbXBsZW1lbnRhdGlvbi4gSGVyZSBhcmUgdGhlIG1haW4gYXNwZWN0cyBvZiBjb25jZXB0dWFsIGRvbWFpbiBtb2RlbGluZzoKCjEuICAqKklkZW50aWZ5aW5nIEtleSBDb25jZXB0cyoqOiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBpZGVudGlmeSB0aGUgbWFpbiBlbnRpdGllcyBvciBjb25jZXB0cyB3aXRoaW4gdGhlIGRvbWFpbi4gVGhlc2UgY291bGQgYmUgcGh5c2ljYWwgb2JqZWN0cywgZXZlbnRzLCBvciBpZGVhcyByZWxldmFudCB0byB0aGUgZG9tYWluIG9mIGludGVyZXN0LgoKMi4gICoqRGVmaW5pbmcgUmVsYXRpb25zaGlwcyoqOiBBZnRlciBpZGVudGlmeWluZyB0aGUga2V5IGNvbmNlcHRzLCB0aGUgbmV4dCBzdGVwIGlzIHRvIGRlZmluZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZW0uIFRoaXMgaW5jbHVkZXMgdW5kZXJzdGFuZGluZyBob3cgZW50aXRpZXMgaW50ZXJhY3Qgd2l0aCBlYWNoIG90aGVyLCB0aGVpciBkZXBlbmRlbmNpZXMsIGFuZCB0aGVpciBoaWVyYXJjaGllcy4KCjMuICAqKkNhcHR1cmluZyBBdHRyaWJ1dGVzKio6IFdoaWxlIHRoZSBwcmltYXJ5IGZvY3VzIGlzIG9uIGNvbmNlcHRzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzLCBjb25jZXB0dWFsIG1vZGVsaW5nIGFsc28gaW52b2x2ZXMgY2FwdHVyaW5nIHRoZSBlc3NlbnRpYWwgYXR0cmlidXRlcyBvZiBlYWNoIGNvbmNlcHQuIFRoZXNlIGF0dHJpYnV0ZXMgcmVwcmVzZW50IHRoZSBwcm9wZXJ0aWVzIG9yIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZW50aXRpZXMuCgo0LiAgKipBYnN0cmFjdGlvbioqOiBDb25jZXB0dWFsIGRvbWFpbiBtb2RlbGluZyBhYnN0cmFjdHMgYXdheSB0aGUgdGVjaG5pY2FsIGRldGFpbHMgYW5kIGZvY3VzZXMgb24gdGhlIGRvbWFpbiBpdHNlbGYuIEl0IGFpbXMgdG8gY3JlYXRlIGEgbW9kZWwgdGhhdCBpcyB1bmRlcnN0YW5kYWJsZSBieSBzdGFrZWhvbGRlcnMgd2hvIG1heSBub3QgaGF2ZSBhIHRlY2huaWNhbCBiYWNrZ3JvdW5kLCBzdWNoIGFzIGJ1c2luZXNzIGFuYWx5c3RzLCBkb21haW4gZXhwZXJ0cywgYW5kIGVuZC11c2Vycy4KCjUuICAqKlB1cnBvc2UgYW5kIFVzZSoqOiBUaGUgbW9kZWwgc2VydmVzIGFzIGEgY29tbXVuaWNhdGlvbiB0b29sIGFtb25nIHN0YWtlaG9sZGVycyBhbmQgYXMgYSBndWlkZSBmb3Igc3lzdGVtIGRlc2lnbmVycyBhbmQgZGV2ZWxvcGVycy4gSXQgaGVscHMgZW5zdXJlIHRoYXQgdGhlIHN5c3RlbSBkZXZlbG9wbWVudCBhbGlnbnMgd2l0aCB0aGUgYnVzaW5lc3MgcmVxdWlyZW1lbnRzIGFuZCBkb21haW4gbmVlZHMuCgo2LiAgKipUZWNobmlxdWVzIGFuZCBOb3RhdGlvbnMqKjogVmFyaW91cyBtb2RlbGluZyB0ZWNobmlxdWVzIGFuZCBub3RhdGlvbnMgY2FuIGJlIHVzZWQgZm9yIGNvbmNlcHR1YWwgZG9tYWluIG1vZGVsaW5nLCBpbmNsdWRpbmcgRW50aXR5LVJlbGF0aW9uc2hpcCBEaWFncmFtcyAoRVJEKSwgVW5pZmllZCBNb2RlbGluZyBMYW5ndWFnZSAoVU1MKSwgYW5kIGRvbWFpbi1zcGVjaWZpYyBsYW5ndWFnZXMgZGVzaWduZWQgZm9yIHBhcnRpY3VsYXIgZG9tYWlucyBvciBpbmR1c3RyaWVzLgoKQ29uY2VwdHVhbCBkb21haW4gbW9kZWxpbmcgaXMgZXNzZW50aWFsIGluIHRoZSBlYXJseSBzdGFnZXMgb2Ygc3lzdGVtIGRldmVsb3BtZW50IGFzIGl0IGhlbHBzIGNsYXJpZnkgcmVxdWlyZW1lbnRzLCByZWR1Y2UgY29tcGxleGl0eSwgYW5kIHByZXZlbnQgbWlzdW5kZXJzdGFuZGluZ3MgbGF0ZXIgaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuIEl0IGVuc3VyZXMgdGhhdCB0aGUgc3lzdGVtJ3MgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiB3aWxsIG1lZXQgdGhlIHVzZXJzJyBuZWVkcyBhbmQgYWxpZ24gd2l0aCB0aGUgYnVzaW5lc3Mgb2JqZWN0aXZlcy4KCiMjIENvbmNlcHR1YWwgdnMgTG9naWNhbCBEYXRhIE1vZGVsaW5nCgpDb25jZXB0dWFsIG1vZGVsaW5nIGFuZCBsb2dpY2FsIGRhdGEgbW9kZWxpbmcgYXJlIGJvdGgga2V5IHN0ZXBzIGluIHRoZSBwcm9jZXNzIG9mIGRhdGFiYXNlIGRlc2lnbiBhbmQgc3lzdGVtIGRldmVsb3BtZW50LCBidXQgdGhleSBvcGVyYXRlIGF0IGRpZmZlcmVudCBsZXZlbHMgb2YgYWJzdHJhY3Rpb24gYW5kIHNlcnZlIGRpc3RpbmN0IHB1cnBvc2VzLiBVbmRlcnN0YW5kaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIHR3byBtb2RlbGluZyBwaGFzZXMgaXMgZXNzZW50aWFsIGZvciBlZmZlY3RpdmVseSBjYXB0dXJpbmcgcmVxdWlyZW1lbnRzIGFuZCBkZXNpZ25pbmcgYSBzeXN0ZW0gdGhhdCBtZWV0cyBpdHMgaW50ZW5kZWQgZ29hbHMuIEJlbG93IGEgYnJlYWtkb3duIG9mIGhvdyBjb25jZXB0dWFsIG1vZGVsaW5nIGRpZmZlcnMgZnJvbSBsb2dpY2FsIGRhdGEgbW9kZWxpbmc6CgojIyMgQ29uY2VwdHVhbCBNb2RlbGluZzoKCi0gICAqKkxldmVsIG9mIEFic3RyYWN0aW9uKio6IENvbmNlcHR1YWwgbW9kZWxpbmcgaXMgYXQgYSBoaWdoZXIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEl0IGZvY3VzZXMgb24gdGhlIGJyb2FkIGFuZCBmdW5kYW1lbnRhbCBzdHJ1Y3R1cmUgb2YgdGhlIGRvbWFpbiB3aXRob3V0IGdldHRpbmcgaW50byB0aGUgc3BlY2lmaWNzIG9mIGhvdyB0aGUgbW9kZWwgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBhIGRhdGFiYXNlIHN5c3RlbS4KLSAgICoqUHVycG9zZSoqOiBUaGUgcHJpbWFyeSBnb2FsIGlzIHRvIGNhcHR1cmUgYW5kIHJlcHJlc2VudCB0aGUgbWFpbiBlbnRpdGllcywgY29uY2VwdHMsIGFuZCByZWxhdGlvbnNoaXBzIHdpdGhpbiB0aGUgZG9tYWluIG9mIGludGVyZXN0LiBJdCdzIGFib3V0IHVuZGVyc3RhbmRpbmcgd2hhdCB0aGUgc3lzdGVtIG5lZWRzIHRvIHJlcHJlc2VudCwgcmF0aGVyIHRoYW4gaG93IGl0IHdpbGwgYmUgdGVjaG5pY2FsbHkgYWNoaWV2ZWQuCi0gICAqKkF1ZGllbmNlKio6IEl0IGlzIGludGVuZGVkIGZvciBhIHdpZGUgcmFuZ2Ugb2Ygc3Rha2Vob2xkZXJzLCBpbmNsdWRpbmcgZG9tYWluIGV4cGVydHMsIGJ1c2luZXNzIGFuYWx5c3RzLCBhbmQgZW5kLXVzZXJzLCB0byBlbnN1cmUgdGhhdCB0aGUgbW9kZWwgYWNjdXJhdGVseSByZWZsZWN0cyB0aGUgcmVhbC13b3JsZCBjb250ZXh0IGl0IGFpbXMgdG8gcmVwcmVzZW50LgotICAgKipEZXRhaWwgTGV2ZWwqKjogQ29uY2VwdHVhbCBtb2RlbHMgYXJlIGxlc3MgZGV0YWlsZWQgYW5kIGRvIG5vdCBzcGVjaWZ5IGF0dHJpYnV0ZXMgb3IgcHJpbWFyeSBrZXlzLiBUaGV5IGZvY3VzIG9uIHRoZSBoaWdoLWxldmVsIHJlbGF0aW9uc2hpcHMgYW5kIGVudGl0aWVzLgotICAgKipOb3RhdGlvbioqOiBDb21tb25seSB1c2VzIEVudGl0eS1SZWxhdGlvbnNoaXAgRGlhZ3JhbXMgKEVSRCkgd2l0aG91dCBtdWNoIGRldGFpbCwgVW5pZmllZCBNb2RlbGluZyBMYW5ndWFnZSAoVU1MKSBjbGFzcyBkaWFncmFtcywgb3Igb3RoZXIgaGlnaC1sZXZlbCBkaWFncmFtcyB0byBpbGx1c3RyYXRlIHRoZSBjb25jZXB0cyBhbmQgcmVsYXRpb25zaGlwcy4KCiMjIyBMb2dpY2FsIERhdGEgTW9kZWxpbmc6CgotICAgKipMZXZlbCBvZiBBYnN0cmFjdGlvbioqOiBMb2dpY2FsIGRhdGEgbW9kZWxpbmcgaXMgb25lIHN0ZXAgbG93ZXIgaW4gdGhlIGFic3RyYWN0aW9uIGxldmVsIHRoYW4gY29uY2VwdHVhbCBtb2RlbGluZy4gSXQgc3RhcnRzIHRvIGNvbnNpZGVyIGhvdyB0aGUgY29uY2VwdHVhbCBtb2RlbCB3aWxsIGJlIGltcGxlbWVudGVkLCB3aXRob3V0IGJlaW5nIHRpZWQgdG8gYSBzcGVjaWZpYyBkYXRhYmFzZSB0ZWNobm9sb2d5LgotICAgKipQdXJwb3NlKio6IFRoZSBnb2FsIGlzIHRvIHRyYW5zbGF0ZSB0aGUgY29uY2VwdHVhbCBtb2RlbCBpbnRvIGEgbW9yZSBkZXRhaWxlZCBtb2RlbCB0aGF0IHNwZWNpZmllcyB0YWJsZXMsIGNvbHVtbnMsIGRhdGEgdHlwZXMsIGFuZCBjb25zdHJhaW50cy4gSXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhIGFzIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS4KLSAgICoqQXVkaWVuY2UqKjogSXQgaXMgbWFpbmx5IGludGVuZGVkIGZvciBkYXRhYmFzZSBkZXNpZ25lcnMgYW5kIGRldmVsb3BlcnMgd2hvIGFyZSByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBtb2RlbCBpbiBhIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtLgotICAgKipEZXRhaWwgTGV2ZWwqKjogTG9naWNhbCBtb2RlbHMgYXJlIG1vcmUgZGV0YWlsZWQgdGhhbiBjb25jZXB0dWFsIG1vZGVscy4gVGhleSBzcGVjaWZ5IGVudGl0eSBhdHRyaWJ1dGVzLCBwcmltYXJ5IGtleXMsIGZvcmVpZ24ga2V5cywgYW5kIHRoZSBub3JtYWxpemF0aW9uIG9mIHRhYmxlcyB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS4KLSAgICoqTm90YXRpb24qKjogVXNlcyBkZXRhaWxlZCBFUkRzIHRoYXQgaW5jbHVkZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIGFuZCBkYXRhIHR5cGVzLCBvciBvdGhlciBkYXRhYmFzZSBtb2RlbGluZyBub3RhdGlvbnMsIHRvIHByZXBhcmUgZm9yIHRoZSBwaHlzaWNhbCBpbXBsZW1lbnRhdGlvbi4KCkluIGVzc2VuY2UsIGNvbmNlcHR1YWwgbW9kZWxpbmcgaXMgYWJvdXQgdW5kZXJzdGFuZGluZyBhbmQgZG9jdW1lbnRpbmcgdGhlIGRvbWFpbiBmcm9tIGEgaGlnaC1sZXZlbCBwZXJzcGVjdGl2ZSwgd2hpbGUgbG9naWNhbCBkYXRhIG1vZGVsaW5nIHRha2VzIHRoYXQgdW5kZXJzdGFuZGluZyBhbmQgYmVnaW5zIHRoZSBwcm9jZXNzIG9mIGRlc2lnbmluZyBob3cgaXQgd2lsbCBiZSB0ZWNobmljYWxseSByZWFsaXplZCBpbiBhIGRhdGFiYXNlLCBmb2N1c2luZyBvbiB0YWJsZSBzdHJ1Y3R1cmVzIGFuZCBpbnRlZ3JpdHkgY29uc3RyYWludHMuIFRoZXNlIHN0ZXBzIGFyZSBjb21wbGVtZW50YXJ5IGFuZCBzZXF1ZW50aWFsbHkgbGlua2VkIGluIHRoZSBzeXN0ZW0gZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBlbnN1cmluZyB0aGF0IHRoZSB0cmFuc2l0aW9uIGZyb20gZG9tYWluLXNwZWNpZmljIGNvbmNlcHRzIHRvIGEgdGVjaG5pY2FsIGltcGxlbWVudGF0aW9uIGlzIHNtb290aCBhbmQgYWxpZ25lZCB3aXRoIHRoZSBpbml0aWFsIHJlcXVpcmVtZW50cy4KCiMjIFJvbGUgb2YgVU1MCgpUaGUgVW5pZmllZCBNb2RlbGluZyBMYW5ndWFnZSAoVU1MKSBpcyBhIHN0YW5kYXJkaXplZCBtb2RlbGluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBmaWVsZCBvZiBzb2Z0d2FyZSBlbmdpbmVlcmluZyBhbmQgc3lzdGVtcyBkZXNpZ24gdG8gc3BlY2lmeSwgdmlzdWFsaXplLCBjb25zdHJ1Y3QsIGFuZCBkb2N1bWVudCB0aGUgYXJ0aWZhY3RzIG9mIHNvZnR3YXJlIHN5c3RlbXMsIGFzIHdlbGwgYXMgbm9uLXNvZnR3YXJlIHN5c3RlbXMuIFVNTCB3YXMgZGV2ZWxvcGVkIHRvIHVuaWZ5IHRoZSBkaXZlcnNlIG1vZGVsaW5nIG5vdGF0aW9ucyB0aGF0IHdlcmUgdXNlZCBpbiB0aGUgZWFybHkgZGF5cyBvZiBvYmplY3Qtb3JpZW50ZWQgZGVzaWduIGFuZCB0byBwcm92aWRlIGEgY29uc2lzdGVudCBhbmQgY29tcHJlaGVuc2l2ZSBtb2RlbGluZyBhcHByb2FjaCBhcHBsaWNhYmxlIGFjcm9zcyBkaWZmZXJlbnQgdHlwZXMgb2Ygc3lzdGVtcyBhbmQgZG9tYWlucy4gSXQgaXMgbm93IHdpZGVseSBhZG9wdGVkIGZvciBtb2RlbGluZyBzb2Z0d2FyZSBhcHBsaWNhdGlvbnMgYW5kIGlzIHN1cHBvcnRlZCBieSBtYW55IHRvb2xzIHRoYXQgZmFjaWxpdGF0ZSB0aGUgZGVzaWduIGFuZCBkZXZlbG9wbWVudCBwcm9jZXNzLgoKIyMjIE92ZXJ2aWV3IG9mIFVNTAoKLSAgICoqUHVycG9zZSoqOiBVTUwgYWltcyB0byBwcm92aWRlIGEgc3RhbmRhcmQgd2F5IHRvIHZpc3VhbGl6ZSB0aGUgZGVzaWduIG9mIGEgc3lzdGVtLCBmYWNpbGl0YXRpbmcgYSBjb21tb24gdW5kZXJzdGFuZGluZyBhbW9uZyBzdGFrZWhvbGRlcnMsIHN1Y2ggYXMgYnVzaW5lc3MgYW5hbHlzdHMsIGRldmVsb3BlcnMsIGFuZCB0ZXN0ZXJzLgoKLSAgICoqVXNlIENhc2VzKio6IEl0IGlzIHVzZWQgYWNyb3NzIHRoZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGZyb20gcmVxdWlyZW1lbnRzIGdhdGhlcmluZyBhbmQgYW5hbHlzaXMsIHRocm91Z2ggZGVzaWduLCB0byBpbXBsZW1lbnRhdGlvbi4gVU1MIGNhbiBtb2RlbCBhcHBsaWNhdGlvbiBzdHJ1Y3R1cmVzLCBiZWhhdmlvcnMsIGFuZCBhcmNoaXRlY3R1cmVzLCBhbW9uZyBvdGhlciBhc3BlY3RzLgoKLSAgICoqRGlhZ3JhbXMqKjogVU1MIGluY2x1ZGVzIGEgc2V0IG9mIGdyYXBoaWMgbm90YXRpb24gdGVjaG5pcXVlcyB0byBjcmVhdGUgdmlzdWFsIG1vZGVscyBvZiBzb2Z0d2FyZSBzeXN0ZW1zLiBUaGVzZSBkaWFncmFtcyBhcmUgY2F0ZWdvcml6ZWQgaW50byB0d28gbWFpbiB0eXBlczogc3RydWN0dXJlIGRpYWdyYW1zIGFuZCBiZWhhdmlvciBkaWFncmFtcy4KCiMjIyBTdHJ1Y3R1cmUgRGlhZ3JhbXMKClRoZXNlIGRpYWdyYW1zIGVtcGhhc2l6ZSB3aGF0IGNvbXBvbmVudHMgbWFrZSB1cCBhIHN5c3RlbSBhbmQgaG93IHRoZXkgYXJlIHJlbGF0ZWQuIEtleSBzdHJ1Y3R1cmUgZGlhZ3JhbXMgaW5jbHVkZToKCjEuICAqKkNsYXNzIERpYWdyYW0qKjogU2hvd3MgaG93IGNsYXNzZXMgKHRoZSBidWlsZGluZyBibG9ja3Mgb2YgYW4gYXBwbGljYXRpb24pIHJlbGF0ZSB0byBlYWNoIG90aGVyIGFuZCB0aGUgc3RhdGljIHN0cnVjdHVyZSBvZiB0aGUgc3lzdGVtLgoyLiAgKipDb21wb25lbnQgRGlhZ3JhbSoqOiBEZXNjcmliZXMgaG93IGEgc29mdHdhcmUgc3lzdGVtIGlzIHNwbGl0IHVwIGludG8gY29tcG9uZW50cyBhbmQgc2hvd3MgdGhlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVzZSBjb21wb25lbnRzLgozLiAgKipDb21wb3NpdGUgU3RydWN0dXJlIERpYWdyYW0qKjogSGlnaGxpZ2h0cyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIGEgY2xhc3MgYW5kIHRoZSBjb2xsYWJvcmF0aW9ucyB0aGF0IHRoaXMgc3RydWN0dXJlIG1ha2VzIHBvc3NpYmxlLgo0LiAgKipEZXBsb3ltZW50IERpYWdyYW0qKjogRm9jdXNlcyBvbiB0aGUgcGh5c2ljYWwgZGVwbG95bWVudCBvZiBhcnRpZmFjdHMgKGUuZy4sIHNvZnR3YXJlKSBvbiBub2RlcyAoZS5nLiwgaGFyZHdhcmUpLgo1LiAgKipPYmplY3QgRGlhZ3JhbSoqOiBSZXByZXNlbnRzIGluc3RhbmNlcyBvZiBjbGFzc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGF0IGEgc3BlY2lmaWMgcG9pbnQgaW4gdGltZS4KNi4gICoqUGFja2FnZSBEaWFncmFtKio6IFNob3dzIGhvdyB0aGUgc3lzdGVtIGlzIGRpdmlkZWQgaW50byBwYWNrYWdlcyBhbmQgdGhlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVtLgoKIyMjIEJlaGF2aW9yIERpYWdyYW1zCgpUaGVzZSBkaWFncmFtcyByZXByZXNlbnQgdGhlIGR5bmFtaWMgYXNwZWN0cyBvZiBhIHN5c3RlbSwgc2hvd2luZyBob3cgdGhlIHN5c3RlbSBiZWhhdmVzIGFuZCBpbnRlcmFjdHMuIEtleSBiZWhhdmlvciBkaWFncmFtcyBpbmNsdWRlOgoKMS4gICoqVXNlIENhc2UgRGlhZ3JhbSoqOiBJbGx1c3RyYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGUgc3lzdGVtIGluIHRlcm1zIG9mIGFjdG9ycywgdGhlaXIgZ29hbHMgcmVwcmVzZW50ZWQgYXMgdXNlIGNhc2VzLCBhbmQgYW55IGRlcGVuZGVuY2llcyBhbW9uZyB0aG9zZSB1c2UgY2FzZXMuCjIuICAqKlNlcXVlbmNlIERpYWdyYW0qKjogU2hvd3MgaG93IG9iamVjdHMgaW50ZXJhY3QgaW4gYSBwYXJ0aWN1bGFyIHNjZW5hcmlvIG9mIGEgdXNlIGNhc2UsIGluIGEgc2VxdWVudGlhbCBvcmRlci4KMy4gICoqQWN0aXZpdHkgRGlhZ3JhbSoqOiBSZXByZXNlbnRzIHRoZSBmbG93IG9mIGNvbnRyb2wgb3IgZGF0YSBmbG93IHdpdGhpbiBhIHN5c3RlbSwgaGlnaGxpZ2h0aW5nIHRoZSBzZXF1ZW5jZSBhbmQgY29uZGl0aW9ucyBmb3IgY29vcmRpbmF0aW5nIGxvd2VyLWxldmVsIGJlaGF2aW9ycy4KNC4gICoqU3RhdGUgTWFjaGluZSBEaWFncmFtKio6IERlc2NyaWJlcyB0aGUgc3RhdGVzIGFuIG9iamVjdCBvciBhbiBpbnRlcmFjdGlvbiBtYXkgYmUgaW4sIGFzIHdlbGwgYXMgdGhlIHRyYW5zaXRpb25zIGJldHdlZW4gdGhlc2Ugc3RhdGVzLgo1LiAgKipDb21tdW5pY2F0aW9uIERpYWdyYW0qKjogRm9jdXNlcyBvbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBvYmplY3RzLCBlbXBoYXNpemluZyB0aGUgc3RydWN0dXJhbCBvcmdhbml6YXRpb24gb2Ygb2JqZWN0cyB0aGF0IHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuCjYuICAqKkludGVyYWN0aW9uIE92ZXJ2aWV3IERpYWdyYW0qKjogT2ZmZXJzIGFuIG92ZXJ2aWV3IG9mIHRoZSBmbG93IG9mIGNvbnRyb2wgd2hlcmUgbm9kZXMgYXJlIGludGVyYWN0aW9ucyBvciBpbnRlcmFjdGlvbiB1c2VzLgoKIyMjIFN0YW5kYXJkaXphdGlvbiBhbmQgVXNhZ2UKClVNTCBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgdGhlIE9iamVjdCBNYW5hZ2VtZW50IEdyb3VwIChPTUcpLCBhbiBpbnRlcm5hdGlvbmFsIHRlY2hub2xvZ3kgc3RhbmRhcmRzIGNvbnNvcnRpdW0uIFRoZSBzdGFuZGFyZCB1bmRlcmdvZXMgcGVyaW9kaWMgcmV2aXNpb25zIHRvIGluY29ycG9yYXRlIG5ldyBtZXRob2RvbG9naWVzIGFuZCBpbXByb3ZlbWVudHMuCgpVTUwncyB2ZXJzYXRpbGl0eSBhbGxvd3MgaXQgdG8gYmUgYXBwbGllZCBpbiB2YXJpb3VzIGRvbWFpbnMsIG5vdCBqdXN0IHNvZnR3YXJlIGVuZ2luZWVyaW5nLiBJdCBjYW4gYmUgdXNlZCBmb3IgYnVzaW5lc3MgcHJvY2VzcyBtb2RlbGluZywgc3lzdGVtcyBlbmdpbmVlcmluZywgYW5kIG1vcmUuIERlc3BpdGUgaXRzIGNvbXByZWhlbnNpdmUgbmF0dXJlLCB0aGUgY29tcGxleGl0eSBvZiBVTUwgbWVhbnMgdGhhdCBwcm9qZWN0cyBtYXkgb25seSB1c2UgYSBzdWJzZXQgb2YgaXRzIGRpYWdyYW1zIGFuZCBmZWF0dXJlcywgdGFpbG9yZWQgdG8gdGhlaXIgc3BlY2lmaWMgbmVlZHMuCgpUaGlzIGxlc3NvbiBmb2N1c2VzIG9uIG9uZSBvZiB0aGUgZGlhZ3JhbXMgaW4gdGhlIFVNTDogQ2xhc3MgRGlhZ3JhbXMuIFRoZXkgYXJlIHVzZWQgZm9yIG1vZGVsaW5nIHN0cnVjdHVyZSwgc3BlY2lmaWNhbGx5IGRhdGEsIHNvIHRoZXkgYXJlIGlkZWFsIGZvciB2aXN1YWxseSBleHByZXNzaW5nIGEgY29uY2VwdHVhbCBkb21haW4gZGF0YSBtb2RlbC4KCiMjIFVNTCBDbGFzcyBEaWFncmFtcwoKVGhlIENsYXNzIERpYWdyYW0gaXMgb25lIG9mIHRoZSBtb3N0IHdpZGVseSB1c2VkIGRpYWdyYW1zIGluIHRoZSBtb2RlbGluZyBvZiBkb21haW5zLCBvbnRvbG9naWVzLCBhbmQgb2JqZWN0LW9yaWVudGVkIHN5c3RlbXMuIEl0IHNlcnZlcyBhcyBhIGNvcm5lcnN0b25lIGZvciBib3RoIHRoZSBzeXN0ZW0ncyBzdHJ1Y3R1cmUgYW5kIGl0cyBiZWhhdmlvciwgcHJvdmlkaW5nIGEgc3RhdGljIHZpZXcgb2YgYW4gYXBwbGljYXRpb24gb3IgYSBkb21haW4ncyBpbmZvcm1hdGlvbiBvYmplY3RzLiBBIFVNTCBDbGFzcyBEaWFncmFtIGRlc2NyaWJlcyB0aGUgdHlwZXMgb2Ygb2JqZWN0cyAoY2xhc3Nlcy9lbnRpdGllcy9jb25jZXB0cykgaW4gYSBkb21haW4gYW5kIHRoZSB2YXJpb3VzIGtpbmRzIG9mIHN0YXRpYyByZWxhdGlvbnNoaXBzIHRoYXQgZXhpc3QgYW1vbmcgdGhlbS4gSGVyZSdzIGFuIG92ZXJ2aWV3IG9mIGl0cyBrZXkgY29tcG9uZW50cyBhbmQgaG93IHRoZXkgYXJlIHVzZWQ6CgojIyMgQ2xhc3NlcwoKQSBjbGFzcyBpcyBkZXBpY3RlZCBhcyBhIHJlY3RhbmdsZSBkaXZpZGVkIGludG8gdGhyZWUgcGFydHM6IHRoZSB0b3AgcGFydCBjb250YWlucyB0aGUgY2xhc3MncyBuYW1lLCB0aGUgbWlkZGxlIHBhcnQgY29udGFpbnMgdGhlIGNsYXNzJ3MgYXR0cmlidXRlcywgYW5kIHRoZSBib3R0b20gcGFydCBsaXN0cyB0aGUgbWV0aG9kcyBvciBvcGVyYXRpb25zIHRoZSBjbGFzcyBjYW4gcGVyZm9ybS4gQ2xhc3NlcyByZXByZXNlbnQgdGhlIG1haW4gb2JqZWN0cyBhbmQgY29uY2VwdHMgaW4gYSBkb21haW4uIEZvciBvbnRvbG9neSBtb2RlbGluZywgbWV0aG9kcyBhcmUgb2Z0ZW4gb21pdHRlZCBhbmQgdGhlIHRoaXJkIGNvbXBhcnRtZW50IGlzIG9mdGVuIHVzZWQgZm9yIHRoZSBjbGFzcycgZ2xvc3NhcnkgZW50cnkgb3IgZGVzY3JpcHRpb24uCgojIyMgQXR0cmlidXRlcwoKQXR0cmlidXRlcywgc2hvd24gaW4gdGhlIHNlY29uZCBzZWN0aW9uIG9mIGEgY2xhc3MsIHJlcHJlc2VudCB0aGUgcHJvcGVydGllcywgY2hhcmFjdGVyaXN0aWNzLCBvciBkYXRhIHRoYXQgb2JqZWN0cyBvZiB0aGUgY2xhc3MgaG9sZC4gVGhleSBhcmUgdHlwaWNhbGx5IHZhcmlhYmxlcyBvciB0eXBlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzLgoKIyMjIE9wZXJhdGlvbnMKCk9wZXJhdGlvbnMsIGRldGFpbGVkIGluIHRoZSB0aGlyZCBzZWN0aW9uLCBhcmUgdGhlIGZ1bmN0aW9ucyBvciBtZXRob2RzIHRoZSBjbGFzcyBjYW4gZXhlY3V0ZS4gVGhlc2UgaW5jbHVkZSB0aGUgYmVoYXZpb3JzIHRoYXQgb2JqZWN0cyBvZiB0aGUgY2xhc3MgY2FuIHBlcmZvcm0uIEZvciBvbnRvbG9neSBtb2RlbGluZywgbWV0aG9kcyBhcmUgb2Z0ZW4gb21pdHRlZCBhbmQgdGhlIHRoaXJkIGNvbXBhcnRtZW50IGlzIG9mdGVuIHVzZWQgZm9yIHRoZSBjbGFzcycgZ2xvc3NhcnkgZW50cnkgb3IgZGVzY3JpcHRpb24uCgojIyMgUmVsYXRpb25zaGlwcwoKQ2xhc3MgZGlhZ3JhbXMgaW5jbHVkZSBzZXZlcmFsIHR5cGVzIG9mIHJlbGF0aW9uc2hpcHMgdG8gc2hvdyBob3cgY2xhc3NlcyBpbnRlcmFjdCB3aXRoIG9uZSBhbm90aGVyOgoKLSAgICoqQXNzb2NpYXRpb24qKjogVGhpcyByZXByZXNlbnRzIGEgZ2VuZXJhbCAndXNlcy1hJyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gb3IgbW9yZSBjbGFzc2VzLCBpbmRpY2F0aW5nIHRoYXQgaW5zdGFuY2VzIG9mIG9uZSBjbGFzcyBjb25uZWN0IHRvIGluc3RhbmNlcyBvZiBhbm90aGVyLiBUaGUgYXNzb2NpYXRpb24gY2FuIGJlIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwsIGRlcGljdGVkIHdpdGggYSBsaW5lIGNvbm5lY3RpbmcgdGhlIGNsYXNzZXMuCgotICAgKipBZ2dyZWdhdGlvbioqOiBBIHNwZWNpYWwgdHlwZSBvZiBhc3NvY2lhdGlvbiB0aGF0IHJlcHJlc2VudHMgYSAnaGFzLWEnIHJlbGF0aW9uc2hpcCBidXQgd2l0aCBhIHdob2xlL3BhcnQgZGlzdGluY3Rpb24sIHN1Z2dlc3RpbmcgdGhhdCBvbmUgY2xhc3MgaXMgYSBwYXJ0IG9mIGFub3RoZXIgYnV0IGNhbiBleGlzdCBpbmRlcGVuZGVudGx5LgoKLSAgICoqQ29tcG9zaXRpb24qKjogQSBzdHJvbmdlciBmb3JtIG9mIGFnZ3JlZ2F0aW9uIGltcGx5aW5nIGEgc3Ryb25nIGxpZmVjeWNsZSBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHdob2xlIGFuZCBpdHMgcGFydHMuIFdoZW4gdGhlIHdob2xlIGlzIGRlc3Ryb3llZCwgaXRzIHBhcnRzIGFyZSBhbHNvIGRlc3Ryb3llZC4KCi0gICAqKkluaGVyaXRhbmNlIChHZW5lcmFsaXphdGlvbikqKjogVGhpcyBkZXBpY3RzIGFuICdpcy1hJyByZWxhdGlvbnNoaXAsIGluZGljYXRpbmcgdGhhdCBvbmUgY2xhc3MgKHRoZSBzdWJjbGFzcykgaXMgYSBzcGVjaWFsaXplZCBmb3JtIG9mIGFub3RoZXIgY2xhc3MgKHRoZSBzdXBlcmNsYXNzKS4gSXQgaXMgc2hvd24gd2l0aCBhIGxpbmUgYW5kIGFuIGVtcHR5IGFycm93aGVhZCBwb2ludGluZyBmcm9tIHRoZSBzdWJjbGFzcyB0byB0aGUgc3VwZXJjbGFzcy4KCi0gICAqKkRlcGVuZGVuY3kqKjogQSByZWxhdGlvbnNoaXAgd2hlcmUgb25lIGNsYXNzIGRlcGVuZHMgb24gYW5vdGhlciBiZWNhdXNlIGl0IHVzZXMgaXQgYXQgc29tZSBwb2ludCBpbiB0aW1lLiBJdCdzIGEgd2Vha2VyIHJlbGF0aW9uc2hpcCB0aGFuIGFzc29jaWF0aW9uLCByZXByZXNlbnRlZCBieSBhIGRhc2hlZCBsaW5lLgoKLSAgICoqUmVhbGl6YXRpb24qKjogQSByZWxhdGlvbnNoaXAgd2hlcmUgYW4gaW50ZXJmYWNlIGNsYXNzIGlzIGltcGxlbWVudGVkIGJ5IGFub3RoZXIgY2xhc3MuIFRoZSBpbnRlcmZhY2UgY2xhc3MgZGVmaW5lcyBhIHNldCBvZiBvcGVyYXRpb25zIHRoYXQgdGhlIGltcGxlbWVudGluZyBjbGFzcyBtdXN0IHBlcmZvcm0uCgojIyMgTXVsdGlwbGljaXR5CgpNdWx0aXBsaWNpdHkgbm90YXRpb25zIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIG9mIG9uZSBjbGFzcyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIGluc3RhbmNlIG9mIGFub3RoZXIgY2xhc3MuIEZvciBleGFtcGxlLCAiMS4uXCoiIGluZGljYXRlcyB0aGF0IG9uZSBpbnN0YW5jZSBvZiB0aGUgZmlyc3QgY2xhc3MgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtYW55IGluc3RhbmNlcyBvZiB0aGUgc2Vjb25kIGNsYXNzLgoKIyMjIFZpc2liaWxpdHkKClZpc2liaWxpdHkgc3ltYm9scyAoc3VjaCBhcyArIGZvciBwdWJsaWMsIC0gZm9yIHByaXZhdGUsIGFuZCBcIyBmb3IgcHJvdGVjdGVkKSBjYW4gcHJlY2VkZSBhdHRyaWJ1dGUgYW5kIG9wZXJhdGlvbiBuYW1lcyB0byBpbmRpY2F0ZSB0aGVpciBhY2Nlc3NpYmlsaXR5LgoKIyMjIFVzZSBDYXNlcwoKQ2xhc3MgZGlhZ3JhbXMgYXJlIGZ1bmRhbWVudGFsIGluIG9iamVjdC1vcmllbnRlZCBkZXNpZ24gYW5kIGRldmVsb3BtZW50LCB1c2VkIGZvcjoKCi0gICBWaXN1YWxpemluZyB0aGUgb250b2xvZ3kgb2YgYSBidXNpbmVzcyBkb21haW4uCi0gICBWaXN1YWxpemluZyB0aGUgb2JqZWN0LW9yaWVudGVkIHN0cnVjdHVyZSBvZiBhIHN5c3RlbS4KLSAgIFBsYW5uaW5nIHRoZSBzeXN0ZW0gYmVmb3JlIGNvZGluZyBiZWdpbnMuCi0gICBEb2N1bWVudGluZyBjbGFzcyBhbmQgb2JqZWN0IGludGVyYWN0aW9ucyBpbiBhIHN5c3RlbS4KCkJ5IHByb3ZpZGluZyBhIGhpZ2gtbGV2ZWwgdmlldyBvZiBhIHN5c3RlbSBvciBvZiBhIGRvbWFpbiwgY2xhc3MgZGlhZ3JhbXMgaGVscCBkZXZlbG9wZXJzIGFuZCBkYXRhIGFyY2hpdGVjdHMgdW5kZXJzdGFuZCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUsIG1ha2luZyBpdCBlYXNpZXIgdG8gYnVpbGQgYW5kIG1haW50YWluIHRoZSBzeXN0ZW0gb3IgdG8gbWFuYWdlIGFuIG9udG9sb2d5LiBUaGV5IGFyZSBlc3NlbnRpYWwgdG9vbHMgaW4gdGhlIHNvZnR3YXJlIGFuZCBkYXRhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgcGFydGljdWxhcmx5IGR1cmluZyB0aGUgZGVzaWduIHBoYXNlLCB3aGVyZSB0aGV5IGd1aWRlIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3lzdGVtJ3MgZGF0YSBhcmNoaXRlY3R1cmUgb3IgYSBkb21haW4ncyBvbnRvbG9neS4KCiMjIERlZmluaW5nIE1vZGVsIFNjb3BlCgpBIGNvbmNlcHR1YWwgbW9kZWwgaXMgYSBtb2RlbCBvZiBhbGwgbmVjZXNzYXJ5IGNsYXNzZXMgYW5kIGF0dHJpYnV0ZXMgcGx1cyByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIG5lZWRlZCB0byBhZGRyZXNzIHRoZSBuZWVkcyBkZWZpbmVkIGluIHRoZSAidXNlIGNhc2VzIi4gU28sIGEgZGF0YSBhcmNoaXRlY3Qgb3Igc3lzdGVtIGRlc2lnbmVycyBuZWVkcyB0byBmaXJzdCBkZWZpbmUgdGhlIHVzZSBjYXNlcywgKmkuZS4qLCBob3cgdGhlIG1vZGVsIHdpbGwgc3VwcG9ydCB1c2VycyBhbmQgZGF0YSBuZWVkcy4gV2UgY29tbW9ubHkgdXNlIHRoZSAidXNlciBzdG9yeSIgZm9ybWF0IGZvciB0aGlzLCBmb3IgZXhhbXBsZToKCjEuICBBcyBhbiAqaW5zdHJ1Y3RvciosIEkgd2FudCB0byBwb3N0IGFuIGFzc2lnbm1lbnQuCjIuICBBcyBhbiAqaW5zdHJ1Y3RvciosIEkgd2FudCB0byBzZWUgd2hlbiB0aGUgc3R1ZGVudCBzdWJtaXR0ZWQgdGhlIGFzc2lnbm1lbnQuCjMuICBBcyBhICpzdHVkZW50KiwgSSB3YW50IHRvIHN1Ym1pdCBhIHNvbHV0aW9uIHRvIGFuIGFzc2lnbm1lbnQuCgpTbywgZnJvbSB0aGF0IHlvdSBjYW4gaWRlbnRpZnkgdGhlIG5lY2Vzc2FyeSBjbGFzc2VzLCBhdHRyaWJ1dGVzLCBhbmQgcmVsYXRpb25zaGlwczoKCi0gICBJbnN0cnVjdG9yCi0gICBBc3NpZ25tZW50Ci0gICBTdWJtaXNzaW9uICh3aXRoIGRhdGUpCi0gICBTb2x1dGlvbgotICAgU3R1ZGVudAoKV2l0aG91dCB0aGUgdXNlIGNhc2VzLCB0aGVyZSBpcyBubyBzY29wZSBib3VuZGFyeSBhbmQgaXQgaXMgbm90IG9idmlvdXMgdG8gdGVsbCB3aGVuIG1vZGVsaW5nIHNob3VsZCBzdG9wLgoKIyMgTGVjdHVyZXMKClVNTCBDbGFzcyBEaWFncmFtcyBhcmUgYW4gYWx0ZXJuYXRpdmUgdmlzdWFsIG5vdGF0aW9uIHRvIEVSIERpYWdyYW1zLiBUaGV5IGFyZSBjb21tb25seSB1c2VkIGZvciBjb25jZXB0dWFsIGRhdGEgbW9kZWxpbmcgYW5kIG9udG9sb2d5IGRlc2lnbi4gVGhlIENsYXNzIERpYWdyYW0gaXMgb25lIG9mIHRoZSAxMiBkaWFncmFtcyBvZiB0aGUgVW5pZmllZCBNb2RlbGluZyBMYW5ndWFnZS4gSXQgaXMgYSBkaWFncmFtIHVzZWQgdG8gc2hvdyB0aGUgY2xhc3NlcyAob3IgZW50aXRpZXMpIGluIGEgc3lzdGVtIG9yIGRvbWFpbi4gVGhlIHR3byBsZWN0dXJlcyBiZWxvdyBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIHRoZSBwdXJwb3NlIG9mIGNvbmNlcHR1YWwgbW9kZWxpbmcgYW5kIGhvdyB0byBjb25zdHJ1Y3QgYSBjb25jZXB0dWFsIG1vZGVsIGluIGEgVU1MIENsYXNzIERpYWdyYW0uCgo8aWZyYW1lIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjNDY0NjQ2OyIgc3JjPSJodHRwczovL25vcnRoZWFzdGVybi5ob3N0ZWQucGFub3B0by5jb20vUGFub3B0by9QYWdlcy9FbWJlZC5hc3B4P2lkPTljODQ4YTY4LTE4OTctNDEwNi1hMmE4LWFiZTMwMTUwNjI2NiZhbXA7YXV0b3BsYXk9ZmFsc2UmYW1wO29mZmVydmlld2VyPXRydWUmYW1wO3Nob3d0aXRsZT1mYWxzZSZhbXA7c2hvd2JyYW5kPWZhbHNlJmFtcDtzdGFydD0wJmFtcDtpbnRlcmFjdGl2aXR5PWFsbCIgd2lkdGg9IjU2MCIgaGVpZ2h0PSIzMTUiIGFsbG93ZnVsbHNjcmVlbj0iYWxsb3dmdWxsc2NyZWVuIiBhbGxvdz0iYXV0b3BsYXkiIGRhdGEtZXh0ZXJuYWw9IjEiPgoKPC9pZnJhbWU+Cgo8aWZyYW1lIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjNDY0NjQ2OyIgc3JjPSJodHRwczovL25vcnRoZWFzdGVybi5ob3N0ZWQucGFub3B0by5jb20vUGFub3B0by9QYWdlcy9FbWJlZC5hc3B4P2lkPTViZTU4YTdiLTE4NmYtNDBkMy04MzUxLWFiZTMwMTUwNmM5YSZhbXA7YXV0b3BsYXk9ZmFsc2UmYW1wO29mZmVydmlld2VyPXRydWUmYW1wO3Nob3d0aXRsZT1mYWxzZSZhbXA7c2hvd2JyYW5kPWZhbHNlJmFtcDtzdGFydD0wJmFtcDtpbnRlcmFjdGl2aXR5PWFsbCIgd2lkdGg9IjU2MCIgaGVpZ2h0PSIzMTUiIGFsbG93ZnVsbHNjcmVlbj0iYWxsb3dmdWxsc2NyZWVuIiBhbGxvdz0iYXV0b3BsYXkiIGRhdGEtZXh0ZXJuYWw9IjEiPgoKPC9pZnJhbWU+CgojIyBTdW1tYXJ5IHsjY29uY2x9CgpJbiB0aGlzIGxlc3Nvbiwgd2UgY292ZXJlZCBzZXZlcmFsIHRvcGljcyByZWxhdGVkIHRvIHZpc3VhbCBtb2RlbGluZyBvZiBvYmplY3Qtb3JpZW50ZWQgc3lzdGVtcyBhbmQgZG9tYWluIG9udG9sb2dpZXM6CgoxLiAgKipDb25jZXB0dWFsIERvbWFpbiBNb2RlbGluZyoqOiBXZSBkaXNjdXNzZWQgd2hhdCBjb25jZXB0dWFsIGRvbWFpbiBtb2RlbGluZyBpcywgaGlnaGxpZ2h0aW5nIGl0cyBmb2N1cyBvbiBpZGVudGlmeWluZyBrZXkgY29uY2VwdHMgYW5kIHJlbGF0aW9uc2hpcHMgd2l0aGluIGEgc3BlY2lmaWMgZG9tYWluIG9mIGludGVyZXN0LiBUaGlzIHByb2Nlc3MgYWltcyB0byBjcmVhdGUgYSBoaWdoLWxldmVsIHJlcHJlc2VudGF0aW9uIG9mIGluZm9ybWF0aW9uIHRvIGJlIG1hbmFnZWQgYnkgYSBzeXN0ZW0gb3IgZGF0YWJhc2UsIGVtcGhhc2l6aW5nIHRoZSBpbXBvcnRhbmNlIG9mIGFic3RyYWN0aW9uIGFuZCBzZXJ2aW5nIGFzIGEgZm91bmRhdGlvbiBmb3IgZnVydGhlciBzeXN0ZW0gYW5kIGRhdGEgYXJjaGl0ZWN0dXJlIGRldmVsb3BtZW50IGFjdGl2aXRpZXMuCgoyLiAgKipEaWZmZXJlbmNlcyBCZXR3ZWVuIENvbmNlcHR1YWwgYW5kIExvZ2ljYWwgRGF0YSBNb2RlbGluZyoqOiBXZSBleHBsb3JlZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb25jZXB0dWFsIG1vZGVsaW5nIGFuZCBsb2dpY2FsIGRhdGEgbW9kZWxpbmcuIENvbmNlcHR1YWwgbW9kZWxpbmcgb3BlcmF0ZXMgYXQgYSBoaWdoZXIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sIGZvY3VzaW5nIG9uIHRoZSBicm9hZCBzdHJ1Y3R1cmUgb2YgdGhlIGRvbWFpbiBhbmQgaXRzIGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzIHdpdGhvdXQgZGVsdmluZyBpbnRvIHRlY2huaWNhbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJbiBjb250cmFzdCwgbG9naWNhbCBkYXRhIG1vZGVsaW5nIHByb3ZpZGVzIGEgbW9yZSBkZXRhaWxlZCBibHVlcHJpbnQgdGhhdCBzcGVjaWZpZXMgdGFibGVzLCBjb2x1bW5zLCBkYXRhIHR5cGVzLCBhbmQgY29uc3RyYWludHMsIHByZXBhcmluZyBmb3IgdGhlIHBoeXNpY2FsIGRhdGFiYXNlIGRlc2lnbi4KCjMuICAqKlVuaWZpZWQgTW9kZWxpbmcgTGFuZ3VhZ2UgKFVNTCkqKjogQW4gb3ZlcnZpZXcgb2YgVU1MIHdhcyBwcm92aWRlZCwgb3V0bGluaW5nIGl0cyBwdXJwb3NlIGFzIGEgc3RhbmRhcmRpemVkIG1vZGVsaW5nIGxhbmd1YWdlIHRvIHNwZWNpZnksIHZpc3VhbGl6ZSwgY29uc3RydWN0LCBhbmQgZG9jdW1lbnQgdGhlIGFydGlmYWN0cyBvZiBib3RoIHNvZnR3YXJlIGFuZCBub24tc29mdHdhcmUgc3lzdGVtcy4gV2UgZGlzY3Vzc2VkIHRoZSB0d28gbWFpbiB0eXBlcyBvZiBVTUwgZGlhZ3JhbXPigJRzdHJ1Y3R1cmUgZGlhZ3JhbXMgYW5kIGJlaGF2aW9yIGRpYWdyYW1z4oCUYW5kIHRoZWlyIHJvbGVzIGluIHZpc3VhbGl6aW5nIGRpZmZlcmVudCBhc3BlY3RzIG9mIGEgc3lzdGVtLgoKNC4gICoqVU1MIENsYXNzIERpYWdyYW0gT3ZlcnZpZXcqKjogRmluYWxseSwgd2UgZGVsdmVkIGludG8gdGhlIHNwZWNpZmljcyBvZiB0aGUgVU1MIENsYXNzIERpYWdyYW0sIG9uZSBvZiB0aGUgbW9zdCBmdW5kYW1lbnRhbCBkaWFncmFtcyBpbiBVTUwgZm9yIG9iamVjdC1vcmllbnRlZCBkZXNpZ24sIGNvbmNlcHR1YWwgZGF0YSBtb2RlbGluZywgYW5kIG9udG9sb2d5IHZpc3VhbGl6YXRpb24uIFdlIGNvdmVyZWQgaXRzIGtleSBjb21wb25lbnRzLCBpbmNsdWRpbmcgY2xhc3NlcywgYXR0cmlidXRlcywgb3BlcmF0aW9ucywgYW5kIHZhcmlvdXMgdHlwZXMgb2YgcmVsYXRpb25zaGlwcyAoYXNzb2NpYXRpb24sIGFnZ3JlZ2F0aW9uLCBjb21wb3NpdGlvbiwgaW5oZXJpdGFuY2UsIGRlcGVuZGVuY3ksIHJlYWxpemF0aW9uKSwgYXMgd2VsbCBhcyBtdWx0aXBsaWNpdHkgYW5kIHZpc2liaWxpdHkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEZpbGVzICYgUmVzb3VyY2VzCgpgYGB7ciB6aXBGaWxlcywgZWNobz1GQUxTRX0KemlwTmFtZSA9IHNwcmludGYoIkxlc3NvbkZpbGVzLSVzLSVzLnppcCIsIAogICAgICAgICAgICAgICAgIHBhcmFtcyRjYXRlZ29yeSwKICAgICAgICAgICAgICAgICBwYXJhbXMkbnVtYmVyKQoKdGV4dEFMaW5rID0gcGFzdGUwKCJBbGwgRmlsZXMgZm9yIExlc3NvbiAiLCAKICAgICAgICAgICAgICAgcGFyYW1zJGNhdGVnb3J5LCIuIixwYXJhbXMkbnVtYmVyKQoKIyBkb3dubG9hZEZpbGVzTGluaygpIGlzIGluY2x1ZGVkIGZyb20gX2luc2VydDJEQi5SCmtuaXRyOjpyYXdfaHRtbChkb3dubG9hZEZpbGVzTGluaygiLiIsIHppcE5hbWUsIHRleHRBTGluaykpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBSZWZlcmVuY2VzCgpOb25lLgoKIyMgRXJyYXRhCgpbTGV0IHVzIGtub3ddKGh0dHBzOi8vZm9ybS5qb3Rmb3JtLmNvbS8yMTIxODcwNzI3ODQxNTcpe3RhcmdldD0iX2JsYW5rIn0uCg==