From 5d8bec593b86bceee8aeef2042f5a1ec079f2c67 Mon Sep 17 00:00:00 2001 From: JvD_Ericsson Date: Wed, 14 Aug 2024 10:29:29 +0100 Subject: [PATCH] teiv, pgsql-schema-generator: add indexing to tables Add indexing to the tables Issue-ID: SMO-????? Change-Id: I403b577af68f6255cc7e53c5464248fb286d42f1 Signed-off-by: JvD_Ericsson --- docs/pgsql-schema-generator-guide.rst | 173 +++++-- pgsql-schema-generator/README.md | 135 +++-- .../oran/smo/teiv/pgsqlgenerator/Attribute.java | 3 + .../org/oran/smo/teiv/pgsqlgenerator/Column.java | 2 + .../oran/smo/teiv/pgsqlgenerator/Constants.java | 7 +- .../oran/smo/teiv/pgsqlgenerator/ConsumerData.java | 5 + .../org/oran/smo/teiv/pgsqlgenerator/Entity.java | 23 +- .../oran/smo/teiv/pgsqlgenerator/IndexType.java | 34 ++ .../org/oran/smo/teiv/pgsqlgenerator/Module.java | 12 +- .../smo/teiv/pgsqlgenerator/PostgresIndex.java | 33 ++ .../oran/smo/teiv/pgsqlgenerator/Processor.java | 6 +- .../oran/smo/teiv/pgsqlgenerator/Relationship.java | 61 ++- .../teiv/pgsqlgenerator/YangModelProcessor.java | 74 ++- .../oran/smo/teiv/pgsqlgenerator/YangParser.java | 30 +- .../RelationshipGraphGenerator.java | 2 +- .../schema/BackwardCompatibilityChecker.java | 39 ++ .../teiv/pgsqlgenerator/schema/SchemaParser.java | 44 +- .../consumerdata/ConsumerDataSchemaGenerator.java | 75 +++ .../schema/data/DataSchemaGenerator.java | 21 +- .../schema/data/DataSchemaHelper.java | 57 ++- .../schema/data/ModelComparator.java | 47 +- .../pgsqlgenerator/schema/data/TableBuilder.java | 112 ++-- .../schema/model/HashInfoDataGenerator.java | 4 +- .../schema/model/ModelSchemaGenerator.java | 9 +- .../src/main/resources/application.yaml | 4 + .../scripts/00_init-oran-smo-teiv-data.sql | 1 + .../scripts/01_init-oran-smo-teiv-model.sql | 42 +- .../02_init-oran-smo-teiv-consumer-data.sql | 53 ++ .../oran/smo/teiv/pgsqlgenerator/EndToEndTest.java | 43 +- .../oran/smo/teiv/pgsqlgenerator/TestHelper.java | 16 +- .../smo/teiv/pgsqlgenerator/YangParserTest.java | 8 +- .../schema/BackwardCompatibilityCheckerTest.java | 184 +++++-- .../pgsqlgenerator/schema/SchemaParserTest.java | 62 +-- .../schema/data/GreenFieldInstallationTest.java | 12 +- .../schema/data/ModelComparatorTest.java | 16 +- .../schema/data/TableBuilderTest.java | 566 ++++++++++---------- .../entities/mock_00_init-oran-smo-teiv-data.sql | 4 +- .../manyToMany/mock_00_init-oran-smo-teiv-data.sql | 10 +- .../manyToOne/mock_00_init-oran-smo-teiv-data.sql | 8 +- .../oneToMany/mock_00_init-oran-smo-teiv-data.sql | 8 +- .../oneToOne/mock_00_init-oran-smo-teiv-data.sql | 10 +- .../mock_00_init-oran-smo-teiv-data.sql | 8 +- .../model/mock_01_init-oran-smo-teiv-model.sql | 62 +-- .../src/test/resources/application.yaml | 5 + .../baseline-schema/00_init-oran-smo-teiv-data.sql | 122 +++-- .../01_init-oran-smo-teiv-model.sql | 162 +++--- .../02_init-oran-smo-teiv-consumer-data.sql | 53 ++ .../result_00_init-oran-smo-teiv-data.sql | 569 ++++++++++++--------- .../result_01_init-oran-smo-teiv-model.sql | 294 ++++++----- .../result_02_init-oran-smo-teiv-consumer-data.sql | 53 ++ .../o-ran-smo-teiv-common-yang-extensions.yang | 97 ++-- .../o-ran-smo-teiv-common-yang-types.yang | 76 +-- .../o-ran-smo-teiv-equipment.yang | 85 ++- .../generate-defaults/o-ran-smo-teiv-ran.yang | 306 +++-------- .../o-ran-smo-teiv-rel-equipment-ran.yang | 4 +- .../generate-defaults/test-built-in-module.yang | 153 ++++++ 56 files changed, 2582 insertions(+), 1522 deletions(-) create mode 100644 pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java create mode 100644 pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java create mode 100644 pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java create mode 100644 pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql create mode 100644 pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql create mode 100644 pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql create mode 100644 pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang diff --git a/docs/pgsql-schema-generator-guide.rst b/docs/pgsql-schema-generator-guide.rst index 56b6697..d833874 100644 --- a/docs/pgsql-schema-generator-guide.rst +++ b/docs/pgsql-schema-generator-guide.rst @@ -58,8 +58,6 @@ A module is constructed with the following details: - domain: domain of the module. Identified with the help of the statement 'domain' from the module 'o-ran-smo-teiv-common-yang-extensions' - revision: module revision. - content: content of the module. -- ownerAppId: set to 'BUILT_IN_MODULE' for all modules. -- status: set to 'IN_USAGE' for all modules. - availableListElements: set to all the list elements defined in the module. Identified with the help of the statement with 'list' as the yang DOM element name. - availableEntities: Initially constructed as empty list. This will be populated later with all the entities defined in the module. - availableRelations: set to the list of all relationship names defined in the module. Identified with the help of the statement name 'or-teiv-yext:biDirectionalTopologyRelationship' @@ -73,6 +71,8 @@ Entity types are identified from the yang. An entity type is constructed with the following details: - entityName: name of the entity. +- storedAt: where the entity information is stored i.e., table name. The table name is generated as + '_'. - moduleReferenceName: module to which the entity belongs. Identified by checking which of the identified modules has: - the same namespace as the entity, and @@ -143,6 +143,8 @@ A relationship type is constructed with the following information: - B_SIDE - RELATION +- storedAt: table name where the relationship instances is stored. The logic for determining the table name relies on the cardinality of the relationship. + +--------------------------------------------------+----------------------------+ | Case | Relationship instance info | +==================================================+============================+ @@ -158,12 +160,12 @@ A relationship type is constructed with the following information: - moduleReferenceName: module to which the relationship belongs. The relationship module is identified by identifying the module that contains the relationship name in the availableRelations list. - consumerData: sourceIds, classifiers, decorators. +- aSideStoredAt: table name where aSide entity type instances are stored. +- bSideStoredAt: table name where bSide entity type instances are stored. Indexing Support ---------------- -**Note:** This feature is currently **NOT** supported - Indexing is supported for the identified column's based on the column's data type. Currently, we support indexing on JSONB columns. @@ -171,6 +173,8 @@ Currently, we support indexing on JSONB columns. - GIN Index: used for columns storing object, eg, decorators. - GIN TRIGRAM Index: used for columns storing list of entries, eg, classifiers, sourceIds. +Refer IndexType.java "src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/IndexType.java" for types of index supported. + PG SQL Schema Generation ======================== @@ -308,40 +312,6 @@ Sample entries: | | | | to avoid data loss / corruption. | +-----------------+-----------------------+------------------------------------------------+ -**decorators:** There will be the ability for Administrators to decorate topology entities and relationships. We will be storing the schemas for the decorators in this table. - -+------------------------------------------+--------------------------+-----------------------------------+ -| Column name | Type | Description | -+==========================================+==========================+===================================+ -| name | VARCHAR(511) PRIMARY KEY | The key of the decorator. | -+------------------------------------------+--------------------------+-----------------------------------+ -| dataType | VARCHAR(511) | | The data type of the decorator, | -| | | | needed for parsing. | -+------------------------------------------+--------------------------+-----------------------------------+ -| moduleReferenceName | VARCHAR(511) | | References the corresponding | -| | | | module reference the decorator | -| | | | belongs to. | -+------------------------------------------+--------------------------+-----------------------------------+ -| | FOREIGN KEY ("moduleReferenceName") | FOREIGN KEY | Foreign key constraint | -| | REFERENCES ties_model.module_reference | | | -| | ("name") ON DELETE CASCADE | | | -+------------------------------------------+--------------------------+-----------------------------------+ - -**classifier:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to topology entities and relationships. We will be storing the schemas for the classifiers in this table. - -+------------------------------------------+--------------------------+-----------------------------------------+ -| Column name | Type | Description | -+==========================================+==========================+=========================================+ -| name | VARCHAR(511) PRIMARY KEY | The actual classifier. | -+------------------------------------------+--------------------------+-----------------------------------------+ -| moduleReferenceName | VARCHAR(511) | | References the corresponding module | -| | | | reference the classifier belongs to. | -+------------------------------------------+--------------------------+-----------------------------------------+ -| | FOREIGN KEY ("moduleReferenceName") | FOREIGN KEY | Foreign key constraint | -| | REFERENCES ties_model.module_reference | | | -| | ("name") ON DELETE CASCADE | | | -+------------------------------------------+--------------------------+-----------------------------------------+ - **entity_info:** For the entity info generation SQL entries are created and stored which will be used for execution to populate entity_info table. +------------------------------------------+------------------+-----------------------------------------+ @@ -409,6 +379,133 @@ Along with this, it ensures that the structure for the model schema SQL file sta Finally, these generated entries and structure are then used to modify the model SQL file. +Consumer Data Schema +^^^^^^^^^^^^^^^^^^^^ + +Before classifying entities or relationships, a schema must be created and validated. +It can be created, by using its own endpoint, with a Yang Module. +The user must provide a unique module name, to avoid collision of multiple users access that are defining classifiers and decorators. +The schema cannot be modified later on but only deleted and recreated, if needed. +When a schema is successfully created and validated, the user can add the classifiers to the entities or relationships. + +Classifiers +""""""""""" + +Classifiers support the following two types of 'operation', which must be identified in the body of the request: +- merge: defined classifiers can be applied to entities and relationships within a single request. +- delete: existing tagged classifiers can be removed. + +**Example:** +In this example, user is classifying two given entity IDs and a single relationship ID with a single request. + +.. code-block:: json + + { + "operation": "merge", + "classifiers": [ + "module-x:Outdoor", + "module-y:Rural", + "module-z:Weekend" + ], + "entityIds": [ + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + ] + } + +Decorators +"""""""""" + +Decorators support the following two types of 'operations', which must be identified in the body of the request: +- merge: existing decorators can be updated or applied to entities and relationships within a single request. +- delete: existing tagged decorators can be removed. + +**Example:** +In this example, user is tagging decorators with two given entity IDs and a single relationship ID with a single request. + +.. code-block:: json + + { + "operation": "merge", + "decorators": { + "module-x:location": "Stockholm", + "module-y:vendor": "Ericsson" + }, + "entityIds": [ + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + ] + } + +The SQL entries for consumer data include +- **module_reference:** For the consumer module reference related module names from provided classifiers or decorators retrieved from the model service are extracted and stored which will be used for execution to module_reference table. + ++-------------+-----------------------+-----------------------------------------------------------------+ +| Column name | Type | Description | ++=============+=======================+=================================================================+ +| name | TEXT PRIMARY KEY | The module name | ++-------------+-----------------------+-----------------------------------------------------------------+ +| namespace | TEXT | The namespace the module is located | ++-------------+-----------------------+-----------------------------------------------------------------+ +| revision | TEXT NOT NULL | The revision date of the file | ++-------------+-----------------------+-----------------------------------------------------------------+ +| content | TEXT NOT NULL | The base64 encoded format of the corresponding schema. | ++-------------+-----------------------+-----------------------------------------------------------------+ +| ownerAppId | VARCHAR(511) NOT NULL | The identity of the owner App. | ++-------------+-----------------------+-----------------------------------------------------------------+ +| status | VARCHAR(127) NOT NULL | | Current status of the consumer module reference to track | +| | | | during the pod's life cycle. Needed to avoid data | +| | | | loss / corruption. | ++-------------+-----------------------+-----------------------------------------------------------------+ + +**decorators:** There will be the ability for Administrators to decorate topology entities and relationships. We will be storing the schemas for the decorators in this table. + ++--------------------------------------------------+------------------+-----------------------------------+ +| Column name | Type | Description | ++==================================================+==================+===================================+ +| name | TEXT PRIMARY KEY | The key of the decorator. | ++--------------------------------------------------+------------------+-----------------------------------+ +| dataType | VARCHAR(511) | | The data type of the decorator, | +| | | | needed for parsing. | ++--------------------------------------------------+------------------+-----------------------------------+ +| moduleReferenceName | TEXT | | References the corresponding | +| | | | module reference the decorator | +| | | | belongs to. | ++--------------------------------------------------+------------------+-----------------------------------+ +| | FOREIGN KEY ("moduleReferenceName") REFERENCES | FOREIGN KEY | Foreign key constraint | +| | ties_consumer_data.module_reference ("name") | | | +| | ON DELETE CASCADE | | | ++--------------------------------------------------+------------------+-----------------------------------+ + +**classifier:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to topology entities and relationships. We will be storing the schemas for the classifiers in this table. + ++--------------------------------------------------+------------------+-----------------------------------+ +| Column name | Type | Description | ++==================================================+==================+===================================+ +| name | TEXT PRIMARY KEY | The key of the classifier. | ++--------------------------------------------------+------------------+-----------------------------------+ +| moduleReferenceName | TEXT | | References the corresponding | +| | | | module reference the classifier | +| | | | belongs to. | ++--------------------------------------------------+------------------+-----------------------------------+ +| | FOREIGN KEY ("moduleReferenceName") REFERENCES | FOREIGN KEY | Foreign key constraint | +| | ties_consumer_data.module_reference ("name") | | | +| | ON DELETE CASCADE | | | ++--------------------------------------------------+------------------+-----------------------------------+ + +How to use classifiers and decorators +""""""""""""""""""""""""""""""""""""" + +1. Create a schema with the /schemas endpoint using Yang Module. After a successful schema creation, the topology objects are ready to be classified. +2. Assign classifiers and/or decorators to the entities and/or relationships. +3. Search classifiers and/or decorators by using queries. + Skeleton Data and Model SQL Files ================================= diff --git a/pgsql-schema-generator/README.md b/pgsql-schema-generator/README.md index 90085f6..b9d211e 100644 --- a/pgsql-schema-generator/README.md +++ b/pgsql-schema-generator/README.md @@ -50,8 +50,6 @@ A module is constructed with the following details: 'o-ran-smo-teiv-common-yang-extensions' - revision: module revision. - content: content of the module. -- ownerAppId: set to 'BUILT_IN_MODULE' for all modules. -- status: set to 'IN_USAGE' for all modules. - availableListElements: set to all the list elements defined in the module. Identified with the help of the statement with 'list' as the yang DOM element name. - availableEntities: Initially constructed as empty list. This will be populated later with all the entities defined in @@ -66,6 +64,8 @@ Entity types are identified from the yang. An entity type is constructed with the following details: - entityName: name of the entity. +- storedAt: where the entity information is stored i.e., table name. The table name is generated as + '_'. - moduleReferenceName: module to which the entity belongs. Identified by checking which of the identified modules has - the same namespace as the entity, and - the availableListElements contains the entity name @@ -123,28 +123,32 @@ following: - A_SIDE - B_SIDE - RELATION +- storedAt: table name where the relationship instances is stored. The logic for determining the table name relies on +the cardinality of the relationship. - | Case | Relationship instance info | - |--------------------------------------------------------------------|----------------------------| - | 1:1 | aSide | - | 1:N / N:1 | N-side | - | N:M | relation table | - | Relations connecting same Entity Types 1 : 1 (or) 1 : n (or) m : n | relation table | + | Case | Relationship instance info and reference stored at? | + |--------------------------------------------------------------------|-----------------------------------------------------| + | 1:1 | aSide | + | 1:N / N:1 | N-side | + | N:M | relation table (_) | + | Relations connecting same Entity Types 1 : 1 (or) 1 : n (or) m : n | relation table (_) | - moduleReferenceName: module to which the relationship belongs. The relationship module is identified by identifying the module that contains the relationship name in the availableRelations list. - consumerData: sourceIds, classifiers, decorators. +- aSideStoredAt: table name where aSide entity type instances are stored. +- bSideStoredAt: table name where bSide entity type instances are stored. #### Indexing Support -**Note:** This feature is currently **NOT** supported - Indexing is supported for the identified column's based on the column's data type. Currently, we support indexing on JSONB columns. - GIN Index: used for columns storing object, eg, decorators. - GIN TRIGRAM Index: used for columns storing list of entries, eg, classifiers, sourceIds. +Refer [IndexType.java](src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java) for types of index supported. + ### PG SQL Schema Generation #### Data schema @@ -264,34 +268,13 @@ algorithm and used. _hash_info_ tables holds the name, hashedValue and the type | includedModules | jsonb | aSideMO's and bSideMO's module reference name stored within the Module | | revision | TEXT NOT NULL | The revision date of the file | | content | TEXT NOT NULL | The base64 encoded format of the corresponding schema. | - | ownerAppId | VARCHAR(511) NOT NULL | The identity of the owner App. | - | status | VARCHAR(127) NOT NULL | Current status of the module reference to track during the pod's life cycle. Needed to avoid data loss / corruption. | - -- **decorators:** There will be the ability for Administrators to decorate topology entities and relationships. - We will be storing the schemas for the decorators in this table. - - | Column name | Type | Description | - |-------------------------------------------------------------------------------------------------------|--------------------------|-------------------------------------------------------------------------| - | name | VARCHAR(511) PRIMARY KEY | The key of the decorator. | - | dataType | VARCHAR(511) | The data type of the decorator, needed for parsing. | - | moduleReferenceName | VARCHAR(511) | References the corresponding module reference the decorator belongs to. | - | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | - -- **classifier:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to - topology entities and relationships. - We will be storing the schemas for the classifiers in this table. - - | Column name | Type | Description | - |-------------------------------------------------------------------------------------------------------|--------------------------|--------------------------------------------------------------------------| - | name | VARCHAR(511) PRIMARY KEY | The actual classifier. | - | moduleReferenceName | VARCHAR(511) | References the corresponding module reference the classifier belongs to. | - | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | - **entity_info:** For the entity info generation SQL entries are created and stored which will be used for execution to populate entity_info table. | Column name | Type | Description | |-------------------------------------------------------------------------------------------------------|------------------|-------------------------------------------------------------| + | storedAt | TEXT PRIMARY KEY | Un-hashed table name where entity type instances are stored | | name | TEXT NOT NULL | The entity type name | | moduleReferenceName | TEXT NOT NULL | A reference to an associated module | | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | @@ -315,6 +298,7 @@ populate entity_info table. | bSideMaxCardinality | BIGINT NOT NULL | The maximum cardinality of the B-side of the relationship | | associationKind | TEXT NOT NULL | The kind of association between entities | | relationshipDataLocation | TEXT NOT NULL | Indicates where associated relationship data is stored | + | storedAt | TEXT NOT NULL | The un-hashed table name where relation instance information is stored | | connectSameEntity | BOOLEAN NOT NULL | Indicates whether the relationship connects the same entity | | moduleReferenceName | TEXT PRIMARY KEY | The name of the module reference associated with the relationship | | FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | @@ -326,6 +310,93 @@ the correct structure by importing the baseline schema information. Finally, These generated entries and structure are then used to modify the model SQL file. +#### Consumer Data Schema +Before classifying entities or relationships, a schema must be created and validated. +It can be created, by using its own endpoint, with a Yang Module. +The user must provide a unique module name, to avoid collision of multiple users access that are defining classifiers and decorators. +The schema cannot be modified later on but only deleted and recreated, if needed. +When a schema is successfully created and validated, the user can add the classifiers to the entities or relationships. + +##### Classifiers +Classifiers support the following two types of 'operation', which must be identified in the body of the request: +- merge: defined classifiers can be applied to entities and relationships within a single request. +- delete: existing tagged classifiers can be removed. + **Example:** + In this example, user is classifying two given entity IDs and a single relationship ID with a single request. +``` +{ + "operation": "merge", + "classifiers": [ + "module-x:Outdoor", + "module-y:Rural", + "module-z:Weekend" + ], + "entityIds": [ + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + ] +} +``` +##### Decorators +Decorators support the following two types of 'operations', which must be identified in the body of the request: +- merge: existing decorators can be updated or applied to entities and relationships within a single request. +- delete: existing tagged decorators can be removed. + **Example:** + In this example, user is tagging decorators with two given entity IDs and a single relationship ID with a single request. +``` + "operation": "merge", + "decorators": { + "module-x:location": "Stockholm", + "module-y:vendor": "Ericsson" + }, + "entityIds": [ + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", + "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + ] +} +``` +The SQL entries for consumer data include +- **module_reference:** For the consumer module reference related module names from provided classifiers or decorators + retrieved from the model service are extracted and stored which will be used for + execution to module_reference table. + | Column name | Type | Description | + |-------------|-----------------------|-------------------------------------------------------------------------------------------------------------------------------| + | name | TEXT PRIMARY KEY | The module name | + | namespace | TEXT | The namespace the module is located | + | revision | TEXT NOT NULL | The revision date of the file | + | content | TEXT NOT NULL | The base64 encoded format of the corresponding schema. | + | ownerAppId | VARCHAR(511) NOT NULL | The identity of the owner App. | + | status | VARCHAR(127) NOT NULL | Current status of the consumer module reference to track during the pod's life cycle. Needed to avoid data loss / corruption. | + +- **decorators:** There will be the ability for Administrators to decorate topology entities and relationships. + We will be storing the schemas for the decorators in this table. + | Column name | Type | Description | + |---------------------------------------------------------------------------------------------------------------|------------------|----------------------------------------------------------------------------------| + | name | TEXT PRIMARY KEY | The key of the decorator. | + | dataType | VARCHAR(511) | The data type of the decorator, needed for parsing. | + | moduleReferenceName | TEXT | References the corresponding consumer module reference the decorator belongs to. | + | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + +- **classifiers:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to + topology entities and relationships. + We will be storing the schemas for the classifiers in this table. + | Column name | Type | Description | + |---------------------------------------------------------------------------------------------------------------|------------------|-----------------------------------------------------------------------------------| + | name | TEXT PRIMARY KEY | The actual classifier. | + | moduleReferenceName | TEXT | References the corresponding consumer module reference the classifier belongs to. | + | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + +##### How to use classifiers and decorators +1. Create a schema with the /schemas endpoint using Yang Module. After a successful schema creation, the topology objects are ready to be classified. +2. Assign classifiers and/or decorators to the entities and/or relationships. +3. Search classifiers and/or decorators by using queries. + ### Skeleton Data and Model SQL Files - [00_init-oran-smo-teiv-data.sql](src/main/resources/scripts/00_init-oran-smo-teiv-data.sql) diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java index 20280a5..72ce40b 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java @@ -25,6 +25,7 @@ import java.util.List; import lombok.Builder; import lombok.Getter; +import lombok.Singular; @Getter @Builder @@ -34,4 +35,6 @@ public class Attribute { @Builder.Default private Collection constraints = List.of(); private String defaultValue; + @Singular + private List indexTypes; } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java index ff74f67..14c9c8a 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java @@ -34,4 +34,6 @@ public class Column { @Builder.Default private Collection postgresConstraints = List.of(); private String defaultValue; + @Builder.Default + private List postgresIndexList = List.of(); } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java index ab0c590..b0678fd 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java @@ -24,7 +24,6 @@ import lombok.experimental.UtilityClass; @UtilityClass public class Constants { - public static final String NO_PREFIX = ""; public static final String CONSUMER_DATA = "CD_"; public static final String SOURCE_IDS = "sourceIds"; @@ -33,15 +32,14 @@ public class Constants { public static final String REL_CD = "REL_CD_"; public static final String FOREIGN_KEY = "FK_"; public static final String PRIMARY_KEY = "PK_"; - public static final String NOT_NULL = "NOT_NULL_"; public static final String UNIQUE = "UNIQUE_"; + public static final String INDEX_PREFIX = "IDX_"; public static final String A_SIDE_PREFIX = "aSide_"; public static final String B_SIDE_PREFIX = "bSide_"; public static final String ID = "id"; public static final String COLUMN = "COLUMN"; public static final String TABLE = "TABLE"; public static final String CONSTRAINT = "CONSTRAINT"; - public static final String VARCHAR511 = "VARCHAR(511)"; public static final String TEXT = "TEXT"; public static final String DECIMAL = "DECIMAL"; public static final String BIGINT = "BIGINT"; @@ -50,12 +48,11 @@ public class Constants { public static final String CREATE = "CREATE"; public static final String ALTER = "ALTER"; public static final String DEFAULT = "DEFAULT"; + public static final String INDEX = "INDEX"; public static final String ALTER_TABLE_TIES_DATA_S = "ALTER TABLE ties_data.\"%s\" "; public static final String ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S = ALTER_TABLE_TIES_DATA_S + "ADD CONSTRAINT \"%s\" "; public static final String CLASSIFIERS = "classifiers"; public static final String DECORATORS = "decorators"; - public static final String DEFAULT_MODULE_STATUS = "IN_USAGE"; - public static final String BUILT_IN_MODULE_ID = "BUILT_IN_MODULE"; public static final String A_SIDE = "A_SIDE"; public static final String B_SIDE = "B_SIDE"; public static final String RELATION = "RELATION"; diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java index fdfd5c8..e4e9fc5 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java @@ -22,6 +22,9 @@ package org.oran.smo.teiv.pgsqlgenerator; import lombok.Builder; import lombok.Getter; +import lombok.Singular; + +import java.util.List; @Getter @Builder @@ -29,4 +32,6 @@ public class ConsumerData { private String name; private String dataType; private String defaultValue; + @Singular + private List indexTypes; } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java index a3da50a..3208c2d 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java @@ -22,25 +22,28 @@ package org.oran.smo.teiv.pgsqlgenerator; import java.util.List; +import lombok.Value; import org.oran.smo.teiv.pgsqlgenerator.schema.Table; import lombok.Builder; -import lombok.Getter; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB; import static org.oran.smo.teiv.pgsqlgenerator.Constants.SOURCE_IDS; -@Getter +@Value @Builder public class Entity implements Table { - private String entityName; - private String moduleReferenceName; - private List attributes; + String entityName; + String storedAt; + String moduleReferenceName; + List attributes; @Builder.Default - private List consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue( - "[]").build(), ConsumerData.builder().name(CLASSIFIERS).dataType(JSONB).defaultValue("[]").build(), ConsumerData - .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").build()); + List consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue("[]") + .indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData.builder().name(CLASSIFIERS).dataType( + JSONB).defaultValue("[]").indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData + .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").indexType(IndexType.GIN) + .build()); @Override public String getTableName() { @@ -49,11 +52,11 @@ public class Entity implements Table { @Override public String getColumnsForCopyStatement() { - return "(\"name\", \"moduleReferenceName\")"; + return "(\"storedAt\", \"name\", \"moduleReferenceName\")"; } @Override public String getRecordForCopyStatement() { - return this.getEntityName() + "\t" + this.getModuleReferenceName() + "\n"; + return this.getStoredAt() + "\t" + this.getEntityName() + "\t" + this.getModuleReferenceName() + "\n"; } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java new file mode 100644 index 0000000..434d7cb --- /dev/null +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java @@ -0,0 +1,34 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Ericsson + * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.pgsqlgenerator; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum IndexType { + GIN("CREATE INDEX IF NOT EXISTS \"%s\" ON ties_data.\"%s\" USING GIN (\"%s\");"), + GIN_TRGM_OPS_ON_LIST_AS_JSONB( + "CREATE INDEX IF NOT EXISTS \"%s\" ON ties_data.\"%s\" USING GIN ((\"%s\"::TEXT) gin_trgm_ops);"); + + private final String createIndexStmt; +} diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java index 1d6dc2a..6135d67 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java @@ -38,8 +38,11 @@ public class Module implements Table { private String domain; private String revision; private String content; - private String ownerAppId; - private String status; + private List availableListElements; + @Setter + private List availableEntities; + @Builder.Default + private List availableRelations = List.of(); @Setter @Builder.Default private Collection includedModules = List.of(); @@ -51,7 +54,7 @@ public class Module implements Table { @Override public String getColumnsForCopyStatement() { - return "(\"name\", \"namespace\", \"domain\", \"includedModules\", \"revision\", \"content\", \"ownerAppId\", \"status\")"; + return "(\"name\", \"namespace\", \"domain\", \"includedModules\", \"revision\", \"content\")"; } @Override @@ -60,7 +63,6 @@ public class Module implements Table { this.getDomain() : "\\N") + "\t" + this.getIncludedModules().stream().map(moduleRef -> "\"" + moduleRef + "\"") .toList() + "\t" + this.getRevision() + "\t" + Base64.getEncoder().encodeToString(this.getContent() - .replaceAll("\\r\\n?", "\n").getBytes(StandardCharsets.UTF_8)) + "\t" + this - .getOwnerAppId() + "\t" + this.getStatus() + "\n"; + .replaceAll("\\r\\n?", "\n").getBytes(StandardCharsets.UTF_8)) + "\n"; } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java new file mode 100644 index 0000000..2418e18 --- /dev/null +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java @@ -0,0 +1,33 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Ericsson + * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.pgsqlgenerator; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class PostgresIndex { + private String tableNameToAddIndexTo; + private String columnNameToAddIndexTo; + private String indexName; + private IndexType indexType; +} diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java index 943a15e..4d24eee 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java @@ -24,9 +24,11 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import org.oran.smo.teiv.pgsqlgenerator.grapghgenerator.EntityGraphGenerator; +import org.oran.smo.teiv.pgsqlgenerator.schema.consumerdata.ConsumerDataSchemaGenerator; import org.oran.smo.teiv.pgsqlgenerator.schema.data.DataSchemaGenerator; import org.oran.smo.teiv.pgsqlgenerator.schema.model.ModelSchemaGenerator; import org.oran.smo.teiv.pgsqlgenerator.grapghgenerator.RelationshipGraphGenerator; @@ -44,6 +46,7 @@ public class Processor { private final YangModelProcessor yangModelProcessor; private final DataSchemaGenerator dataSchemaGenerator; private final ModelSchemaGenerator modelSchemaGenerator; + private final ConsumerDataSchemaGenerator consumerDataSchemaGenerator; private final RelationshipGraphGenerator relationshipGraphGenerator; private final EntityGraphGenerator entityGraphGenerator; @Value("${yang-model.source}") @@ -69,6 +72,7 @@ public class Processor { entityGraphGenerator.generate(entitiesFromModelService); dataSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); modelSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); + consumerDataSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); } /** @@ -90,7 +94,7 @@ public class Processor { includedModules.removeIf(modelRef -> !moduleRefForAllEntities.contains(modelRef)); module.setIncludedModules(includedModules); } + moduleRefFromYangParser.sort(Comparator.comparing(Module::getName)); return moduleRefFromYangParser; - } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java index a4285cc..82b2f1b 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java @@ -22,39 +22,43 @@ package org.oran.smo.teiv.pgsqlgenerator; import java.util.List; +import lombok.Value; import org.oran.smo.teiv.pgsqlgenerator.schema.Table; import lombok.Builder; -import lombok.Getter; -import lombok.Setter; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB; import static org.oran.smo.teiv.pgsqlgenerator.Constants.SOURCE_IDS; -@Getter +@Value @Builder public class Relationship implements Table { - private String name; - private String aSideAssociationName; - private String aSideMOType; - private long aSideMinCardinality; - private long aSideMaxCardinality; - private String bSideAssociationName; - private String bSideMOType; - private long bSideMinCardinality; - private long bSideMaxCardinality; - private String associationKind; - @Setter - private String relationshipDataLocation; - private boolean connectSameEntity; - @Setter - private String moduleReferenceName; + String name; + String aSideAssociationName; + String aSideMOType; + String aSideModule; + long aSideMinCardinality; + long aSideMaxCardinality; + String bSideAssociationName; + String bSideMOType; + String bSideModule; + long bSideMinCardinality; + long bSideMaxCardinality; + String associationKind; + boolean connectSameEntity; + String relationshipDataLocation; + String storedAt; + String moduleReferenceName; @Builder.Default - private List consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue( - "[]").build(), ConsumerData.builder().name(CLASSIFIERS).dataType(JSONB).defaultValue("[]").build(), ConsumerData - .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").build()); + List consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue("[]") + .indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData.builder().name(CLASSIFIERS).dataType( + JSONB).defaultValue("[]").indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData + .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").indexType(IndexType.GIN) + .build()); + String aSideStoredAt; + String bSideStoredAt; @Override public String getTableName() { @@ -63,16 +67,19 @@ public class Relationship implements Table { @Override public String getColumnsForCopyStatement() { - return "(\"name\", \"aSideAssociationName\", \"aSideMOType\", \"aSideMinCardinality\", \"aSideMaxCardinality\", \"bSideAssociationName\", \"bSideMOType\", \"bSideMinCardinality\", \"bSideMaxCardinality\", \"associationKind\", \"relationshipDataLocation\", \"connectSameEntity\", \"moduleReferenceName\")"; + return "(\"name\", \"aSideAssociationName\", \"aSideMOType\", \"aSideModule\", \"aSideMinCardinality\", \"aSideMaxCardinality\", \"bSideAssociationName\", \"bSideMOType\", \"bSideModule\", \"bSideMinCardinality\", \"bSideMaxCardinality\", \"associationKind\", \"connectSameEntity\", \"relationshipDataLocation\", \"storedAt\", \"moduleReferenceName\")"; } @Override public String getRecordForCopyStatement() { return this.getName() + "\t" + this.getASideAssociationName() + "\t" + this.getASideMOType() + "\t" + this - .getASideMinCardinality() + "\t" + this.getASideMaxCardinality() + "\t" + this - .getBSideAssociationName() + "\t" + this.getBSideMOType() + "\t" + this - .getBSideMinCardinality() + "\t" + this.getBSideMaxCardinality() + "\t" + this - .getAssociationKind() + "\t" + this.getRelationshipDataLocation() + "\t" + this - .isConnectSameEntity() + "\t" + this.getModuleReferenceName() + "\n"; + .getASideModule() + "\t" + this.getASideMinCardinality() + "\t" + this + .getASideMaxCardinality() + "\t" + this.getBSideAssociationName() + "\t" + this + .getBSideMOType() + "\t" + this.getBSideModule() + "\t" + this + .getBSideMinCardinality() + "\t" + this.getBSideMaxCardinality() + "\t" + this + .getAssociationKind() + "\t" + this.isConnectSameEntity() + "\t" + this + .getRelationshipDataLocation() + "\t" + this + .getStoredAt() + "\t" + this + .getModuleReferenceName() + "\n"; } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java index 87caa91..ff4a9cf 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java @@ -24,18 +24,21 @@ import static org.oran.smo.teiv.pgsqlgenerator.Constants.A_SIDE; import static org.oran.smo.teiv.pgsqlgenerator.Constants.BIGINT; import static org.oran.smo.teiv.pgsqlgenerator.Constants.B_SIDE; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECIMAL; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.INT; import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB; import static org.oran.smo.teiv.pgsqlgenerator.Constants.RELATION; import static org.oran.smo.teiv.pgsqlgenerator.Constants.TEXT; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.VARCHAR511; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.NoSuchElementException; import java.util.Optional; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.oran.smo.yangtools.parser.ParserExecutionContext; @@ -62,6 +65,8 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class YangModelProcessor { private final HashMap dataTypeMapping; + @Value("${exclusions.model-names}") + private List excludedModelNames; private final YangDeviceModel yangDeviceModel; private final ModifyableFindingSeverityCalculator severityCalculator; private final FindingsManager findingsManager; @@ -92,7 +97,7 @@ public class YangModelProcessor { { put("string", TEXT); put("uint32", BIGINT); - put("int32", BIGINT); + put("int32", INT); put("or-teiv-types:_3GPP_FDN_Type", TEXT); put("enumeration", TEXT); put("types3gpp:PLMNId", JSONB); @@ -124,12 +129,13 @@ public class YangModelProcessor { System.out.println("Module Name: " + yModule.getModuleName()); yModule.getLists().stream().forEach(yList -> { + final String tableName = getTableName(yModule.getModuleName(), yList.getListName()); System.out.printf("\tEntity Name: %s \n", yList.getListName()); List attributes = new ArrayList<>(); List constraint = List.of(PrimaryKeyConstraint.builder().constraintName("PK_" + yList.getListName() + "_id") .tableName(yList.getListName()).columnToAddConstraintTo("id").build()); - attributes.add(Attribute.builder().name("id").dataType(VARCHAR511).constraints(constraint).build()); + attributes.add(Attribute.builder().name("id").dataType(TEXT).constraints(constraint).build()); yList.getContainers().forEach(yContainer -> { System.out.printf("\t\tContainer Name: %s \n", yContainer.getContainerName()); if (yContainer.getContainerName().equals("attributes")) { @@ -158,8 +164,8 @@ public class YangModelProcessor { System.out.printf("\t\t\t\tData Type: %s \n", dataTypeMapping.get(yLeafList.getType() .getDataType())); - attributes.add(Attribute.builder().name(yLeafList.getLeafListName()).dataType(JSONB) - .constraints(new ArrayList()).build()); + attributes.add(Attribute.builder().name(yLeafList.getLeafListName()).dataType(JSONB).indexType( + IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).constraints(new ArrayList()).build()); }); yContainer.getContainers().forEach(container -> { @@ -168,8 +174,16 @@ public class YangModelProcessor { System.out.printf("\t\t\t\tData Type: %s \n", dataTypeMapping.get(container.getUses() .toString())); - attributes.add(Attribute.builder().name(container.getContainerName()).dataType(dataTypeMapping - .get(container.getUses().toString())).constraints(new ArrayList()).build()); + String dataType = dataTypeMapping.get(container.getUses().toString()); + Attribute.AttributeBuilder attributeBuilder = Attribute.builder().name(container + .getContainerName()).dataType(dataType).constraints(new ArrayList()); + if (container.getContainerName().equals("geo-location")) { + dataType = dataTypeMapping.get("geo:geo-location"); + } + if (dataType.equals(JSONB)) { + attributeBuilder.indexType(IndexType.GIN); + } + attributes.add(attributeBuilder.build()); }); yContainer.getUses().forEach(uses -> { @@ -182,10 +196,12 @@ public class YangModelProcessor { }); } }); - entities.add(Entity.builder().entityName(yList.getListName()).moduleReferenceName(yangModel - .getYangModelRoot().getModule().getModuleName()).attributes(attributes).build()); + attributes.sort(Comparator.comparing(Attribute::getName)); + entities.add(Entity.builder().entityName(yList.getListName()).storedAt(tableName).moduleReferenceName( + yangModel.getYangModelRoot().getModule().getModuleName()).attributes(attributes).build()); }); }); + entities.sort(Comparator.comparing(Entity::getStoredAt)); return entities; } @@ -306,24 +322,50 @@ public class YangModelProcessor { connectSameEntity = false; } + String aSideModuleName = getSideModuleName(yangModels, aSideMoType); + String bSideModuleName = getSideModuleName(yangModels, bSideMoType); + + String storedAt = ""; + switch (relDataLocation) { + case A_SIDE -> storedAt = getTableName(aSideModuleName, aSideMoType); + case B_SIDE -> storedAt = getTableName(bSideModuleName, bSideMoType); + case RELATION -> storedAt = getTableName(yModule.getDomElement().getValue(), + yOranSmoTeivBiDirectionalTopologyRelationship.getRelationshipName()); + } + Relationship relationship = Relationship.builder().name( yOranSmoTeivBiDirectionalTopologyRelationship.getRelationshipName()) .aSideAssociationName(aSide.getParentStatement().getStatementIdentifier()) - .aSideMOType(aSideMoType).aSideMinCardinality(aSideMinCardinality) - .aSideMaxCardinality(aSideMaxCardinality).bSideAssociationName(bSide - .getParentStatement().getStatementIdentifier()).bSideMOType(bSideMoType) - .bSideMinCardinality(bSideMinCardinality).bSideMaxCardinality(bSideMaxCardinality) + .aSideMOType(aSideMoType).aSideModule(aSideModuleName).aSideMinCardinality( + aSideMinCardinality).aSideMaxCardinality(aSideMaxCardinality) + .bSideAssociationName(bSide.getParentStatement().getStatementIdentifier()) + .bSideMOType(bSideMoType).bSideModule(bSideModuleName).bSideMinCardinality( + bSideMinCardinality).bSideMaxCardinality(bSideMaxCardinality) .relationshipDataLocation(relDataLocation).moduleReferenceName(yModule - .getModuleName()).associationKind(("BI_DIRECTIONAL")) // Hard coded for now - .connectSameEntity(connectSameEntity).build(); // Hard coded for now + .getModuleName()).associationKind(("BI_DIRECTIONAL")).connectSameEntity( + connectSameEntity).storedAt(storedAt).aSideStoredAt(getTableName( + aSideModuleName, aSideMoType)).bSideStoredAt(getTableName( + bSideModuleName, bSideMoType)).build(); // Hard coded for now relationships.add(relationship); }); }); + relationships.sort(Comparator.comparing(Relationship::getName)); return relationships; } + private String getSideModuleName(List yangModels, String aSideMoType) { + return yangModels.stream().flatMap(ym -> ym.getYangDomDocumentRoot().getChildren().stream()).flatMap( + children -> children.getChildren().stream()).filter(child -> child.getValue().equals(aSideMoType)).map( + child -> child.getParentElement().getValue()).findFirst().orElseThrow( + () -> new NoSuchElementException("No module name found for type: " + aSideMoType)); + } + + private String getTableName(String moduleName, String name) { + return moduleName + "_" + name; + } + /** - * Identify where relationship data should be stored + * Identify the type of table in which relationship should be stored. */ private String getRelationshipDataLocation(long aSideMaxCardinality, long bSideMaxCardinality, String aSideMO, String bSideMO, String relName) { diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java index 1b773fc..fdc0d9d 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java @@ -20,9 +20,6 @@ */ package org.oran.smo.teiv.pgsqlgenerator; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.BUILT_IN_MODULE_ID; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT_MODULE_STATUS; - import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -46,6 +43,7 @@ import org.oran.smo.yangtools.parser.model.ConformanceType; import org.oran.smo.yangtools.parser.model.YangModel; import org.oran.smo.yangtools.parser.model.statements.AbstractStatement; import org.oran.smo.yangtools.parser.model.statements.StatementModuleAndName; +import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement; @Slf4j @Component @@ -68,14 +66,34 @@ public class YangParser { String domain = getDomain(moduleOrSubmodule); String namespace = getNamespace(moduleOrSubmodule); List includedModules = getIncludedModules(moduleOrSubmodule); + List availableRelations = getAvailableRelations(moduleOrSubmodule); + List availableListElements = getAvailableListElements(moduleOrSubmodule); modules.add(Module.builder().name(moduleReferenceName).namespace(namespace).domain(domain).includedModules( includedModules).revision(yangInput.getModuleIdentity().getRevision()).content(new String(yangInput - .getYangInput().getInputStream().readAllBytes(), StandardCharsets.UTF_8)).ownerAppId( - BUILT_IN_MODULE_ID).status(DEFAULT_MODULE_STATUS).build()); + .getYangInput().getInputStream().readAllBytes(), StandardCharsets.UTF_8)).availableListElements( + availableListElements).availableRelations(availableRelations).availableEntities( + new ArrayList<>()).build()); } return modules; } + private List getAvailableRelations(AbstractStatement statement) { + List includedModules = new ArrayList<>(); + statement.getChildStatements().forEach(childStatement -> { + String domStatement = childStatement.getDomElement().toString(); + if (domStatement.contains("or-teiv-yext:biDirectionalTopologyRelationship")) { + includedModules.add(childStatement.getDomElement().getValue()); + } + }); + return includedModules; + } + + private List getAvailableListElements(AbstractStatement statement) { + return statement.getDomElement().getChildren().stream().filter(yangDomElement -> yangDomElement.getName().equals( + "list")).map(YangDomElement::getValue).toList(); + + } + private String getDomain(AbstractStatement moduleOrSubmodule) { AbstractStatement domainStatement = moduleOrSubmodule.getChild(new StatementModuleAndName( "o-ran-smo-teiv-common-yang-extensions", "domain")); @@ -112,7 +130,7 @@ public class YangParser { final List yangModelInputs = new ArrayList<>(); try { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(this.getClass().getClassLoader()); - Resource[] yangResources = resolver.getResources(yangModelDirectory + "/*.yang"); + Resource[] yangResources = resolver.getResources(yangModelDirectory + "/**/*.yang"); for (Resource yangResource : yangResources) { yangModelInputs.add(new YangModel(new ByteArrayYangInput(yangResource.getContentAsByteArray(), Objects .requireNonNull(yangResource.getFilename())), ConformanceType.IMPORT)); diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java index 6b76cc1..bec8e3b 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java @@ -64,7 +64,7 @@ public class RelationshipGraphGenerator { private void generateGraph(String name, List relationships, List entities) throws IOException { MutableGraph g = prepareGraph(relationships, entities); - File outputFile = new File(graphOutput, name); + File outputFile = new File(graphOutput, name + "-rel"); Graphviz.fromGraph(g).render(Format.SVG).toFile(outputFile); log.info("Graph rendered to: {}", outputFile.getAbsolutePath()); } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java index 0b310bf..0fae2fc 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java @@ -24,6 +24,7 @@ import org.oran.smo.teiv.pgsqlgenerator.Column; import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint; import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException; import org.oran.smo.teiv.pgsqlgenerator.PostgresConstraint; +import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.oran.smo.teiv.pgsqlgenerator.Table; import org.oran.smo.teiv.pgsqlgenerator.Relationship; @@ -85,12 +86,24 @@ public class BackwardCompatibilityChecker { } } + public void checkForNBCChangesInConsumerDataSchema(String baselineConsumerDataSchema, + String skeletonConsumerDataSchema) { + if (!isGreenFieldInstallation) { + final List baselineTables = SchemaParser.extractDataFromBaseline(baselineConsumerDataSchema); + final List
skeletonTables = SchemaParser.extractDataFromBaseline(skeletonConsumerDataSchema); + checkForNBCChangesInData(baselineTables, skeletonTables); + } else { + log.info("No NBC checks done as green field installation is enabled"); + } + } + private void verifyTableColumns(List columnsInBaseline, List columnsInModelSvc, String tableName) { columnsInBaseline.forEach(baselineColumn -> { Optional matchingColumn = columnsInModelSvc.stream().filter(modelColumn -> modelColumn.getName().equals( baselineColumn.getName())).findFirst(); matchingColumn.ifPresentOrElse(modelColumn -> { validateColumnConstraints(baselineColumn, modelColumn, tableName); + validateColumnIndexes(baselineColumn, modelColumn, tableName); validateColumnDataType(baselineColumn, modelColumn, tableName); }, () -> { throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format( @@ -127,6 +140,32 @@ public class BackwardCompatibilityChecker { } } + private void validateColumnIndexes(Column baselineColumn, Column modelColumn, String tableName) { + for (PostgresIndex indexInBaseline : baselineColumn.getPostgresIndexList()) { + Optional matchingIndex = modelColumn.getPostgresIndexList().stream().filter( + indexInGenerated -> indexInGenerated.getIndexName().equals(indexInBaseline.getIndexName())).findFirst(); + + matchingIndex.ifPresentOrElse(indexInGenerated -> { + String indexStatementInBaseline = String.format(indexInBaseline.getIndexType().getCreateIndexStmt(), + indexInBaseline.getIndexName(), indexInBaseline.getTableNameToAddIndexTo(), indexInBaseline + .getColumnNameToAddIndexTo()); + String indexStatementInGenerated = String.format(indexInGenerated.getIndexType().getCreateIndexStmt(), + indexInGenerated.getIndexName(), indexInGenerated.getTableNameToAddIndexTo(), indexInGenerated + .getColumnNameToAddIndexTo()); + if (!indexStatementInGenerated.equals(indexStatementInBaseline)) { + throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format( + "modified/removed index %s for column(%s.%s) present in baseline", indexInBaseline + .getIndexName(), tableName, baselineColumn.getName()), + new UnsupportedOperationException()); + } + }, () -> { + throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format( + "modified/removed index %s for column(%s.%s) present in baseline", indexInBaseline.getIndexName(), + tableName, baselineColumn.getName()), new UnsupportedOperationException()); + }); + } + } + private void validateColumnDataType(Column baselineColumn, Column modelColumn, String tableName) { if (!baselineColumn.getDataType().equals(modelColumn.getDataType())) { throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format( diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java index a51fe1e..7dc1d4b 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java @@ -35,10 +35,12 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; import org.oran.smo.teiv.pgsqlgenerator.Column; +import org.oran.smo.teiv.pgsqlgenerator.IndexType; import org.oran.smo.teiv.pgsqlgenerator.PostgresConstraint; import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint; import org.oran.smo.teiv.pgsqlgenerator.NotNullConstraint; import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException; +import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint; import org.oran.smo.teiv.pgsqlgenerator.Table; import org.oran.smo.teiv.pgsqlgenerator.UniqueConstraint; @@ -74,12 +76,12 @@ public class SchemaParser { line = br.readLine(); List relData = Arrays.asList(line.replace("\"", "").split("\\s+")); identifiedRelationships.add(Relationship.builder().name(relData.get(0)).aSideAssociationName(relData - .get(1)).aSideMOType(relData.get(2)).aSideMinCardinality(Long.parseLong(relData.get(3))) - .aSideMaxCardinality(Long.parseLong(relData.get(4))).bSideAssociationName(relData.get(5)) - .bSideMOType(relData.get(6)).bSideMinCardinality(Long.parseLong(relData.get(7))) - .bSideMaxCardinality(Long.parseLong(relData.get(8))).associationKind(relData.get(9)) - .relationshipDataLocation(relData.get(10)).connectSameEntity(Boolean.parseBoolean(relData - .get(11))).moduleReferenceName(relData.get(12)).build()); + .get(1)).aSideMOType(relData.get(2)).aSideMinCardinality(Long.parseLong(relData.get(4))) + .aSideMaxCardinality(Long.parseLong(relData.get(5))).bSideAssociationName(relData.get(6)) + .bSideMOType(relData.get(7)).bSideMinCardinality(Long.parseLong(relData.get(9))) + .bSideMaxCardinality(Long.parseLong(relData.get(10))).associationKind(relData.get(11)) + .connectSameEntity(Boolean.parseBoolean(relData.get(12))).relationshipDataLocation(relData + .get(13)).moduleReferenceName(relData.get(15)).build()); } } } catch (IOException exception) { @@ -109,6 +111,8 @@ public class SchemaParser { extractTableColumns(line, identifiedTables, br); } else if (line.contains("SELECT") && line.contains("ties_data.create_constraint_if_not_exists")) { extractConstraints(identifiedTables, br); + } else if (line.startsWith("CREATE INDEX IF NOT EXISTS")) { + extractIndex(line, identifiedTables); } } } catch (IOException exception) { @@ -218,4 +222,32 @@ public class SchemaParser { identifiedTables.add(Table.builder().name(entityName).columns(identifiedColumns).build()); } + private static void extractIndex(String line, List identifiedTables) + throws IOException { + String[] valuesInQuotes = StringUtils.substringsBetween(line, "\"", "\""); + String indexName = valuesInQuotes[0]; + String tableToAddIndexTo = valuesInQuotes[1]; + String columnToAddIndexTo = valuesInQuotes[2]; + + List postgresIndexList = new ArrayList<>(); + + identifiedTables.stream().filter(table -> table.getName().equals(tableToAddIndexTo)).findFirst().flatMap( + table -> table.getColumns().stream().filter(column -> column.getName().equals(columnToAddIndexTo)) + .findFirst()).ifPresent(column -> { + if (!column.getPostgresIndexList().isEmpty()) { + postgresIndexList.addAll(column.getPostgresIndexList()); + } + String createIndexStmt = line.replace(indexName, "%s").replace(tableToAddIndexTo, "%s").replace( + columnToAddIndexTo, "%s"); + for (IndexType indexType : IndexType.values()) { + if (indexType.getCreateIndexStmt().equals(createIndexStmt)) { + postgresIndexList.add(PostgresIndex.builder().tableNameToAddIndexTo(tableToAddIndexTo) + .columnNameToAddIndexTo(columnToAddIndexTo).indexName(indexName).indexType( + indexType).build()); + } + } + column.setPostgresIndexList(postgresIndexList); + }); + } + } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java new file mode 100644 index 0000000..4f9e185 --- /dev/null +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java @@ -0,0 +1,75 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Ericsson + * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.pgsqlgenerator.schema.consumerdata; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.List; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.oran.smo.teiv.pgsqlgenerator.Entity; +import org.oran.smo.teiv.pgsqlgenerator.Module; +import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException; +import org.oran.smo.teiv.pgsqlgenerator.Relationship; +import org.oran.smo.teiv.pgsqlgenerator.schema.BackwardCompatibilityChecker; +import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaGenerator; +import org.springframework.util.ResourceUtils; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ConsumerDataSchemaGenerator extends SchemaGenerator { + private final BackwardCompatibilityChecker backwardCompatibilityChecker; + + @Value("${schema.consumer-data.baseline}") + private String baselineConsumerDataSchema; + @Value("${schema.consumer-data.output}") + private String outputConsumerDataSchema; + @Value("${schema.consumer-data.skeleton}") + private String skeletonConsumerDataSchema; + + @Override + protected void prepareSchema() { + try { + final File skeletonFile = ResourceUtils.getFile("classpath:" + skeletonConsumerDataSchema); + backwardCompatibilityChecker.checkForNBCChangesInConsumerDataSchema(baselineConsumerDataSchema, skeletonFile + .getAbsolutePath()); + + final Path destinationPath = Paths.get(outputConsumerDataSchema); + Files.copy(skeletonFile.toPath(), destinationPath, StandardCopyOption.REPLACE_EXISTING); + this.schema = destinationPath.toFile(); + } catch (IOException exception) { + throw PgSchemaGeneratorException.prepareBaselineException("ties.consumer-data", exception); + } + } + + @Override + protected void setSqlStatements(List modules, List entities, List relationships) { + //DO-NOTHING + } +} diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java index 81845ca..1a39705 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java @@ -27,6 +27,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -76,9 +77,15 @@ public class DataSchemaGenerator extends SchemaGenerator { log.info("Baseline EXISTS!!"); Path sourcePath = baselineDataSchemaFile.toPath(); List stmts = Files.readAllLines(sourcePath); - List commitExcludedStmts = stmts.stream().filter(line -> !line.equals("COMMIT;")).toList(); + List analyzeAndCommitExcludedStmts = new ArrayList<>(); + for (String line : stmts) { + if (line.startsWith("ANALYZE") || line.equals("COMMIT;")) { + break; + } + analyzeAndCommitExcludedStmts.add(line); + } - Files.write(Paths.get(dataSchemaFileName), commitExcludedStmts, StandardOpenOption.CREATE, + Files.write(Paths.get(dataSchemaFileName), analyzeAndCommitExcludedStmts, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); } this.schema = newDataSchema; @@ -102,8 +109,16 @@ public class DataSchemaGenerator extends SchemaGenerator { tablesFromBaselineSql); // Generate schema from differences StringBuilder generatedSchema = dataSchemaHelper.generateSchemaFromDifferences(differences); - generatedSchema.append("\nCOMMIT;\n"); + generatedSchema.append(generateAnalyzeTableStatement(tablesFromModelSvc)); + generatedSchema.append("COMMIT;\n"); this.sqlStatements = generatedSchema.toString(); } + private StringBuilder generateAnalyzeTableStatement(List
tablesFromModelSvc) { + StringBuilder analyzeTableStmt = new StringBuilder(); + tablesFromModelSvc.forEach(table -> analyzeTableStmt.append(String.format("ANALYZE ties_data.\"%s\";%n%n", table + .getName()))); + return analyzeTableStmt; + } + } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java index ca29e4c..84d4a57 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java @@ -23,6 +23,7 @@ package org.oran.smo.teiv.pgsqlgenerator.schema.data; import java.util.List; import java.util.Map; +import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; @@ -38,8 +39,12 @@ import org.oran.smo.teiv.pgsqlgenerator.UniqueConstraint; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CREATE; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.GEOGRAPHY; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.GEO_LOCATION; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ID; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TIES_DATA_S; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX; @Slf4j @Component @@ -59,9 +64,10 @@ public class DataSchemaHelper { } else { for (Map.Entry> entry : differences.entrySet()) { switch (entry.getKey()) { - case CREATE -> generatedSchema.append(generateCreateStatementsFromDifferences(entry.getValue())); + case DEFAULT -> generatedSchema.append(generateDefaultStatementsFromDifferences(entry.getValue())); + case INDEX -> generatedSchema.append(generateIndexStatementsFromDifferences(entry.getValue())); case ALTER -> generatedSchema.append(generateAlterStatementsFromDifferences(entry.getValue())); - default -> generatedSchema.append(generateDefaultStatementsFromDifferences(entry.getValue())); + case CREATE -> generatedSchema.append(generateCreateStatementsFromDifferences(entry.getValue())); } } } @@ -75,15 +81,17 @@ public class DataSchemaHelper { StringBuilder storeSchemaForCreateStatements = new StringBuilder(); StringBuilder storeAlterStatementsForPrimaryKeyConstraints = new StringBuilder(); StringBuilder storeAlterStatementsForAllOtherConstraints = new StringBuilder(); + StringBuilder storeIndexStatements = new StringBuilder(); for (Table table : tables) { storeAlterStatementsForPrimaryKeyConstraints.append(generateAlterStatementsForPrimaryKeyConstraints(table .getColumns())); storeAlterStatementsForAllOtherConstraints.append(generateAlterStatementsForAllOtherConstraints(table .getColumns())); + storeIndexStatements.append(generateIndexStatementForColumns(table.getColumns())); storeSchemaForCreateStatements.append(generateCreateTableStatements(table.getColumns(), table.getName())); } storeSchemaForCreateStatements.append(storeAlterStatementsForPrimaryKeyConstraints).append( - storeAlterStatementsForAllOtherConstraints); + storeAlterStatementsForAllOtherConstraints).append(storeIndexStatements); return storeSchemaForCreateStatements; } @@ -158,6 +166,16 @@ public class DataSchemaHelper { postgresConstraint.getTableToAddConstraintTo(), postgresConstraint.getConstraintName(), constraintSql); } + private StringBuilder generateIndexStatementForColumns(List columns) { + StringBuilder indexStmt = new StringBuilder(); + columns.forEach(column -> { + column.getPostgresIndexList().forEach(postgresIndex -> { + indexStmt.append(generateIndexStatement(postgresIndex)); + }); + }); + return indexStmt; + } + private String generateConstraintSql(PostgresConstraint postgresConstraint) { if (postgresConstraint instanceof PrimaryKeyConstraint) { return String.format(ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S + "PRIMARY KEY (\"%s\")", postgresConstraint @@ -189,28 +207,32 @@ public class DataSchemaHelper { StringBuilder storeSchemaForAlterStatements = new StringBuilder(); StringBuilder storeAlterStatementsForPrimaryKeyConstraints = new StringBuilder(); StringBuilder storeAlterStatementsForAllOtherConstraints = new StringBuilder(); + StringBuilder storeIndexStatements = new StringBuilder(); for (Table table : tables) { storeSchemaForAlterStatements.append(generateAlterStatements(table.getColumns(), table.getName())); storeAlterStatementsForPrimaryKeyConstraints.append(generateAlterStatementsForPrimaryKeyConstraints(table .getColumns())); storeAlterStatementsForAllOtherConstraints.append(generateAlterStatementsForAllOtherConstraints(table .getColumns())); + storeIndexStatements.append(generateIndexStatementForColumns(table.getColumns())); } return storeSchemaForAlterStatements.append(storeAlterStatementsForPrimaryKeyConstraints).append( - storeAlterStatementsForAllOtherConstraints); + storeAlterStatementsForAllOtherConstraints).append(storeIndexStatements); } /** * Generates SQL statements for altering tables based on mapped entity attributes. */ private StringBuilder generateAlterStatements(List columns, String tableName) { - StringBuilder storeSchema = new StringBuilder(); for (Column newColumn : columns) { - if (newColumn.getName().equals("geo-location")) { - newColumn.setDataType("\"geography\""); + if (newColumn.getName().equals(GEO_LOCATION)) { + newColumn.setDataType(GEOGRAPHY); } storeSchema.append(generateAlterTableStatements(newColumn, tableName)); + if (newColumn.getDefaultValue() != null) { + storeSchema.append(generateDefaultValueStatements(newColumn, tableName)); + } } return storeSchema; } @@ -239,4 +261,25 @@ public class DataSchemaHelper { return new StringBuilder(String.format(ALTER_TABLE_TIES_DATA_S + "ADD COLUMN IF NOT EXISTS \"%s\" %s;%n%n", tableName, newColumn.getName(), newColumn.getDataType())); } + + private StringBuilder generateIndexStatementsFromDifferences(List
tables) { + StringBuilder storeSchemaForIndexStatements = new StringBuilder(); + for (Table table : tables) { + StringBuilder storeSchema = new StringBuilder(); + for (Column column : table.getColumns()) { + if (!column.getPostgresIndexList().isEmpty()) { + column.getPostgresIndexList().forEach(index -> { + storeSchema.append(generateIndexStatement(index)); + }); + } + } + storeSchemaForIndexStatements.append(storeSchema); + } + return storeSchemaForIndexStatements; + } + + private String generateIndexStatement(PostgresIndex postgresIndex) { + return String.format(postgresIndex.getIndexType().getCreateIndexStmt(), postgresIndex.getIndexName(), postgresIndex + .getTableNameToAddIndexTo(), postgresIndex.getColumnNameToAddIndexTo()) + "\n\n"; + } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java index fa0423d..2eb3281 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java @@ -23,15 +23,18 @@ package org.oran.smo.teiv.pgsqlgenerator.schema.data; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CREATE; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import org.oran.smo.teiv.pgsqlgenerator.IndexType; +import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.springframework.stereotype.Component; import org.oran.smo.teiv.pgsqlgenerator.Column; @@ -68,10 +71,11 @@ public class ModelComparator { } private Map> identifiedModelChangeMapping() { - Map> storeIdentifiedChangesToModels = new HashMap<>(); - storeIdentifiedChangesToModels.put(CREATE, new ArrayList<>()); - storeIdentifiedChangesToModels.put(ALTER, new ArrayList<>()); + Map> storeIdentifiedChangesToModels = new LinkedHashMap<>(); storeIdentifiedChangesToModels.put(DEFAULT, new ArrayList<>()); + storeIdentifiedChangesToModels.put(INDEX, new ArrayList<>()); + storeIdentifiedChangesToModels.put(ALTER, new ArrayList<>()); + storeIdentifiedChangesToModels.put(CREATE, new ArrayList<>()); return storeIdentifiedChangesToModels; } @@ -108,6 +112,8 @@ public class ModelComparator { } detectAndStoreDefaultValueChanges(tableFromModelService.getName(), columnsInBaseline, columnsFromModuleSvc); + detectAndStoreNewlyAddedIndex(tableFromModelService.getName(), columnsInBaseline, + columnsFromModuleSvc); }); }); } @@ -124,13 +130,8 @@ public class ModelComparator { columnsInBaseline).contains(columnInGenerated.getName())).toList(); identifiedChangesToModels.get(ALTER).add(Table.builder().name(tableName).columns(newColumns.stream().map( column -> Column.builder().name(column.getName()).dataType(column.getDataType()).postgresConstraints(column - .getPostgresConstraints()).build()).toList()).build()); - List columnsWithDefaultValues = newColumns.stream().filter(columnIdentified -> columnIdentified - .getDefaultValue() != null).toList(); - if (!columnsWithDefaultValues.isEmpty()) { - identifiedChangesToModels.get(DEFAULT).add(Table.builder().name(tableName).columns(columnsWithDefaultValues) - .build()); - } + .getPostgresConstraints()).defaultValue(column.getDefaultValue()).postgresIndexList(column + .getPostgresIndexList()).build()).toList()).build()); } /** @@ -153,6 +154,30 @@ public class ModelComparator { } } + private void detectAndStoreNewlyAddedIndex(String tableName, List columnsInBaseline, + List columnsFromModuleSvc) { + List columnList = new ArrayList<>(); + columnsInBaseline.forEach(columnInBaseline -> columnsFromModuleSvc.forEach(columnInGenerated -> { + if (columnInGenerated.getName().equals(columnInBaseline.getName())) { + List indexInBaselineSchema = columnInBaseline.getPostgresIndexList().stream().map( + PostgresIndex::getIndexType).toList(); + List postgresIndexList = new ArrayList<>(); + columnInGenerated.getPostgresIndexList().forEach(postgresIndex -> { + if (!indexInBaselineSchema.contains(postgresIndex.getIndexType())) { + postgresIndexList.add(postgresIndex); + } + }); + if (!postgresIndexList.isEmpty()) { + columnInGenerated.setPostgresIndexList(postgresIndexList); + columnList.add(columnInGenerated); + } + } + })); + if (!columnList.isEmpty()) { + identifiedChangesToModels.get(INDEX).add(Table.builder().name(tableName).columns(columnList).build()); + } + } + private List getListOfAllColumns(List columns) { List allColumns = new ArrayList<>(); for (Column col : columns) { diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java index ce3f579..d085339 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java @@ -27,16 +27,16 @@ import static org.oran.smo.teiv.pgsqlgenerator.Constants.CONSTRAINT; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CONSUMER_DATA; import static org.oran.smo.teiv.pgsqlgenerator.Constants.FOREIGN_KEY; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ID; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX_PREFIX; import static org.oran.smo.teiv.pgsqlgenerator.Constants.NO_PREFIX; import static org.oran.smo.teiv.pgsqlgenerator.Constants.PRIMARY_KEY; import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_CD; import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_FK; import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_ID; import static org.oran.smo.teiv.pgsqlgenerator.Constants.TABLE; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.TEXT; import static org.oran.smo.teiv.pgsqlgenerator.Constants.UNIQUE; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.VARCHAR511; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.A_SIDE; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.B_SIDE; import static org.oran.smo.teiv.pgsqlgenerator.Constants.RELATION; import java.util.ArrayList; @@ -48,6 +48,8 @@ import java.util.Map; import java.util.stream.Collectors; import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint; +import org.oran.smo.teiv.pgsqlgenerator.IndexType; +import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint; import org.springframework.stereotype.Component; @@ -80,30 +82,23 @@ public class TableBuilder { */ public List
getTables(List entities, List relationships) { // Create table from entities and relationships - Map> tableFromMSvc = new HashMap<>(); + Map> tablesFromModelSvc = new HashMap<>(); entities.forEach(entity -> { - String tableName = entity.getEntityName(); + String tableName = entity.getStoredAt(); String hashedTableName = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, tableName, TABLE); - tableFromMSvc.put(hashedTableName, getColumnsByEntity(entity, hashedTableName)); + tablesFromModelSvc.put(hashedTableName, getColumnsByEntity(entity, hashedTableName)); }); relationships.forEach(relationship -> { - String tableName = ""; - switch (relationship.getRelationshipDataLocation()) { - case A_SIDE -> tableName = relationship.getASideMOType(); - case B_SIDE -> tableName = relationship.getBSideMOType(); - case RELATION -> tableName = relationship.getName(); - default -> log.error(String.format("Relationship with name %s cannot be mapped", relationship.getName())); - } + String tableName = relationship.getStoredAt(); String hashedTableName = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, tableName, TABLE); - - tableFromMSvc.computeIfAbsent(hashedTableName, k -> new ArrayList<>()).addAll(getColumnsByRelationship( + tablesFromModelSvc.computeIfAbsent(hashedTableName, k -> new ArrayList<>()).addAll(getColumnsByRelationship( relationship, tableName, hashedTableName)); }); - return tableFromMSvc.entrySet().stream().map(entry -> Table.builder().name(entry.getKey()).columns(entry.getValue()) - .build()).collect(Collectors.toList()); + return tablesFromModelSvc.entrySet().stream().map(entry -> Table.builder().name(entry.getKey()).columns(entry + .getValue()).build()).collect(Collectors.toList()); } private List getColumnsByEntity(Entity entity, String hashedTableName) { @@ -113,14 +108,18 @@ public class TableBuilder { String hashedAttributeName = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, attributeName, COLUMN); return Column.builder().name(hashedAttributeName).dataType(attribute.getDataType()).postgresConstraints( - getConstraintsForColumn(entity.getEntityName(), hashedTableName, attribute.getConstraints(), - attributeName, hashedAttributeName)).defaultValue(attribute.getDefaultValue()).build(); + getConstraintsForColumn(entity.getStoredAt(), hashedTableName, attribute.getConstraints(), + attributeName, hashedAttributeName)).defaultValue(attribute.getDefaultValue()) + .postgresIndexList(getIndexesForColumn(entity.getStoredAt(), hashedTableName, attributeName, + hashedAttributeName, attribute.getIndexTypes())).build(); }).toList()); entityCols.addAll(entity.getConsumerData().stream().map(cd -> { + String attributeName = CONSUMER_DATA + cd.getName(); String hashedAttributeName = hashInfoDataGenerator.generateHashAndRegisterTableRow(CONSUMER_DATA, cd.getName(), COLUMN); return Column.builder().name(hashedAttributeName).dataType(cd.getDataType()).defaultValue(cd.getDefaultValue()) - .build(); + .postgresIndexList(getIndexesForColumn(entity.getStoredAt(), hashedTableName, attributeName, + hashedAttributeName, cd.getIndexTypes())).build(); }).toList()); return entityCols; } @@ -137,44 +136,46 @@ public class TableBuilder { String hashedTableName) { List relColumns = new ArrayList<>(); - final String associationEndpointName = tableName.equals(rel.getASideMOType()) ? + final String associationEndpointName = tableName.equals(rel.getASideStoredAt()) ? rel.getASideAssociationName() : rel.getBSideAssociationName(); final String relFk = REL_FK + associationEndpointName; final String relId = REL_ID + rel.getName(); - String hashedTableNameASide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getASideMOType(), - TABLE); - String hashedTableNameBSide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getBSideMOType(), - TABLE); - final String hashedReferenceTable = tableName.equals(hashedTableNameASide) ? + String hashedTableNameASide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel + .getASideStoredAt(), TABLE); + String hashedTableNameBSide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel + .getBSideStoredAt(), TABLE); + final String hashedReferenceTable = hashedTableName.equals(hashedTableNameASide) ? hashedTableNameBSide : hashedTableNameASide; final String hashedRelId = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_ID, rel.getName(), COLUMN); final String hashedRelFk = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_FK, associationEndpointName, COLUMN); - relColumns.add(Column.builder().name(hashedRelFk).dataType(VARCHAR511).postgresConstraints(new ArrayList<>(List.of( + relColumns.add(Column.builder().name(hashedRelFk).dataType(TEXT).postgresConstraints(new ArrayList<>(List.of( createForeignKeyConstraints(tableName, hashedTableName, hashedReferenceTable, relFk, hashedRelFk)))) .build()); - relColumns.add(Column.builder().name(hashedRelId).dataType(VARCHAR511).postgresConstraints(new ArrayList<>(List.of( + relColumns.add(Column.builder().name(hashedRelId).dataType(TEXT).postgresConstraints(new ArrayList<>(List.of( createUniqueConstraints(tableName, hashedTableName, relId, hashedRelId)))).build()); rel.getConsumerData().forEach(cd -> { - final String cdColumnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_CD, cd - .getName() + "_" + rel.getName(), COLUMN); - relColumns.add(Column.builder().name(cdColumnName).dataType(cd.getDataType()).defaultValue(cd.getDefaultValue()) - .build()); + final String columnNameWithoutPrefix = cd.getName() + "_" + rel.getName(); + final String columnName = REL_CD + columnNameWithoutPrefix; + final String hashedColumnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_CD, + columnNameWithoutPrefix, COLUMN); + relColumns.add(Column.builder().name(hashedColumnName).dataType(cd.getDataType()).defaultValue(cd + .getDefaultValue()).postgresIndexList(getIndexesForColumn(tableName, hashedTableName, columnName, + hashedColumnName, cd.getIndexTypes())).build()); }); return relColumns; } private List createRelationshipColumnsForRelationTables(Relationship rel, String tableName, String hashedTableName) { - - String hashedASideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getASideMOType(), + String hashedASideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getASideStoredAt(), TABLE); - String hashedBSideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getBSideMOType(), + String hashedBSideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getBSideStoredAt(), TABLE); final String relASide = A_SIDE_PREFIX + rel.getASideMOType(); @@ -183,40 +184,55 @@ public class TableBuilder { final String relBSide = B_SIDE_PREFIX + rel.getBSideMOType(); final String hashedRelBSide = hashInfoDataGenerator.generateHashAndRegisterTableRow(B_SIDE_PREFIX, rel .getBSideMOType(), COLUMN); - List relColumns = new ArrayList<>(Arrays.asList(Column.builder().name(ID).dataType(VARCHAR511) + List relColumns = new ArrayList<>(Arrays.asList(Column.builder().name(ID).dataType(TEXT) .postgresConstraints(new ArrayList<>(List.of(createPrimaryKeyConstraints(tableName, hashedTableName, ID)))) - .build(), Column.builder().name(hashedRelASide).dataType(VARCHAR511).postgresConstraints(new ArrayList<>( - List.of(createForeignKeyConstraints(tableName, hashedTableName, hashedASideMOType, relASide, - hashedRelASide)))).build(), Column.builder().name(hashedRelBSide).dataType(VARCHAR511) + .build(), Column.builder().name(hashedRelASide).dataType(TEXT).postgresConstraints(new ArrayList<>(List.of( + createForeignKeyConstraints(tableName, hashedTableName, hashedASideMOType, relASide, + hashedRelASide)))).build(), Column.builder().name(hashedRelBSide).dataType(TEXT) .postgresConstraints(new ArrayList<>(List.of(createForeignKeyConstraints(tableName, hashedTableName, hashedBSideMOType, relBSide, hashedRelBSide)))).build())); rel.getConsumerData().forEach(cd -> { - final String columnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(CONSUMER_DATA, cd.getName(), - COLUMN); - relColumns.add(Column.builder().name(columnName).dataType(cd.getDataType()).defaultValue(cd.getDefaultValue()) - .build()); + final String columnName = CONSUMER_DATA + cd.getName(); + final String hashedColumnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(CONSUMER_DATA, cd + .getName(), COLUMN); + relColumns.add(Column.builder().name(hashedColumnName).dataType(cd.getDataType()).defaultValue(cd + .getDefaultValue()).postgresIndexList(getIndexesForColumn(tableName, hashedTableName, columnName, + hashedColumnName, cd.getIndexTypes())).build()); }); return relColumns; } private Collection getConstraintsForColumn(String tableName, String hashedTableName, - Collection constraintsFromEModel, String attributeName, String hashedAttributeName) { + Collection constraintsFromModel, String attributeName, String hashedAttributeName) { Collection postgresConstraintCollection = new ArrayList<>(); - if (constraintsFromEModel != null) { - if (constraintsFromEModel.stream().anyMatch(PrimaryKeyConstraint.class::isInstance)) { + if (constraintsFromModel != null && !constraintsFromModel.isEmpty()) { + if (constraintsFromModel.stream().anyMatch(PrimaryKeyConstraint.class::isInstance)) { if (attributeName.equals(ID)) { postgresConstraintCollection.add(createPrimaryKeyConstraints(tableName, hashedTableName, attributeName)); } } - // if (constraintsFromEModel.stream().anyMatch(.class::isInstance)) { + // if (constraintsFromModel.stream().anyMatch(.class::isInstance)) { // postgresConstraintCollection.add(createUniqueConstraints(tableName, hashedTableName, attributeName, - // hashedAttributeName)); + // hashedAttributeName)); // } } return postgresConstraintCollection; } + private List getIndexesForColumn(String tableName, String hashedTableName, String attributeName, + String hashedAttributeName, List indexTypes) { + List postgresIndexList = new ArrayList<>(); + indexTypes.forEach(indexType -> { + //IndexName - IDX___ + final String hashedIndexName = hashInfoDataGenerator.generateHashAndRegisterTableRow(INDEX_PREFIX, String + .format("%s_%s_%s", indexType.name(), tableName, attributeName), INDEX); + postgresIndexList.add(PostgresIndex.builder().tableNameToAddIndexTo(hashedTableName).columnNameToAddIndexTo( + hashedAttributeName).indexName(hashedIndexName).indexType(indexType).build()); + }); + return postgresIndexList; + } + private PostgresConstraint createForeignKeyConstraints(String tableToAddForeignKeyTo, String hashedTableToAddForeignKeyTo, String hashedReferenceTable, String columnName, String hashedColumnName) { String constraintName = hashInfoDataGenerator.generateHashAndRegisterTableRow(FOREIGN_KEY, diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java index 771baee..aaa5988 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java @@ -40,7 +40,7 @@ import lombok.extern.slf4j.Slf4j; @Getter @Slf4j public class HashInfoDataGenerator { - + private static final int POSTGRES_MAX_IDENTIFIER_LENGTH = 63; private final Set hashInfoRowsList = new HashSet<>(); /** @@ -56,7 +56,7 @@ public class HashInfoDataGenerator { */ public String generateHashAndRegisterTableRow(String prefix, String name, String type) { String hashedValue; - if (prefix.length() + name.length() < 64) { + if (prefix.length() + name.length() <= POSTGRES_MAX_IDENTIFIER_LENGTH) { hashInfoRowsList.add(HashInfoEntity.builder().name(prefix + name).hashedValue(prefix + name).type(type) .build()); return prefix + name; diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java index 10eb426..34ad33e 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java @@ -24,8 +24,11 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import org.oran.smo.teiv.pgsqlgenerator.HashInfoEntity; import org.oran.smo.teiv.pgsqlgenerator.schema.BackwardCompatibilityChecker; import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaParser; import org.springframework.beans.factory.annotation.Value; @@ -86,7 +89,11 @@ public class ModelSchemaGenerator extends SchemaGenerator { backwardCompatibilityChecker.checkForNBCChangesInModel(relFromBaselineSql, relationships); } StringBuilder tiesModelSql = new StringBuilder(); - tiesModelSql.append(prepareCopyStatement(hashInfoDataGenerator.getHashInfoRowsList().stream().toList())); + + List hashInfoList = new ArrayList<>(hashInfoDataGenerator.getHashInfoRowsList().stream().toList()); + hashInfoList.sort(Comparator.comparing(HashInfoEntity::getName)); + + tiesModelSql.append(prepareCopyStatement(hashInfoList)); tiesModelSql.append(prepareCopyStatement(modules)); tiesModelSql.append(prepareCopyStatement(entities)); tiesModelSql.append(prepareCopyStatement(relationships)); diff --git a/pgsql-schema-generator/src/main/resources/application.yaml b/pgsql-schema-generator/src/main/resources/application.yaml index 1e3f11f..5d47560 100644 --- a/pgsql-schema-generator/src/main/resources/application.yaml +++ b/pgsql-schema-generator/src/main/resources/application.yaml @@ -32,6 +32,10 @@ schema: baseline: temp-baseline: target/01_init-oran-smo-teiv-model_baseline.sql output: target/01_init-oran-smo-teiv-model.sql + consumer-data: + skeleton: scripts/02_init-oran-smo-teiv-consumer-data.sql + baseline: + output: target/02_init-oran-smo-teiv-consumer-data.sql exclusions: model-names: metadata, decorators graphs: diff --git a/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql index 9be0569..ab5963a 100644 --- a/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql @@ -23,6 +23,7 @@ BEGIN; CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; +CREATE EXTENSION IF NOT EXISTS pg_trgm; GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; diff --git a/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql index 9ea8054..6222f76 100644 --- a/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql @@ -35,55 +35,47 @@ CREATE TABLE IF NOT EXISTS ties_model.execution_status ( ); CREATE TABLE IF NOT EXISTS ties_model.hash_info ( - "name" VARCHAR(511) PRIMARY KEY, - "hashedValue" VARCHAR(511) NOT NULL, + "name" TEXT PRIMARY KEY, + "hashedValue" VARCHAR(63) NOT NULL, "type" VARCHAR(511) ); CREATE TABLE IF NOT EXISTS ties_model.module_reference ( - "name" VARCHAR(511) PRIMARY KEY, - "namespace" VARCHAR(511), - "domain" VARCHAR(511), + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "domain" TEXT, "includedModules" jsonb DEFAULT '[]'::jsonb, - "revision" VARCHAR(511) NOT NULL, - "content" TEXT NOT NULL, - "ownerAppId" VARCHAR(511) NOT NULL, - "status" VARCHAR(127) NOT NULL + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS ties_model.entity_info ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511) NOT NULL, + "storedAt" TEXT PRIMARY KEY, + "name" TEXT NOT NULL, + "moduleReferenceName" TEXT NOT NULL, FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( - "name" VARCHAR(511) PRIMARY KEY, + "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, + "aSideModule" TEXT NOT NULL, "aSideMinCardinality" BIGINT NOT NULL, "aSideMaxCardinality" BIGINT NOT NULL, "bSideAssociationName" TEXT NOT NULL, "bSideMOType" TEXT NOT NULL, + "bSideModule" TEXT NOT NULL, "bSideMinCardinality" BIGINT NOT NULL, "bSideMaxCardinality" BIGINT NOT NULL, "associationKind" TEXT NOT NULL, "relationshipDataLocation" TEXT NOT NULL, + "storedAt" TEXT NOT NULL, "connectSameEntity" BOOLEAN NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.decorators ( - "name" VARCHAR(511) PRIMARY KEY, - "dataType" VARCHAR(511) NOT NULL, - "moduleReferenceName" VARCHAR(511) NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.classifiers ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511) NOT NULL, + PRIMARY KEY ("name", "moduleReferenceName"), + FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); diff --git a/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql new file mode 100644 index 0000000..e393eb0 --- /dev/null +++ b/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql @@ -0,0 +1,53 @@ +-- +-- ============LICENSE_START======================================================= +-- Copyright (C) 2024 Ericsson +-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe +-- ================================================================================ +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- SPDX-License-Identifier: Apache-2.0 +-- ============LICENSE_END========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_consumer_data; +ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +SET default_tablespace = ''; +SET default_table_access_method = heap; + +SET ROLE :'pguser'; + +CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL, + "ownerAppId" VARCHAR(511) NOT NULL, + "status" VARCHAR(127) NOT NULL +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( + "name" TEXT PRIMARY KEY, + "dataType" VARCHAR(511) NOT NULL, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( + "name" TEXT PRIMARY KEY, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE +); + +COMMIT; diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java index fcd4dae..5895496 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java @@ -39,6 +39,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaParser; import lombok.extern.slf4j.Slf4j; +import static org.oran.smo.teiv.pgsqlgenerator.Processor.storeRelatedModuleRefsFromIncludedModules; +import static org.oran.smo.teiv.pgsqlgenerator.TestHelper.extractIndexName; + @Slf4j @SpringBootTest @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @@ -54,6 +57,10 @@ class EndToEndTest { private String expectedModelSql; @Value("${schema.model.output}") private String actualModelSql; + @Value("${test-result.consumer-data}") + private String expectedConsumerDataSql; + @Value("${schema.consumer-data.output}") + private String actualConsumerDataSql; @Value("${graphs.output}") private String graphOutput; @@ -66,11 +73,13 @@ class EndToEndTest { processor.process(); File generatedDataSql = new File(actualDataSql); File generatedModelSql = new File(actualModelSql); + File generatedConsumerDataSql = new File(actualConsumerDataSql); File generatedGraphs = new File(graphOutput); //then Assertions.assertTrue(generatedDataSql.exists()); Assertions.assertTrue(generatedModelSql.exists()); + Assertions.assertTrue(generatedConsumerDataSql.exists()); Assertions.assertTrue(generatedGraphs.exists() && generatedGraphs.isDirectory() && generatedGraphs .listFiles().length > 0); } @@ -99,10 +108,10 @@ class EndToEndTest { List columnsInExpected = expectedTable.getColumns(); List columnsInGenerated = generatedTable.getColumns(); - // Check if all columns for each table were added correctly - Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size()); - List allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated); - List allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected); + // Check if all columns for each table were added correctly + Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size()); + List allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNames(columnsInGenerated); + List allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNames(columnsInExpected); // Check if generatedResult contains all columns for a table Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult); @@ -112,7 +121,7 @@ class EndToEndTest { .findFirst().ifPresent(columnInGenerated -> { if (columnInExpected.getName().equals("id")) { - Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType()); + Assertions.assertEquals("TEXT", columnInGenerated.getDataType()); Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints())); } @@ -151,6 +160,19 @@ class EndToEndTest { }); }); } + // Check if generated index matches expected index. + if (!columnInExpected.getPostgresIndexList().isEmpty()) { + Assertions.assertEquals(columnInExpected.getPostgresIndexList().size(), columnInGenerated.getPostgresIndexList().size()); + Assertions.assertEquals(extractIndexName(columnInExpected), extractIndexName(columnInGenerated)); + columnInExpected.getPostgresIndexList().forEach(postgresIndexInExpected -> { + columnInGenerated.getPostgresIndexList().stream().filter(postgresIndexInGenerated -> + postgresIndexInGenerated.getIndexName().equals(postgresIndexInExpected.getIndexName())).findFirst().ifPresent(postgresIndexInGenerated -> { + Assertions.assertEquals(postgresIndexInExpected.getTableNameToAddIndexTo(), postgresIndexInGenerated.getTableNameToAddIndexTo()); + Assertions.assertEquals(postgresIndexInExpected.getColumnNameToAddIndexTo(), postgresIndexInGenerated.getColumnNameToAddIndexTo()); + Assertions.assertEquals(postgresIndexInExpected.getIndexType(), postgresIndexInGenerated.getIndexType()); + }); + }); + } }); }); }); @@ -202,18 +224,21 @@ class EndToEndTest { @Test void storeRelatedModuleRefsFromIncludedModulesTest() { //spotless:off - List mockModuleRefFromYangParser = List.of( + List mockModuleRefFromYangParser = new ArrayList<>(); + mockModuleRefFromYangParser.add( Module.builder().name("o-ran-smo-teiv-ran-equipment") .namespace("urn:rdns:o-ran:smo:teiv:o-ran-smo-teiv-ran-equipment") .domain("RAN_EQUIPMENT") .includedModules(new ArrayList<>(List.of( "o-ran-smo-teiv-common-yang-types", - "o-ran-smo-teiv-common-yang-extensions", "ietf-geo-location"))).build(), + "o-ran-smo-teiv-common-yang-extensions", "ietf-geo-location"))).build()); + mockModuleRefFromYangParser.add( Module.builder().name("o-ran-smo-teiv-ran-equipment-to-logical") .namespace("urn:rdns:o-ran:smo:teiv:ericsson-topologyandinventory-ran-logical-to-equipment") .domain("EQUIPMENT_TO_RAN_LOGICAL") .includedModules(new ArrayList<>(List.of( "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-common-yang-extensions", "o-ran-smo-teiv-ran-logical", - "o-ran-smo-teiv-ran-equipment"))).build(), + "o-ran-smo-teiv-ran-equipment"))).build()); + mockModuleRefFromYangParser.add( Module.builder().name("o-ran-smo-teiv-ran-oam-to-cloud") .namespace("urn:rdns:o-ran:smo:teiv:o-ran-smo-teiv-ran-oam-to-cloud") .domain("RAN_OAM_TO_CLOUD") @@ -254,7 +279,7 @@ class EndToEndTest { ); //spotless:on - List actualResult = Processor.storeRelatedModuleRefsFromIncludedModules(mockEntitiesFromModelSvc, + List actualResult = storeRelatedModuleRefsFromIncludedModules(mockEntitiesFromModelSvc, mockModuleRefFromYangParser); actualResult.forEach(actual -> { diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java index f85353e..113ea24 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java @@ -31,8 +31,8 @@ import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -47,10 +47,18 @@ public class TestHelper { return tables.stream().map(Table::getName).sorted().toList(); } + public static List extractColumnNames(List columns) { + return columns.stream().map(Column::getName).sorted().toList(); + } + public static List extractColumnNamesForATable(List columns) { return columns.stream().map(Column::getName).sorted().toList(); } + public static List extractIndexName(Column column) { + return column.getPostgresIndexList().stream().map(PostgresIndex::getIndexName).sorted().toList(); + } + public static List extractConstraintName(Collection postgresConstraints) { return postgresConstraints.stream().map(PostgresConstraint::getConstraintName).map(String::toUpperCase).sorted() .toList(); @@ -61,10 +69,10 @@ public class TestHelper { } public static Map> identifiedModelChangeMapping() { - Map> storeIdentifiedChangesToModels = new HashMap<>(); - storeIdentifiedChangesToModels.put("CREATE", new ArrayList<>()); - storeIdentifiedChangesToModels.put("ALTER", new ArrayList<>()); + Map> storeIdentifiedChangesToModels = new LinkedHashMap<>(); storeIdentifiedChangesToModels.put("DEFAULT", new ArrayList<>()); + storeIdentifiedChangesToModels.put("ALTER", new ArrayList<>()); + storeIdentifiedChangesToModels.put("CREATE", new ArrayList<>()); return storeIdentifiedChangesToModels; } diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java index 138bf52..a053fae 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java @@ -40,13 +40,13 @@ class YangParserTest { List moduleList = yangParser.returnAllModuleReferences(); - Assertions.assertEquals(5, moduleList.size()); + Assertions.assertEquals(8, moduleList.size()); List allModuleReferenceNames = moduleList.stream().map(Module::getName).sorted().toList(); - Assertions.assertEquals(allModuleReferenceNames, Stream.of("o-ran-smo-teiv-common-yang-extensions", - "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-rel-equipment-ran", - "o-ran-smo-teiv-ran").sorted().toList()); + Assertions.assertEquals(allModuleReferenceNames, Stream.of("_3gpp-common-yang-types", "ietf-geo-location", + "o-ran-smo-teiv-common-yang-extensions", "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", + "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-ran", "test-built-in-module").sorted().toList()); } } diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java index ce97ec6..f3867c0 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java @@ -20,6 +20,8 @@ */ package org.oran.smo.teiv.pgsqlgenerator.schema; +import org.oran.smo.teiv.pgsqlgenerator.IndexType; +import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.oran.smo.teiv.pgsqlgenerator.Table; import org.oran.smo.teiv.pgsqlgenerator.Column; import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint; @@ -46,14 +48,14 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -67,20 +69,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -101,20 +103,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -124,19 +126,19 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -157,20 +159,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -180,20 +182,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId123").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -212,20 +214,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -235,7 +237,7 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), @@ -248,7 +250,7 @@ class BackwardCompatibilityCheckerTest { Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -268,20 +270,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -291,18 +293,18 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").build(), + Column.builder().name("id").dataType("TEXT").build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -318,20 +320,20 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id_123") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("NRCellDU").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -344,6 +346,84 @@ class BackwardCompatibilityCheckerTest { } + @Test + void verifyExceptionThrownOnColumnIndexModifiedWhenGreenfieldDisabledTest() { + // Given baseline + List
mockBaselineEntities = List.of( + Table.builder().name("Sector").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").build(), + Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), + Column.builder().name("geo-location").dataType("geography").build())).build(), + Table.builder().name("Namespace").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( + PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") + .columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build())).build(), + Table.builder().name("NRCellDU").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( + PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") + .columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").postgresIndexList(List.of( + PostgresIndex.builder().tableNameToAddIndexTo("NRCellDU").columnNameToAddIndexTo("name") + .indexName("IDX_GIN_NRCellDU_name").indexType(IndexType.GIN).build())).build())).build()); + // When - entities from Model svc with remove column index + mockModelServiceEntities = List.of( + Table.builder().name("Sector").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").build(), + Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), + Column.builder().name("geo-location").dataType("geography").build())).build(), + Table.builder().name("Namespace").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( + PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") + .columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build())).build(), + Table.builder().name("NRCellDU").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( + PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") + .columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build())).build()); + // Then + Assertions.assertEquals( + String.format("NBC change has been introduced: modified/removed index IDX_GIN_NRCellDU_name for column(NRCellDU.name) present in baseline, please make sure you've enabled green-field installation!!%nFor more info please refer to README"), + Assertions.assertThrowsExactly(PgSchemaGeneratorException.class, () -> nbcChecker.checkForNBCChangesInData( + mockBaselineEntities, mockModelServiceEntities)).getMessage()); + // When - entities from Model svc with modified column index + mockModelServiceEntities = List.of( + Table.builder().name("Sector").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").build(), + Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), + Column.builder().name("geo-location").dataType("geography").build())).build(), + Table.builder().name("Namespace").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( + PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") + .columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build())).build(), + Table.builder().name("NRCellDU").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( + PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id") + .columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").postgresIndexList(List.of( + PostgresIndex.builder().tableNameToAddIndexTo("NRCellDU").columnNameToAddIndexTo("name") + .indexName("IDX_GIN_NRCellDU_name").indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build())).build())).build()); + // Then + Assertions.assertEquals( + String.format("NBC change has been introduced: modified/removed index IDX_GIN_NRCellDU_name for column(NRCellDU.name) present in baseline, please make sure you've enabled green-field installation!!%nFor more info please refer to README"), + Assertions.assertThrowsExactly(PgSchemaGeneratorException.class, () -> nbcChecker.checkForNBCChangesInData( + mockBaselineEntities, mockModelServiceEntities)).getMessage()); + } + //Data:Relationships @Test void verifyExceptionThrownOnModifiedRelationshipCardinalityWhenGreenfieldDisabledTest() { @@ -353,18 +433,18 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("REL_FK_managed-Namespace").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(), - Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("REL_FK_managed-Namespace").dataType("TEXT").postgresConstraints(List.of()).build(), + Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of( UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Sector") .columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -375,19 +455,19 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("REL_FK_managed-by-Sector").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(), - Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("REL_FK_managed-by-Sector").dataType("TEXT").postgresConstraints(List.of()).build(), + Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of( UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Namespace") .columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build()); @@ -403,26 +483,26 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("SECTOR_MANAGES_NAMESPACE").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("SECTOR_MANAGES_NAMESPACE").constraintName("PK_SECTOR_MANAGES_NAMESPACE_id") .columnToAddConstraintTo("id").build())).build(), - Column.builder().name("aSide_Sector").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("aSide_Sector").dataType("TEXT").postgresConstraints(List.of( UniqueConstraint.builder().constraintName("FK_SECTOR_MANAGES_NAMESPACE_aSide_Sector") .tableName("SECTOR_MANAGES_NAMESPACE").columnToAddConstraintTo("aSide_Sector").build())).build(), - Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("bSide_Namespace").dataType("TEXT").postgresConstraints(List.of( UniqueConstraint.builder().constraintName("FK_SECTOR_MANAGES_NAMESPACE_bSide_Namespace") .tableName("SECTOR_MANAGES_NAMESPACE").columnToAddConstraintTo("bSide_Namespace").build())).build())).build()); @@ -439,19 +519,19 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("REL_FK_managed-by-Sector").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(), - Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("REL_FK_managed-by-Sector").dataType("TEXT").postgresConstraints(List.of()).build(), + Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of( UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Namespace") .columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build()); @@ -460,18 +540,18 @@ class BackwardCompatibilityCheckerTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("REL_FK_managed-Namespace").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(), - Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("REL_FK_managed-Namespace").dataType("TEXT").postgresConstraints(List.of()).build(), + Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of( UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Sector") .columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id") .columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java index 9fa8da9..5404182 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java @@ -124,14 +124,14 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); // spotless:on @@ -157,13 +157,13 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").defaultValue("hello-to-the-world").build())).build()); // spotless:on @@ -204,13 +204,13 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), Column.builder().name("namespaceId").dataType("DECIMAL").build())).build()); @@ -250,22 +250,22 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("REL_FK_serviced-sector").dataType("VARCHAR(511)") + Column.builder().name("REL_FK_serviced-sector").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_serviced-sector").tableName("Sector") .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_serviced-sector").build())).build(), - Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("VARCHAR(511)") + Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("TEXT") .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace") .tableName("Sector").columnToAddConstraintTo("REL_ID_serviced-sector_serving-namespace").build())).build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("REL_FK_serving-namespace").dataType("VARCHAR(511)") + Column.builder().name("REL_FK_serving-namespace").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_serving-namespace").tableName("Namespace") .referencedTable("Sector").columnToAddConstraintTo("REL_FK_serving-namespace").build())).build())).build()); @@ -292,19 +292,19 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("REL_FK_serving-namespace").dataType("VARCHAR(511)") + Column.builder().name("REL_FK_serving-namespace").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_serving-namespace") .tableName("Namespace").referencedTable("Sector").columnToAddConstraintTo("REL_FK_serving-namespace").build())).build(), - Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("VARCHAR(511)") + Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("TEXT") .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_serviced-sector_serving-namespace") .tableName("Namespace").columnToAddConstraintTo("REL_ID_serviced-sector_serving-namespace").build())).build())).build()); @@ -331,19 +331,19 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("REL_FK_serviced-sector").dataType("VARCHAR(511)") + Column.builder().name("REL_FK_serviced-sector").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_serviced-sector").tableName("Sector").referencedTable("Namespace") .columnToAddConstraintTo("REL_FK_serviced-sector").build())).build(), - Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("VARCHAR(511)") + Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("TEXT") .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace").tableName("Sector") .columnToAddConstraintTo("REL_ID_serviced-sector_serving-namespace").build())).build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); // spotless:on @@ -369,23 +369,23 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build(), Table.builder().name("REL_serviced-sector_serving-namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-namespace_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-namespace_id") .tableName("REL_serviced-sector_serving-namespace").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("aSide_Sector").dataType("VARCHAR(511)") + Column.builder().name("aSide_Sector").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-namespace_aSide_Sector") .tableName("REL_serviced-sector_serving-namespace").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(), - Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)") + Column.builder().name("bSide_Namespace").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-namespace_bSide_Namespace") .tableName("REL_serviced-sector_serving-namespace").referencedTable("Namespace").columnToAddConstraintTo("bSide_Namespace").build())).build())).build()); // spotless:on @@ -411,18 +411,18 @@ class SchemaParserTest { List
expectedResult = List.of(Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("REL_serviced-sector_serving-sector").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-sector_id") + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-sector_id") .tableName("REL_serviced-sector_serving-sector").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("aSide_Sector").dataType("VARCHAR(511)") + Column.builder().name("aSide_Sector").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-sector_aSide_Sector") .tableName("REL_serviced-sector_serving-sector").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(), - Column.builder().name("bSide_Sector").dataType("VARCHAR(511)") + Column.builder().name("bSide_Sector").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-sector_bSide_Sector") .tableName("REL_serviced-sector_serving-sector").referencedTable("Sector").columnToAddConstraintTo("bSide_Sector").build())).build())).build()); // spotless:on @@ -454,8 +454,8 @@ class SchemaParserTest { // Check if all columns for each table were added correctly Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size()); - List allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated); - List allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected); + List allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNames(columnsInGenerated); + List allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNames(columnsInExpected); // Check if generatedResult contains all columns for a table Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult); @@ -465,7 +465,7 @@ class SchemaParserTest { .findFirst().ifPresent(columnInGenerated -> { if (columnInExpected.getName().equals("id")) { - Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType()); + Assertions.assertEquals("TEXT", columnInGenerated.getDataType()); Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints())); } diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java index 20c81bb..78b4add 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java @@ -84,10 +84,10 @@ public class GreenFieldInstallationTest { void verifyNoExceptionsThrownForNBCWhenGreenfieldEnabled() { //Given List
mockModelServiceEntities = List.of(Table.builder().name("Sector").columns(List.of(Column.builder().name( - "azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("VARCHAR(511)") - .postgresConstraints(List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName( - "PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name( - "sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name( + "azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("TEXT").postgresConstraints( + List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id") + .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId") + .dataType("jsonb").defaultValue("101").build(), Column.builder().name( "geo-location").dataType("geography").build())).build()); // When @@ -99,7 +99,7 @@ public class GreenFieldInstallationTest { // When List
mockBaselineEntitiesColumnRenamed = List.of(Table.builder().name("Sector").columns(List.of(Column - .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("VARCHAR(511)") + .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("TEXT") .postgresConstraints(List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName( "PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name( "sectorId123").dataType("jsonb").defaultValue("101").build(), Column.builder().name( @@ -111,7 +111,7 @@ public class GreenFieldInstallationTest { // When List
mockBaselineEntitiesColumnDeleted = List.of(Table.builder().name("Sector").columns(List.of(Column - .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("VARCHAR(511)") + .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("TEXT") .postgresConstraints(List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName( "PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name( "geo-location").dataType("geography").build())).build()); diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java index b428154..16168a5 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java @@ -45,13 +45,13 @@ class ModelComparatorTest { Table.builder().name("Sector").columns( List.of( Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build(), Table.builder().name("Namespace").columns( List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); //spotless:on @@ -70,7 +70,7 @@ class ModelComparatorTest { // Given baseline mock data List
baselineEntitiesTableMissing = List.of(Table.builder().name("Sector").columns( List.of(Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build()); @@ -78,7 +78,7 @@ class ModelComparatorTest { // Correct result of difference below Map> correctMappedDifferences = TestHelper.identifiedModelChangeMapping(); correctMappedDifferences.get("CREATE").add(Table.builder().name("Namespace").columns( - List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); @@ -102,7 +102,7 @@ class ModelComparatorTest { // Given baseline mock data List
baselineEntitiesWIthColumnAndTableMissing = List.of(Table.builder().name("Sector").columns( - List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name("geo-location").dataType("geography").build())).build()); @@ -110,7 +110,7 @@ class ModelComparatorTest { // Correct result of difference below Map> correctMappedDifferences = TestHelper.identifiedModelChangeMapping(); correctMappedDifferences.get("CREATE").add(Table.builder().name("Namespace").columns( - List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); correctMappedDifferences.get("ALTER") @@ -136,7 +136,7 @@ class ModelComparatorTest { // Given baseline mock data List
baselineEntitiesWIthColumnAndTableAndDefaultValueMissing = List.of(Table.builder().name("Sector").columns( - List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build())).build()); @@ -144,7 +144,7 @@ class ModelComparatorTest { // Correct result of difference below Map> correctMappedDifferences = TestHelper.identifiedModelChangeMapping(); correctMappedDifferences.get("CREATE").add(Table.builder().name("Namespace").columns( - List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of( + List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of( PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build())).build()); correctMappedDifferences.get("ALTER") diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java index 7e9041d..fc33adc 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java @@ -20,10 +20,6 @@ */ package org.oran.smo.teiv.pgsqlgenerator.schema.data; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; import org.junit.jupiter.api.Assertions; @@ -65,131 +61,172 @@ class TableBuilderTest { //spotless:off List entities = List.of( - Entity.builder().entityName("Sector").attributes( + Entity.builder().entityName("EntityA").storedAt("module-a_EntityA").attributes( List.of( Attribute.builder().name("azimuth").dataType("DECIMAL").build(), - Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Attribute.builder().name("id").dataType("TEXT").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), Attribute.builder().name("geo-location").dataType("geography").build(), Attribute.builder().name("sectorId").dataType("jsonb").build())) - .moduleReferenceName("").build(), + .moduleReferenceName("") + .build(), - Entity.builder().entityName("Namespace").attributes( + Entity.builder().entityName("EntityB").storedAt("module-b_EntityB").attributes( List.of( - Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") + Attribute.builder().name("id").dataType("TEXT").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), Attribute.builder().name("name").dataType("TEXT").build())) - .moduleReferenceName("").build()); + .build()); List> relationships = List.of( - List.of(Relationship.builder().name("oneToOne") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(1) - .bSideAssociationName("used-by-Namespace") - .bSideMOType("Namespace") - .bSideMinCardinality(0) - .bSideMaxCardinality(1) - .relationshipDataLocation("A_SIDE") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(false) - .moduleReferenceName("").build()), - List.of(Relationship.builder().name("oneToMany") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(1) - .bSideAssociationName("used-by-Namespace") - .bSideMOType("Namespace") - .bSideMinCardinality(0) - .bSideMaxCardinality(100) - .relationshipDataLocation("B_SIDE") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(false) - .moduleReferenceName("").build()), - List.of(Relationship.builder().name("manyToOne") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(100) - .bSideAssociationName("used-by-Namespace") - .bSideMOType("Namespace") - .bSideMinCardinality(0) - .bSideMaxCardinality(1) - .relationshipDataLocation("A_SIDE") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(false) - .moduleReferenceName("").build()), - List.of(Relationship.builder().name("manyToMany") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(100) - .bSideAssociationName("used-by-Namespace") - .bSideMOType("Namespace") - .bSideMinCardinality(0) - .bSideMaxCardinality(100) - .relationshipDataLocation("RELATION") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(false) - .moduleReferenceName("").build()), - // Relationship connecting same entity 1:1 - List.of(Relationship.builder().name("relationshipConnectingSameEntity") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(1) - .bSideAssociationName("used-by-Sector") - .bSideMOType("Sector") - .bSideMinCardinality(0) - .bSideMaxCardinality(1) - .relationshipDataLocation("RELATION") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(true) - .moduleReferenceName("").build()), - // Relationship connecting same entity 1:N - List.of(Relationship.builder().name("relationshipConnectingSameEntity") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(1) - .bSideAssociationName("used-by-Sector") - .bSideMOType("Sector") - .bSideMinCardinality(0) - .bSideMaxCardinality(100) - .relationshipDataLocation("RELATION") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(true) - .moduleReferenceName("").build()), - // Relationship connecting same entity N:1 - List.of(Relationship.builder().name("relationshipConnectingSameEntity") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(100) - .bSideAssociationName("used-by-Sector") - .bSideMOType("Sector") - .bSideMinCardinality(0) - .bSideMaxCardinality(1) - .relationshipDataLocation("RELATION") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(true) - .moduleReferenceName("").build()), - // Relationship connecting same entity N:M - List.of(Relationship.builder().name("relationshipConnectingSameEntity") - .aSideAssociationName("used-Sector") - .aSideMOType("Sector") - .aSideMinCardinality(0) - .aSideMaxCardinality(100) - .bSideAssociationName("used-by-Sector") - .bSideMOType("Sector") - .bSideMinCardinality(0) - .bSideMaxCardinality(100) - .relationshipDataLocation("RELATION") - .associationKind("BI_DIRECTIONAL") - .connectSameEntity(true) - .moduleReferenceName("").build())); + List.of(Relationship.builder().name("oneToOne") + .aSideAssociationName("used-EntityB") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(1) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityB") + .bSideModule("module-b") + .bSideMinCardinality(0) + .bSideMaxCardinality(1) + .relationshipDataLocation("A_SIDE") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a_EntityA") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-b_EntityB") + .moduleReferenceName("").build()), + List.of(Relationship.builder().name("oneToMany") + .aSideAssociationName("used-EntityB") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(1) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityB") + .bSideModule("module-b") + .bSideMinCardinality(0) + .bSideMaxCardinality(100) + .relationshipDataLocation("A_SIDE") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-b_EntityB") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-b_EntityB") + .moduleReferenceName("").build()), + List.of(Relationship.builder().name("ManyToOne") + .aSideAssociationName("used-EntityB") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(100) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityB") + .bSideModule("module-b") + .bSideMinCardinality(0) + .bSideMaxCardinality(1) + .relationshipDataLocation("A_SIDE") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a_EntityA") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-b_EntityB") + .moduleReferenceName("").build()), + List.of(Relationship.builder().name("ManyToMany") + .aSideAssociationName("used-EntityB") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(100) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityB") + .bSideModule("module-b") + .bSideMinCardinality(0) + .bSideMaxCardinality(100) + .relationshipDataLocation("RELATION") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a-b_ManyToMany") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-b_EntityB") + .moduleReferenceName("module-a-b").build()), + // Relationship connecting same entity 1:1 + List.of(Relationship.builder().name("relationshipConnectingSameEntity") + .aSideAssociationName("used-EntityA") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(1) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityA") + .bSideModule("module-a") + .bSideMinCardinality(0) + .bSideMaxCardinality(1) + .relationshipDataLocation("RELATION") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a_relationshipConnectingSameEntity") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-a_EntityA") + .moduleReferenceName("module-a").build()), + // Relationship connecting same entity 1:N + List.of(Relationship.builder().name("relationshipConnectingSameEntity") + .aSideAssociationName("used-EntityA") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(1) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityA") + .bSideModule("module-a") + .bSideMinCardinality(0) + .bSideMaxCardinality(100) + .relationshipDataLocation("RELATION") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a_relationshipConnectingSameEntity") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-a_EntityA") + .moduleReferenceName("module-a").build()), + // Relationship connecting same entity N:1 + List.of(Relationship.builder().name("relationshipConnectingSameEntity") + .aSideAssociationName("used-EntityA") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(100) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityA") + .bSideModule("module-a") + .bSideMinCardinality(0) + .bSideMaxCardinality(1) + .relationshipDataLocation("RELATION") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a_relationshipConnectingSameEntity") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-a_EntityA") + .moduleReferenceName("module-a").build()), + // Relationship connecting same entity N:M + List.of(Relationship.builder().name("relationshipConnectingSameEntity") + .aSideAssociationName("used-EntityA") + .aSideMOType("EntityA") + .aSideModule("module-a") + .aSideMinCardinality(0) + .aSideMaxCardinality(100) + .bSideAssociationName("used-by-EntityA") + .bSideMOType("EntityA") + .bSideModule("module-a") + .bSideMinCardinality(0) + .bSideMaxCardinality(100) + .relationshipDataLocation("RELATION") + .associationKind("BI_DIRECTIONAL") + .connectSameEntity(false) + .storedAt("module-a_relationshipConnectingSameEntity") + .aSideStoredAt("module-a_EntityA") + .bSideStoredAt("module-a_EntityA") + .moduleReferenceName("module-a").build())); //spotless:on @Test @@ -198,34 +235,34 @@ class TableBuilderTest { //spotless:off // Given - List
expectedResult = List.of(Table.builder().name("Sector").columns( - List.of( - Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") - .tableName("Sector").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("sectorId").dataType("jsonb").build(), - Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name("REL_FK_used-Sector").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_used-Sector").tableName("Sector") - .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_used-sector").build())).build(), - Column.builder().name("REL_ID_oneToOne").dataType("VARCHAR(511)") - .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_oneToOne").tableName("Sector") - .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(), - Column.builder().name("REL_CD_sourceIds_oneToOne").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(), + List
expectedResult = List.of(Table.builder().name("module-a_EntityA").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id") + .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("sectorId").dataType("jsonb").build(), + Column.builder().name("geo-location").dataType("geography").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name("REL_FK_used-EntityB").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_MODULE-A_ENTITYA_REL_FK_USED-ENTITYB").tableName("module-a_EntityA") + .referencedTable("module-b_EntityB").columnToAddConstraintTo("REL_FK_used-EntityB").build())).build(), + Column.builder().name("REL_ID_oneToOne").dataType("TEXT") + .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_MODULE-A_ENTITYA_REL_ID_ONETOONE").tableName("module-a_EntityA") + .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(), + Column.builder().name("REL_CD_sourceIds_oneToOne").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(), Column.builder().name(String.format("REL_CD_%s_oneToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), Column.builder().name(String.format("REL_CD_%s_oneToOne", DECORATORS)).dataType(JSONB).defaultValue("{}").build())).build(), - Table.builder().name("Namespace").columns( - List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") - .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); + Table.builder().name("module-b_EntityB").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id") + .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on @@ -242,34 +279,34 @@ class TableBuilderTest { //spotless:off // Given - List
expectedResult = List.of(Table.builder().name("Sector").columns( - List.of( - Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") - .tableName("Sector").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("sectorId").dataType("jsonb").build(), - Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), - - Table.builder().name("Namespace").columns( - List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") - .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name("REL_FK_used-by-Namespace").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_used-by-Namespace") - .tableName("Namespace").referencedTable("Sector").columnToAddConstraintTo("REL_FK_used-by-Namespace").build())).build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(), - Column.builder().name("REL_ID_oneToMany").dataType("VARCHAR(511)") - .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_oneToMany").tableName("Namespace") - .columnToAddConstraintTo("REL_ID_oneToMany").build())).build(), - Column.builder().name("REL_CD_sourceIds_oneToMany").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("REL_CD_%s_oneToMany", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("REL_CD_%s_oneToMany", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); + List
expectedResult = List.of(Table.builder().name("module-a_EntityA").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id") + .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("sectorId").dataType("jsonb").build(), + Column.builder().name("geo-location").dataType("geography").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), + + Table.builder().name("module-b_EntityB").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id") + .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name("REL_FK_used-by-EntityA").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-b_EntityB_REL_FK_used-by-EntityA") + .tableName("module-b_EntityB").referencedTable("module-a_EntityA").columnToAddConstraintTo("REL_FK_used-by-EntityA").build())).build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(), + Column.builder().name("REL_ID_oneToMany").dataType("TEXT") + .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_module-b_EntityB_REL_ID_oneToMany").tableName("module-b_EntityB") + .columnToAddConstraintTo("REL_ID_oneToMany").build())).build(), + Column.builder().name("REL_CD_sourceIds_oneToMany").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("REL_CD_%s_oneToMany", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("REL_CD_%s_oneToMany", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on // When @@ -286,32 +323,33 @@ class TableBuilderTest { //spotless:off // Given - List
expectedResult = List.of(Table.builder().name("Sector").columns( - List.of( - Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") - .tableName("Sector").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("sectorId").dataType("jsonb").build(), - Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(), - Column.builder().name("REL_FK_used-Sector").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_used-Sector").tableName("Sector") - .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_used-sector").build())).build(), - Column.builder().name("REL_ID_manyToOne").dataType("VARCHAR(511)") - .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_manyToOne").tableName("Sector") - .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(), - Column.builder().name("REL_CD_sourceIds_manyToOne").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("REL_CD_%s_manyToOne", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("REL_CD_%s_manyToOne", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), - - Table.builder().name("Namespace").columns( - List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") - .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + List
expectedResult = List.of(Table.builder().name("module-a_EntityA").columns( + + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id") + .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("sectorId").dataType("jsonb").build(), + Column.builder().name("geo-location").dataType("geography").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name("REL_FK_used-EntityB").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_MODULE-A_ENTITYA_REL_FK_USED-ENTITYB").tableName("module-a_EntityA") + .referencedTable("module-b_EntityB").columnToAddConstraintTo("REL_FK_used-EntityB").build())).build(), + Column.builder().name("REL_ID_ManyToOne").dataType("TEXT") + .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_MODULE-A_ENTITYA_REL_ID_MANYTOONE").tableName("module-a_EntityA") + .columnToAddConstraintTo("REL_ID_ManyToOne").build())).build(), + Column.builder().name("REL_CD_sourceIds_ManyToOne").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(), + Column.builder().name(String.format("REL_CD_%s_ManyToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), + Column.builder().name(String.format("REL_CD_%s_ManyToOne", DECORATORS)).dataType(JSONB).defaultValue("{}").build())).build(), + + Table.builder().name("module-b_EntityB").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id") + .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on @@ -328,37 +366,37 @@ class TableBuilderTest { void checkManyToManyRelationshipMappingTest() { //spotless:off // Given - List
expectedResult = List.of(Table.builder().name("Sector").columns( - List.of( - Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") - .tableName("Sector").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("sectorId").dataType("jsonb").build(), - Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + List
expectedResult = List.of(Table.builder().name("module-a_EntityA").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id") + .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("sectorId").dataType("jsonb").build(), + Column.builder().name("geo-location").dataType("geography").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), - Table.builder().name("Namespace").columns( - List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id") - .tableName("Namespace").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("name").dataType("TEXT").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Table.builder().name("module-b_EntityB").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id") + .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("name").dataType("TEXT").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), - Table.builder().name("manyToMany").columns( - List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_manyToMany_id") - .tableName("manyToMany").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("aSide_Sector").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_manyToMany_aSide_Sector") - .tableName("manyToMany").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(), - Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_manyToMany_bSide_Namespace") - .tableName("manyToMany").referencedTable("Namespace").columnToAddConstraintTo("bSide_Namespace").build())).build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Table.builder().name("module-a-b_ManyToMany").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a-b_ManyToMany_id") + .tableName("module-a-b_ManyToMany").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("aSide_EntityA").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a-b_ManyToMany_aSide_EntityA") + .tableName("module-a-b_ManyToMany").referencedTable("module-a_EntityA").columnToAddConstraintTo("aSide_EntityA").build())).build(), + Column.builder().name("bSide_EntityB").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a-b_manyToMany_bSide_EntityB") + .tableName("module-a-b_ManyToMany").referencedTable("module-b_EntityB").columnToAddConstraintTo("bSide_EntityB").build())).build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on @@ -375,40 +413,42 @@ class TableBuilderTest { //spotless:off List sameEntities = List.of( - Entity.builder().entityName("Sector").attributes( - List.of(Attribute.builder().name("azimuth").dataType("DECIMAL").build(), - Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") + Entity.builder().entityName("EntityA").storedAt("module-a_EntityA").attributes( + List.of( + Attribute.builder().name("azimuth").dataType("DECIMAL").build(), + Attribute.builder().name("id").dataType("TEXT").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") .tableName("Sector").columnToAddConstraintTo("id").build())).build(), - Attribute.builder().name("sectorId").dataType("jsonb").build(), - Attribute.builder().name("geo-location").dataType("geography").build())) - .moduleReferenceName("").build()); + Attribute.builder().name("geo-location").dataType("geography").build(), + Attribute.builder().name("sectorId").dataType("jsonb").build())) + .moduleReferenceName("") + .build()); // Given - List
expectedResult = List.of(Table.builder().name("Sector").columns( - List.of( - Column.builder().name("azimuth").dataType("DECIMAL").build(), - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id") - .tableName("Sector").columnToAddConstraintTo("id").build())).build(), - Column.builder().name("sectorId").dataType("jsonb").build(), - Column.builder().name("geo-location").dataType("geography").build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), - - Table.builder().name("relationshipConnectingSameEntity").columns( - List.of( - Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder() - .constraintName("PK_relationshipConnectingSameEntity_id").tableName("relationshipConnectingSameEntity").columnToAddConstraintTo("id") + List
expectedResult = List.of(Table.builder().name("module-a_EntityA").columns( + List.of( + Column.builder().name("azimuth").dataType("DECIMAL").build(), + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id") + .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(), + Column.builder().name("sectorId").dataType("jsonb").build(), + Column.builder().name("geo-location").dataType("geography").build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), + + Table.builder().name("module-a_relationshipConnectingSameEntity").columns( + List.of( + Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder() + .constraintName("PK_module-a_relationshipConnectingSameEntity_id").tableName("module-a_relationshipConnectingSameEntity").columnToAddConstraintTo("id") .build())).build(), - Column.builder().name("aSide_Sector").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_relationshipConnectingSameEntity_aSide_Sector") - .tableName("relationshipConnectingSameEntity").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(), - Column.builder().name("bSide_Sector").dataType("VARCHAR(511)") - .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_relationshipConnectingSameEntity_bSide_Sector") - .tableName("relationshipConnectingSameEntity").referencedTable("Sector").columnToAddConstraintTo("bSide_Sector").build())).build(), - Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), - Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); + Column.builder().name("aSide_EntityA").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a_relationshipConnectingSameEntity_aSide_EntityA") + .tableName("module-a_relationshipConnectingSameEntity").referencedTable("module-a_EntityA").columnToAddConstraintTo("aSide_EntityA").build())).build(), + Column.builder().name("bSide_EntityA").dataType("TEXT") + .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a_relationshipConnectingSameEntity_bSide_EntityA") + .tableName("module-a_relationshipConnectingSameEntity").referencedTable("module-a_EntityA").columnToAddConstraintTo("bSide_EntityA").build())).build(), + Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on // When @@ -450,8 +490,8 @@ class TableBuilderTest { // Check if all columns for each table were added correctly Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size()); - List allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated); - List allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected); + List allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNames(columnsInGenerated); + List allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNames(columnsInExpected); // Check if generatedResult contains all columns for a table Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult); @@ -461,7 +501,7 @@ class TableBuilderTest { .findFirst().ifPresent(columnInGenerated -> { if (columnInExpected.getName().equals("id")) { - Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType()); + Assertions.assertEquals("TEXT", columnInGenerated.getDataType()); Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints())); } @@ -487,10 +527,10 @@ class TableBuilderTest { .ifPresent(constraint1 -> { // Check table name where constraint is to be added - Assertions.assertEquals(constraint.getTableToAddConstraintTo(), constraint.getTableToAddConstraintTo()); + Assertions.assertEquals(constraint.getTableToAddConstraintTo(), constraint1.getTableToAddConstraintTo()); // Check column where constraint is to be added - Assertions.assertEquals(constraint.getColumnToAddConstraintTo(), constraint.getColumnToAddConstraintTo()); + Assertions.assertEquals(constraint.getColumnToAddConstraintTo(), constraint1.getColumnToAddConstraintTo()); if (constraint instanceof ForeignKeyConstraint expectedFk) { ForeignKeyConstraint actualFK = (ForeignKeyConstraint) constraint1; @@ -506,16 +546,4 @@ class TableBuilderTest { }); //spotless:on } - - Collection addEModelPrimaryKeyConstraint() { - Collection eModelPrimaryKeyConstraint = new ArrayList<>(); - try { - Constructor constructor = PrimaryKeyConstraint.class.getDeclaredConstructor(); - eModelPrimaryKeyConstraint.add(constructor.newInstance()); - } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { - log.error("Failure in tests --> Error while adding primary key constraint: " + e.getMessage()); - } - return eModelPrimaryKeyConstraint; - } - } diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql index 89da1ee..b952ba2 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql @@ -53,14 +53,14 @@ $$ language 'plpgsql'; INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); CREATE TABLE IF NOT EXISTS ties_data."Sector" ( - "id" VARCHAR(511), + "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( - "id" VARCHAR(511), + "id" TEXT, "name" TEXT ); diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql index 91e2606..4150f94 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql @@ -53,21 +53,21 @@ $$ language 'plpgsql'; INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); CREATE TABLE IF NOT EXISTS ties_data."Sector" ( - "id" VARCHAR(511), + "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( - "id" VARCHAR(511), + "id" TEXT, "name" TEXT ); CREATE TABLE IF NOT EXISTS ties_data."REL_serviced-sector_serving-namespace" ( - "id" VARCHAR(511), - "aSide_Sector" VARCHAR(511), - "bSide_Namespace" VARCHAR(511) + "id" TEXT, + "aSide_Sector" TEXT, + "bSide_Namespace" TEXT ); SELECT ties_data.create_constraint_if_not_exists( diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql index 6cae7ca..4be3ac9 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql @@ -53,16 +53,16 @@ $$ language 'plpgsql'; INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); CREATE TABLE IF NOT EXISTS ties_data."Sector" ( - "id" VARCHAR(511), + "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography", - "REL_FK_serviced-sector" VARCHAR(511), - "REL_ID_serviced-sector_serving-namespace" VARCHAR(511) + "REL_FK_serviced-sector" TEXT, + "REL_ID_serviced-sector_serving-namespace" TEXT ); CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( - "id" VARCHAR(511), + "id" TEXT, "name" TEXT ); diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql index 34c5019..cf40e8c 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql @@ -53,17 +53,17 @@ $$ language 'plpgsql'; INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); CREATE TABLE IF NOT EXISTS ties_data."Sector" ( - "id" VARCHAR(511), + "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( - "id" VARCHAR(511), + "id" TEXT, "name" TEXT, - "REL_FK_serving-namespace" VARCHAR(511), - "REL_ID_serviced-sector_serving-namespace" VARCHAR(511) + "REL_FK_serving-namespace" TEXT, + "REL_ID_serviced-sector_serving-namespace" TEXT ); SELECT ties_data.create_constraint_if_not_exists( diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql index c7057bc..6f1aea5 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql @@ -53,18 +53,18 @@ $$ language 'plpgsql'; INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); CREATE TABLE IF NOT EXISTS ties_data."Sector" ( - "id" VARCHAR(511), + "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography", - "REL_FK_serviced-sector" VARCHAR(511), - "REL_ID_serviced-sector_serving-namespace" VARCHAR(511) + "REL_FK_serviced-sector" TEXT, + "REL_ID_serviced-sector_serving-namespace" TEXT ); CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( - "id" VARCHAR(511), + "id" TEXT, "name" TEXT, - "REL_FK_serving-namespace" VARCHAR(511) + "REL_FK_serving-namespace" TEXT ); SELECT ties_data.create_constraint_if_not_exists( diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql index 1bd776d..90c8237 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql @@ -53,16 +53,16 @@ $$ language 'plpgsql'; INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); CREATE TABLE IF NOT EXISTS ties_data."Sector" ( - "id" VARCHAR(511), + "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); CREATE TABLE IF NOT EXISTS ties_data."REL_serviced-sector_serving-sector" ( - "id" VARCHAR(511), - "aSide_Sector" VARCHAR(511), - "bSide_Sector" VARCHAR(511) + "id" TEXT, + "aSide_Sector" TEXT, + "bSide_Sector" TEXT ); SELECT ties_data.create_constraint_if_not_exists( diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql index 6c71cc4..1f554a0 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql @@ -46,44 +46,34 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "domain" VARCHAR(511), "includedModules" jsonb, "revision" VARCHAR(511), - "content" TEXT, - "ownerAppId" VARCHAR(511), - "status" VARCHAR(127) + "content" TEXT ); CREATE TABLE IF NOT EXISTS ties_model.entity_info ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511), + "storedAt" VARCHAR(511) PRIMARY KEY, + "name" VARCHAR(511) NOT NULL, + "moduleReferenceName" VARCHAR(511) NOT NULL, FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( - "name" VARCHAR(511) PRIMARY KEY, - "aSideAssociationName" TEXT, - "aSideMOType" TEXT, - "aSideMinCardinality" BIGINT, - "aSideMaxCardinality" BIGINT, - "bSideAssociationName" TEXT, - "bSideMOType" TEXT, - "bSideMinCardinality" BIGINT, - "bSideMaxCardinality" BIGINT, - "associationKind" TEXT, - "relationshipDataLocation" TEXT, - "connectSameEntity" BOOLEAN, - "moduleReferenceName" TEXT, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.decorators ( - "name" VARCHAR(511) PRIMARY KEY, - "dataType" VARCHAR(511), - "moduleReferenceName" VARCHAR(511), - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.classifiers ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511), + "name" VARCHAR(511) NOT NULL, + "aSideAssociationName" TEXT NOT NULL, + "aSideMOType" TEXT NOT NULL, + "aSideModule" TEXT NOT NULL, + "aSideMinCardinality" BIGINT NOT NULL, + "aSideMaxCardinality" BIGINT NOT NULL, + "bSideAssociationName" TEXT NOT NULL, + "bSideMOType" TEXT NOT NULL, + "bSideModule" TEXT NOT NULL, + "bSideMinCardinality" BIGINT NOT NULL, + "bSideMaxCardinality" BIGINT NOT NULL, + "associationKind" TEXT NOT NULL, + "relationshipDataLocation" TEXT NOT NULL, + "connectSameEntity" BOOLEAN NOT NULL, + "storedAt" VARCHAR(511) NOT NULL, + "moduleReferenceName" TEXT NOT NULL, + PRIMARY KEY ("name", "moduleReferenceName"), FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); @@ -93,15 +83,15 @@ INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model' COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content", "ownerAppId", "status") FROM stdin; +COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; \. -COPY ties_model.entity_info("name", "moduleReferenceName") FROM stdin; +COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "relationshipDataLocation", "connectSameEntity", "moduleReferenceName") FROM stdin; -ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction 1 1 provided-by-enodebFunction LTESectorCarrier 0 100 BI_DIRECTIONAL B_SIDE false o-ran-smo-teiv-ran -LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier 0 1 used-by-lteSectorCarrier AntennaCapability 0 1 BI_DIRECTIONAL A_SIDE false o-ran-smo-teiv-ran +COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 100 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran:LTESectorCarrier o-ran-smo-teiv-ran +LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran:LTESectorCarrier o-ran-smo-teiv-ran \. ; diff --git a/pgsql-schema-generator/src/test/resources/application.yaml b/pgsql-schema-generator/src/test/resources/application.yaml index 82829f7..8ef6bda 100644 --- a/pgsql-schema-generator/src/test/resources/application.yaml +++ b/pgsql-schema-generator/src/test/resources/application.yaml @@ -32,9 +32,14 @@ schema: baseline: src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql temp-baseline: target/test-classes/01_init-oran-smo-teiv-model_baseline.sql output: target/test-classes/TEST_01_init-oran-smo-teiv-model.sql + consumer-data: + skeleton: scripts/02_init-oran-smo-teiv-consumer-data.sql + baseline: src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql + output: target/test-classes/TEST_02_init-oran-smo-teiv-consumer-data.sql test-result: data: src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql model: src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql + consumer-data: src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql exclusions: model-names: metadata, decorators graphs: diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql index b356a1f..109f6e7 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql @@ -23,6 +23,7 @@ BEGIN; CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; +CREATE EXTENSION IF NOT EXISTS pg_trgm; GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; @@ -51,90 +52,121 @@ $$ language 'plpgsql'; -- Update data schema exec status INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); ---missing CD_sourceIds column and its default value -CREATE TABLE IF NOT EXISTS ties_data."AntennaModule" ( - "id" VARCHAR(511), +--missing consumer data columns, their default values and index +--missing index for antennaBeamWidth +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( + "id" TEXT, "positionWithinSector" TEXT, - "electricalAntennaTilt" BIGINT, - "mechanicalAntennaBearing" BIGINT, + "electricalAntennaTilt" INTEGER, + "mechanicalAntennaBearing" INTEGER, "antennaBeamWidth" jsonb, - "mechanicalAntennaTilt" BIGINT, + "mechanicalAntennaTilt" INTEGER, "antennaModelNumber" TEXT, - "totalTilt" BIGINT, + "totalTilt" INTEGER, "geo-location" geography ); SELECT ties_data.create_constraint_if_not_exists( - 'AntennaModule', - 'PK_AntennaModule_id', - 'ALTER TABLE ties_data."AntennaModule" ADD CONSTRAINT "PK_AntennaModule_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-equipment_AntennaModule', + 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); ---missing eNodeBPlmnId column -CREATE TABLE IF NOT EXISTS ties_data."ENodeBFunction" ( - "id" VARCHAR(511), - "eNBId" BIGINT, +--missing eNodeBPlmnId, classifiers and decorator columns +--missing default value for sourceIds column +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ( + "id" TEXT, + "eNBId" INTEGER, "CD_sourceIds" jsonb ); -ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; - -ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; SELECT ties_data.create_constraint_if_not_exists( - 'ENodeBFunction', - 'PK_ENodeBFunction_id', - 'ALTER TABLE ties_data."ENodeBFunction" ADD CONSTRAINT "PK_ENodeBFunction_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' ); ---missing "ANTENNACAPABILITY_USED_BY_LTESECTORCARRIER" relationship -CREATE TABLE IF NOT EXISTS ties_data."AntennaCapability" ( - "id" VARCHAR(511), +CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +--missing index on JSONB columns +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( + "id" TEXT, "geranFqBands" jsonb, "nRFqBands" jsonb, "eUtranFqBands" jsonb, - "CD_sourceIds" jsonb + "CD_sourceIds" jsonb, + "CD_decorators" jsonb + "CD_classifiers" jsonb ); -ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; SELECT ties_data.create_constraint_if_not_exists( - 'AntennaCapability', - 'PK_AntennaCapability_id', - 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_AntennaCapability_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_AntennaCapability', + 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', + 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); -CREATE TABLE IF NOT EXISTS ties_data."LTESectorCarrier" ( - "id" VARCHAR(511), +--missing "ANTENNACAPABILITY_USED_BY_LTESECTORCARRIER" relationship +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( + "id" TEXT, "sectorCarrierType" TEXT, "CD_sourceIds" jsonb, - "REL_FK_provided-by-enodebFunction" VARCHAR(511), - "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" VARCHAR(511), - "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-enodebFunction" TEXT, + "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" TEXT, + "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, + "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, + "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, ); -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'PK_LTESectorCarrier_id', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "PK_LTESectorCarrier_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."ENodeBFunction" (id) ON DELETE CASCADE;' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' ); -COMMIT; +CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); + +COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql index 089b788..fc61d6f 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql @@ -19,7 +19,6 @@ -- ============LICENSE_END========================================================= -- - BEGIN; DROP SCHEMA IF EXISTS ties_model cascade; @@ -31,60 +30,52 @@ SET default_table_access_method = heap; SET ROLE :'pguser'; CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) + "schema" VARCHAR(127) PRIMARY KEY, + "status" VARCHAR(127) ); CREATE TABLE IF NOT EXISTS ties_model.hash_info ( - "name" VARCHAR(511) PRIMARY KEY, - "hashedValue" VARCHAR(511), - "type" VARCHAR(511) + "name" TEXT PRIMARY KEY, + "hashedValue" VARCHAR(63) NOT NULL, + "type" VARCHAR(511) ); CREATE TABLE IF NOT EXISTS ties_model.module_reference ( - "name" VARCHAR(511) PRIMARY KEY, - "namespace" VARCHAR(511), - "domain" VARCHAR(511), - "includedModules" jsonb, - "revision" VARCHAR(511), - "content" TEXT, - "ownerAppId" VARCHAR(511), - "status" VARCHAR(127) + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "domain" TEXT, + "includedModules" jsonb DEFAULT '[]'::jsonb, + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS ties_model.entity_info ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511), + "storedAt" TEXT PRIMARY KEY, + "name" TEXT NOT NULL, + "moduleReferenceName" TEXT NOT NULL, FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( - "name" VARCHAR(511) PRIMARY KEY, - "aSideAssociationName" TEXT, - "aSideMOType" TEXT, - "aSideMinCardinality" BIGINT, - "aSideMaxCardinality" BIGINT, - "bSideAssociationName" TEXT, - "bSideMOType" TEXT, - "bSideMinCardinality" BIGINT, - "bSideMaxCardinality" BIGINT, - "associationKind" TEXT, - "relationshipDataLocation" TEXT, - "connectSameEntity" BOOLEAN, - "moduleReferenceName" TEXT, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.decorators ( - "name" VARCHAR(511) PRIMARY KEY, - "dataType" VARCHAR(511), - "moduleReferenceName" VARCHAR(511), - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.classifiers ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511), + "name" TEXT NOT NULL, + "aSideAssociationName" TEXT NOT NULL, + "aSideMOType" TEXT NOT NULL, + "aSideModule" TEXT NOT NULL, + "aSideMinCardinality" BIGINT NOT NULL, + "aSideMaxCardinality" BIGINT NOT NULL, + "bSideAssociationName" TEXT NOT NULL, + "bSideMOType" TEXT NOT NULL, + "bSideModule" TEXT NOT NULL, + "bSideMinCardinality" BIGINT NOT NULL, + "bSideMaxCardinality" BIGINT NOT NULL, + "associationKind" TEXT NOT NULL, + "relationshipDataLocation" TEXT NOT NULL, + "storedAt" TEXT NOT NULL, + "connectSameEntity" BOOLEAN NOT NULL, + "moduleReferenceName" TEXT NOT NULL, + PRIMARY KEY ("name", "moduleReferenceName"), + FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); @@ -92,57 +83,64 @@ CREATE TABLE IF NOT EXISTS ties_model.classifiers ( INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; -AntennaModule AntennaModule TABLE -positionWithinSector positionWithinSector COLUMN -electricalAntennaTilt electricalAntennaTilt COLUMN -mechanicalAntennaBearing mechanicalAntennaBearing COLUMN -AntennaBeamWidth AntennaBeamWidth COLUMN -mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD CONSTRAINT +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_sourceIds IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_classifiers IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_sourceIds IDX_6EC539C61EA7078DBA264C9877B87FC263605D42 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_1EBC7271CEA658156DE25286404CBC4593340F8E INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_44075E1D464599B61924196C20F2B88332520CD8 INDEX +PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT +PK_o-ran-smo-teiv-ran_AntennaCapability_id PK_o-ran-smo-teiv-ran_AntennaCapability_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ENodeBFunction_id PK_o-ran-smo-teiv-ran_ENodeBFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_LTESectorCarrier_id PK_o-ran-smo-teiv-ran_LTESectorCarrier_id CONSTRAINT +REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN +REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A CONSTRAINT +antennaBeamWidth antennaBeamWidth COLUMN antennaModelNumber antennaModelNumber COLUMN -totalTilt totalTilt COLUMN -PK_AntennaModule_id PK_AntennaModule_id CONSTRAINT -CloudSite CloudSite TABLE -geo-location geo-location COLUMN -CD_sourceIds CD_sourceIds COLUMN -PK_CloudSite_id PK_CloudSite_id CONSTRAINT -ENodeBFunction ENodeBFunction TABLE eNBId eNBId COLUMN -eNodeBPlmnId eNodeBPlmnId COLUMN -PK_ENodeBFunction_id PK_ENodeBFunction_id CONSTRAINT -AntennaCapability AntennaCapability TABLE +eUtranFqBands eUtranFqBands COLUMN +electricalAntennaTilt electricalAntennaTilt COLUMN +geo-location geo-location COLUMN geranFqBands geranFqBands COLUMN +id id COLUMN +mechanicalAntennaBearing mechanicalAntennaBearing COLUMN +mechanicalAntennaTilt mechanicalAntennaTilt COLUMN nRFqBands nRFqBands COLUMN -eUtranFqBands eUtranFqBands COLUMN -PK_AntennaCapability_id PK_AntennaCapability_id CONSTRAINT -LTESectorCarrier LTESectorCarrier TABLE +o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE +o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE +o-ran-smo-teiv-ran_ENodeBFunction o-ran-smo-teiv-ran_ENodeBFunction TABLE +o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran_LTESectorCarrier TABLE +positionWithinSector positionWithinSector COLUMN sectorCarrierType sectorCarrierType COLUMN -REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN -REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -PK_LTESectorCarrier_id PK_LTESectorCarrier_id CONSTRAINT -UNIQUE_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9 CONSTRAINT -FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction CONSTRAINT +totalTilt totalTilt COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content", "ownerAppId", "status") FROM stdin; -o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsLgoKICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4iOwoKICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICB9CgogIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewoKICAgIGRlc2NyaXB0aW9uCiAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YgYW4KICAgICAgIEEtc2lkZSBhbmQgYSBCLXNpZGUuIFRoZSBBLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgb3JpZ2luYXRpbmcgc2lkZSBvZgogICAgICAgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZyBzaWRlIG9mIHRoZQogICAgICAgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YgaW1wb3J0YW5jZSBhbmQgTVVTVAogICAgICAgTk9UIGJlIGNoYW5nZWQgb25jZSBkZWZpbmVkLgoKICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4gQQogICAgICAgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgcmVsYXRpb25zaGlwLCBhbGwgZGlzdGluZ3Vpc2hlZCBieSByb2xlIG5hbWUuCgogICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQKICAgICAgIHBlciBwYXJlbnQgc3RhdGVtZW50LgoKICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZSB0aGUKICAgICAgIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzIG9mIHRoZQogICAgICAgcmVsYXRpb25zaGlwLiBEYXRhIG5vZGVzIG9mIHR5cGVzICdsZWFmJyBhbmQgJ2xlYWYtbGlzdCcgYXJlIHVzZWQgZm9yCiAgICAgICB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZSAnYS1zaWRlJwogICAgICAgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZSAnYi1zaWRlJwogICAgICAgZXh0ZW5zaW9uLiBPdGhlciBkYXRhIG5vZGVzIGRlZmluZSBwcm9wZXJ0aWVzIG9mIHRoZSByZWxhdGlvbnNoaXAuCgogICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZSBpcwogICAgICAgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUgdW5pcXVlCiAgICAgICB3aXRoaW4gdGhlIHNjb3BlLiI7CgogICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICB9CgogIGV4dGVuc2lvbiBhU2lkZSB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiRGVmaW5lcyB0aGUgQS1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUgb2YKICAgICAgIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUgaXMKICAgICAgIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUgdW5pcXVlCiAgICAgICB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5IG9mCiAgICAgICB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlIHR5cGUuCgogICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgcmVzaWRlcy4gSWYgdGhlCiAgICAgICB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlIHByZWZpeGVkLCBhbmQgYQogICAgICAgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBwcmVmaXguIjsKCiAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgfQoKICBleHRlbnNpb24gYlNpZGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lIG9mCiAgICAgICB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlIGlzCiAgICAgICBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlIHVuaXF1ZQogICAgICAgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eSBvZgogICAgICAgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZSB0eXBlLgoKICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuIElmIHRoZQogICAgICAgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZSBwcmVmaXhlZCwgYW5kIGEKICAgICAgIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZSB0aGUgcHJlZml4LiI7CgogICAgYXJndW1lbnQgYlNpZGVUeXBlOwogIH0KCiAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgYXJndW1lbnQgZG9tYWluTmFtZTsKICB9CgogIGV4dGVuc2lvbiBsYWJlbCB7CiAgICBkZXNjcmlwdGlvbiAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMg4oCYeC55LnrigJkg4oCTIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcyBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuICBaZXJvIG9yIG9uZSByZXZpc2lvbiBsYWJlbCBzdGF0ZW1lbnRzCiAgICAgIHBlciBwYXJlbnQgc3RhdGVtZW50IGFyZSBhbGxvd2VkLgoKICAgICAgUmV2aXNpb24gbGFiZWxzIE1VU1QgYmUgdW5pcXVlIGFtb25nc3QgYWxsIHJldmlzaW9ucyBvZiBhIG1vZHVsZSBvciBzdWJtb2R1bGUuIjsKICAgICAgYXJndW1lbnQgc2VtdmVyc2lvbjsKICB9Cn0= BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKCiAgeWFuZy12ZXJzaW9uIDEuMTsKICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgcHJlZml4IG9yLXRlaXYtdHlwZXM7CgogIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgZGVzY3JpcHRpb24KICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgVGhpcyBtb2RlbCBjb250YWlucyByZS11c2FibGUgZGF0YSB0eXBlcyB0aGF0IHRvcG9sb2d5IGFuZCBpbnZlbnRvcnkgbW9kZWxzCiAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogIH0KCiAgZ3JvdXBpbmcgVG9wX0dycF9UeXBlIHsKCiAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZSBjb21tb24gdG8gYWxsIHR5cGVzLiBBbGwgdHlwZXMKICAgICAgICAgICAgICAgIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICBsZWFmIGlkIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBvZiB0b3BvbG9neSBlbnRpdGllcy4gUmVwcmVzZW50cyB0aGUgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIENNX0lEIHsKCiAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZXMgdG8gbWFrZQogICAgICAgICAgICAgICAgdXNlIG9mIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCAoQ00pLiI7CgogICAgbGVhZiBjbUhhbmRsZSB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIG5ldHdvcmsgZW50aXRpZXMgaW4gQ00uIjsKICAgIH0KCiAgICBsZWFmIHJlc291cmNlSWRlbnRpZmllciB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBkZXNjcmlwdGlvbiAiVGhlIHhwYXRoIGV4cHJlc3Npb24gaWRlbnRpZnlpbmcgdGhlIHJlc291cmNlIGluIHRoZSBOb2RlIG1vZGVsIHlhbmcgdHJlZS4iOwogICAgfQogIH0KCiAgdHlwZWRlZiBfM0dQUF9GRE5fVHlwZSB7CiAgICB0eXBlIHR5cGVzM2dwcDpEaXN0aW5ndWlzaGVkTmFtZTsKICB9CgogIGNvbnRhaW5lciBjb25zdW1lci1kYXRhIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIGNvbnRhaW5lciBkZWZpbmVzIHRoZSBjb25zdW1lci1kYXRhLiBDb25zdW1lci1kYXRhIG1heSBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgIFRoaXMgY29udGFpbmVyIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLgogICAgICAgICAgICAgICAgICBUaGlzIGlzIGRvbmUgdmlhIGF1Z21lbnRhdGlvbnMuIFRoZXkgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICBkZXNjcmlwdGlvbiAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CiAgICAgIHR5cGUgaWRlbnRpdHlyZWYgeyBiYXNlIGNsYXNzaWZpZXI7IH0KICAgIH0KCiAgICBsZWFmLWxpc3Qgc291cmNlSWRzIHsKICAgICAgZGVzY3JpcHRpb24gIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlIHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGFydGljaXBhdGluZwogICAgICAgICAgICAgICAgICBlbnRpdGllcy4iOwogICAgICB0eXBlIHN0cmluZzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUKICAgICAgICAgICAgICAgICAgcGFpci4iOwogICAgfQogIH0KCiAgaWRlbnRpdHkgY2xhc3NpZmllcnsKICAgIGRlc2NyaXB0aW9uICAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMgd2l0aCBpZGVudGl0eS4gIjsKICB9Cn0= BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7DQogICAgeWFuZy12ZXJzaW9uIDEuMTsNCiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yYW4iOw0KICAgIHByZWZpeCBvci10ZWl2LXJhbjsNCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9DQoNCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9DQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4NCg0KICAgIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlDQogICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkNCiAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4iOw0KDQogICAgcmV2aXNpb24gIjIwMjQtMDUtMDIiIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsNCiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOw0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOw0KDQogICAgbGlzdCBHTkJEVUZ1bmN0aW9uIHsNCiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLg0KDQogICAgICAgICAgICAgICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQNCiAgICAgICAgICAgICAgICAgICAgKGdOQi1DVSkgYW5kIGEgZ05CLURVLiBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsDQogICAgICAgICAgICAgICAgICAgIHRpbWUgcHJvdG9jb2xzIGFuZCBzZXJ2aWNlcywgYW5kIHRoZSBEVSBwcm9jZXNzZXMNCiAgICAgICAgICAgICAgICAgICAgUEhZIGxldmVsIHByb3RvY29sIGFuZCByZWFsIHRpbWUgc2VydmljZXMuIFRoZQ0KICAgICAgICAgICAgICAgICAgICBnTkItQ1UgYW5kIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWENCiAgICAgICAgICAgICAgICAgICAgRjEgbG9naWNhbCBpbnRlcmZhY2UuDQoNCiAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIGdOQi1EVToNCiAgICAgICAgICAgICAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQw0KICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuSXMgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaA0KICAgICAgICAgICAgICAgICAgICB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMgY29ubmVjdGVkIHRvIG9ubHkNCiAgICAgICAgICAgICAgICAgICAgb25lIGdOQi1DVS1DUC4gT25lIGdOQi1EVSBjYW4gYmUgY29ubmVjdGVkIHRvDQogICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGdOQi1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUNCiAgICAgICAgICAgICAgICAgICAgZ05CLUNVLUNQLg0KICAgICAgICAgICAgICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DVS1DUCwgbXVsdGlwbGUNCiAgICAgICAgICAgICAgICAgICAgZ05CLUNVLVVQcyBhbmQgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUNCiAgICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UNCiAgICAgICAgICAgICAgICAgICAgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIHRoZSBnTkItRFUgb2JqZWN0LiI7DQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsNCg0KICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHVzZWQgYXMgcGFydCBvZiBQTSBFdmVudHMgZGF0YSI7DQogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGdOQkRVSWQgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZ05CSWQgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEV2b2x2ZWQgTm9kZSBCIChlTm9kZUIpIGlzIHRoZSBvbmx5IG1hbmRhdG9yeQ0KICAgICAgICAgICAgICAgICAgICBub2RlIGluIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0NCiAgICAgICAgICAgICAgICAgICAgRXZvbHV0aW9uIChMVEUpLiBUaGUgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlDQogICAgICAgICAgICAgICAgICAgIHN0YXRpb24gdGhhdCBoYW5kbGVzIHJhZGlvIGNvbW11bmljYXRpb25zDQogICAgICAgICAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZQ0KICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IGFuZCBoYW5kb3ZlciBkZWNpc2lvbnMuIFVubGlrZSAyLzNHDQogICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzIFJBTiwgdGhlcmUgaXMgbm8gY2VudHJhbGl6ZWQgcmFkaW8gbmV0d29yaw0KICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkDQogICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtb2JpbGUgcGhvbmUgbmV0d29yayB0aGF0IGNvbW11bmljYXRlcw0KICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSB3aXRoIG1vYmlsZSBoYW5kc2V0cyAoVXNlciBFcXVpcG1lbnQpLCBsaWtlIGEgYmFzZQ0KICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzDQogICAgICAgICAgICAgICAgICAgIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlciByZXNwb25zZSB0aW1lcy4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIGVOQklkIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIEVOb2RlQiBJRCB0aGF0IGZvcm1zIHBhcnQgb2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ2VsbCBHbG9iYWwgSWRlbnRpdHksIGFuZCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFMxIGludGVyZmFjZSI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICAgICAgZGVmYXVsdCAxMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiBkdXBsZXhUeXBlIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdG9yIG9mIEVVdHJhbkNlbGwgdHlwZSwgRkREIG9yIFRERCI7DQogICAgICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7DQogICAgICAgICAgICAgICAgICAgIGVudW0gdGRkIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVEREIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29udGFpbmVyIGVOb2RlQlBsbW5JZCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgUHVibGljIExhbmQgTW9iaWxlIE5ldHdvcmsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUExNTikgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgSUQgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFMxIGludGVyZmFjZS4gTm90ZTogVGhlIHZhbHVlIChNQ0M9MDAxLCBNTkM9MDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgY2FuIG5vdCBiZSB1c2VkIGFzIGEgdmFsaWQgUExNTiBJZGVudGl0eS4iOw0KDQogICAgICAgICAgICAgICAgbGVhZiBtY2Mgew0KICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE1DQyBwYXJ0IG9mIGEgUExNTiBpZGVudGl0eQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSByYWRpbyBuZXR3b3JrLiI7DQogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMC4uOTk5Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGxlYWYgbW5jIHsNCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOw0KICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDAuLjk5OTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZWFmIG1uY0xlbmd0aCB7DQogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOw0KICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDIuLjM7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsDQogICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgUkJTIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UNCiAgICAgICAgICAgICAgICAgICAgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLiBUaGUgTU8gYWxzbw0KICAgICAgICAgICAgICAgICAgICBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTFRFIGZyZXF1ZW5jeSBiYW5kcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7DQogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7DQogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgaGFyZHdhcmUgc3VwcG9ydHMiOw0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgbGlzdCBMVEVTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBMVEUgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZQ0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIGZvciBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3MNCiAgICAgICAgICAgICAgICAgICAgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZQ0KICAgICAgICAgICAgICAgICAgICBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbiBoYXZpbmcNCiAgICAgICAgICAgICAgICAgICAgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLg0KICAgICAgICAgICAgICAgICAgICBUaGUgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsDQogICAgICAgICAgICAgICAgICAgIGludGVyZmVyZW5jZSBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zDQogICAgICAgICAgICAgICAgICAgIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgew0KICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdG9yIGNhcnJpZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsNCiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsNCiAgICAgICAgICAgICAgICAgICAgZW51bSBub3JtYWxfc2VjdG9yIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDJEUyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3Rvcl8zZHMgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUmlnaHQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3Igew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNaWRkbGUgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7DQogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzDQogICAgICAgICAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGVzIGZvciBkZWZpbmluZyB0aGUgbG9naWNhbA0KICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhDQogICAgICAgICAgICAgICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQNCiAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGJhc2Ugc3RhdGlvbiBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywNCiAgICAgICAgICAgICAgICAgICAgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUgY29uY2VwdA0KICAgICAgICAgICAgICAgICAgICBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsDQogICAgICAgICAgICAgICAgICAgIGludGVyZmVyZW5jZSBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcw0KICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgew0KICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gRnJlcXVlbmN5IENoYW5uZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOw0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGFyZmNuVUwgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsNCiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsNCiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4uMSB0byAwLi4xDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYgdXNlZC1ieS1sdGVTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOw0KICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5Ow0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1sdGVTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRU5vZGVCRnVuY3Rpb247DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LWVub2RlYkZ1bmN0aW9uIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTFRFU2VjdG9yQ2FycmllcjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUlNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQ0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbnJTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOw0KICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5Ow0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BQ0FQQUJJTElUWV9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLjEgdG8gMC4uMSkNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIHVzZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQUNBUEFCSUxJVFlfUFJPVklERVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4uMSB0byAwLi5uKQ0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmIHByb3ZpZGVkLWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQUNBUEFCSUxJVFlfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLm4gdG8gMC4uMSkNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIHNlcnZpY2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFDQVBBQklMSVRZX1JFQUxJU0VEX0JZX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLm4gdG8gMC4ubSkNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQogICAgfQ0KfQ== BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7DQogICAgeWFuZy12ZXJzaW9uIDEuMTsNCiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1lcXVpcG1lbnQiOw0KICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOw0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHtwcmVmaXggb3ItdGVpdi10eXBlczsgfQ0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0NCg0KICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7DQogICAgICAgIHByZWZpeCBnZW87DQogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOw0KICAgIH0NCg0KICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOw0KICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOw0KICAgIGRlc2NyaXB0aW9uDQogICAgIlJBTiBFcXVpcG1lbnQgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQ0KICAgIFJBTiBMb2dpY2FsIGRvbWFpbiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgZnVuY3Rpb25hbCBjYXBhYmlsaXR5DQogICAgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZSByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsNCg0KICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7DQogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7DQogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsNCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsNCg0KICAgIGxpc3QgQW50ZW5uYU1vZHVsZSB7DQogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZQ0KICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4gYW50ZW5uYS4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIGZkbiB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgRnVsbCBEaXN0aW5ndWlzaGVkIE5hbWUgKEZETikgaWRlbnRpZmllcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hU3ViVW5pdCBNTy4gSXQgY29udGFpbnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbCBwYXRoIGZyb20gdGhlIFN1Ym5ldHdvcmsgdG8gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50ZW5uYVN1YlVuaXQuIjsNCiAgICAgICAgICAgICAgICB0eXBlIG9yLXRlaXYtdHlwZXM6XzNHUFBfRkROX1R5cGU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG9wZXJhdGlvbmFsIGltcGFjdC4iOw0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hQmVhcmluZyB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBhbnRlbm5hIHVuaXQgaXMgaW5zdGFsbGVkLiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYXMgdGhlIGluY2xpbmF0aW9uIG9mIHRoZSBhbnRlbm5hDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCByZXNwZWN0IHRvIHRoZSB2ZXJ0aWNhbCBwbGFuZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgcG9zaXRpb25XaXRoaW5TZWN0b3Igew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbCBpbXBhY3QuIjsNCiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUb3RhbCBhbnRlbm5hIGVsZXZhdGlvbiBpbmNsdWRpbmcgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkIHRpbHQgYW5kIHRoZSB0aWx0IGFwcGxpZWQgYnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVtb3RlIEVsZWN0cmljYWwgVGlsdCAoUkVUKS4iOw0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGVsZWN0cmljYWxBbnRlbm5hVGlsdCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYXhpcyAoc2VlIDNHUFAgVFMgMjUuNDY2KS4gVmFsdWUgaXMgc2lnbmVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbHQgZG93biBpcyBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOw0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmLWxpc3QgQW50ZW5uYUJlYW1XaWR0aCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYSByYWRpYXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuIGluIHRoZSBob3Jpem9udGFsIHBsYW5lLiBNZWFzdXJlZCBpbiBkZWdyZWVzLiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZHVwbGV4VHlwZSB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRvciBvZiBFVXRyYW5DZWxsIHR5cGUsIEZERCBvciBUREQiOw0KICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gew0KICAgICAgICAgICAgICAgICAgICBlbnVtIHR5cGUxIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAidHlwZTEiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1VTRVNfQU5URU5OQU1PRFVMRSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLjEpDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LWFudGVubmFNb2R1bGUgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHJlYWxpc2VkIGJ5IEFudGVubmEgTW9kdWxlLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYU1vZHVsZTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYW50ZW5uYU1vZHVsZSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzZXMgQW50ZW5uYSBNb2R1bGUuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hTW9kdWxlOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgIH0NCiAgICB9DQp9 BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsNCiAgICB5YW5nLXZlcnNpb24gMS4xOw0KICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNsb3VkIjsNCiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsNCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9DQoNCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gew0KICAgICAgICBwcmVmaXggZ2VvOw0KICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsNCiAgICB9DQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQ0KICAgIFJBTiBDTE9VRCBkb21haW4sIHdoaWNoIGNvbXByaXNlcyBjbG91ZCBpbmZyYXN0cnVjdHVyZSBhbmQNCiAgICBkZXBsb3ltZW50IGFzcGVjdHMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgdG9wb2xvZ3kgbW9kZWwuIjsNCg0KICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7DQogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7DQogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsNCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOw0KDQogICAgbGlzdCBDbG91ZFNpdGUgew0KICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdA0KICAgICAgICAgICAgICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIG5hbWUgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIFNpdGUiOw0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247DQogICAgICAgIH0NCiAgICB9DQp9 BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-equipment-to-ran urn:o-ran:smo-teiv-equipment-to-ran EQUIPMENT_TO_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudC10by1yYW4gew0KICAgIHlhbmctdmVyc2lvbiAxLjE7DQogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50LXRvLXJhbiI7DQogICAgcHJlZml4IG9yLXRlaXYtZXF1aXB0b3JhbjsNCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9DQoNCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHtwcmVmaXggb3ItdGVpdi1lcXVpcDsgfQ0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9DQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gTG9naWNhbCB0byBFcXVpcG1lbnQgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTG9naWNhbCB0byBFcXVpcG1lbnQgdG9wb2xvZ3kNCiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLiI7DQoNCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgew0KICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOw0KICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlRfVE9fUkFOOw0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQ0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCiAgICB9DQp9DQo= BUILT_IN_MODULE IN_USAGE +COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +_3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CgogIGltcG9ydCBpZXRmLWluZXQtdHlwZXMgeyBwcmVmaXggaW5ldDsgfQogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgeyBwcmVmaXggeWFuZzsgfQogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IHlleHQzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZAogICAgbmV0d29yayBzbGljaW5nLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLAogICAgVFRBLCBUVEMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLiI7CiAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyMyI7CgogIHJldmlzaW9uIDIwMjMtMTEtMDYgeyByZWZlcmVuY2UgQ1ItMDMwNTsgfQogIHJldmlzaW9uIDIwMjMtMDktMTggeyByZWZlcmVuY2UgQ1ItMDI3MSA7IH0KICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CgogIHJldmlzaW9uIDIwMjEtMDktMzAgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIExvbmdpdHVkZSwgTGF0aXR1ZGUsIFRlbnRoT2ZEZWdyZWVzLCBPbk9mZi4iOwogICAgcmVmZXJlbmNlICJDUi0wMTM4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMTEtMDYgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgaW5jb3JyZWN0IFMtTlNTQUkgZGVmaW5pdGlvbnMuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDExOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTAzLTEwIHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGZhdWx0eSB3aGVuIHN0YXRlbWVudHMuIjsKICAgIHJlZmVyZW5jZSAiU1AtMjAwMjI5IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CgogIGdyb3VwaW5nIG5hbWVWYWx1ZVBhaXIgewogICAgbGVhZiBuYW1lIHsgdHlwZSBzdHJpbmc7IH0KICAgIGxlYWYgdmFsdWUgeyB0eXBlIHN0cmluZzsgfQogIH0KCiAgZ3JvdXBpbmcgUHJvY2Vzc01vbml0b3JHcnAgewogICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGF0dHJpYnV0ZXMgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgcHJvY2Vzc2VzCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcwogICAgICB3aGVuIHNwZWNpZnlpbmcgdGhlIG1hbmFnZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgcHJvY2Vzc2VzLgogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LgogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEKICAgICAgY29uY3JldGUgcHJvY2VzcyByZXByZXNlbnRhdGlvbi4KCiAgICAgIElmIGEgbWFuYWdlbWVudCBvcGVyYXRpb24gb24gc29tZSBJT0NzIHRyaWdnZXJzIGFuIGFzc29jaWF0ZWQKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlCiAgICAgICdQcm9jZXNzTW9uaXRvcicpIGluIHRoZXNlIElPQyhzKS4gVGhlIHByb2Nlc3NNb25pdG9yIGF0dHJpYnV0ZSBtYXkgYmUKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IKICAgICAgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBtYXkgYmUgcHJvdmlkZWQgYnkgdGhlICdwcm9ncmVzc1N0YXRlSW5mbycgYW5kCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0bwogICAgICBzdGFydCBleGVjdXRpbmcgdGhlIHByb2Nlc3MgYW5kIHRvIHRyYW5zaXRpb24gaW50byB0aGUgJ1JVTk5JTkcnIHN0YXRlLgogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lCiAgICAgIGFsdGVybmF0aXZlIG11c3QgYmUgc2VsZWN0ZWQgd2hlbiB1c2luZyB0aGlzIGRhdGEgdHlwZS4KCiAgICAgIER1cmluZyB0aGUgJ1JVTk5JTkcnIHN0YXRlIHRoZSAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGUgbWF5IGJlCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8KICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0bwogICAgICBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbiB0aGUgJ05PVF9SVU5OSU5HJywgJ0NBTkNFTExJTkcnCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzCiAgICAgIHVzZWQuCgogICAgICBVcG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJvY2VzcywgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBzZXQKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkCiAgICAgIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuIFRoZSB0eXBlIG9mCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkCiAgICAgIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIHVzZWQuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgdGhlICdzdGF0dXMnCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZgogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZQogICAgICAncmVzdWx0U3RhdGVJbmZvJyBzcGVjaWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUuCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbgogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbiBhcyB3ZWxsLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBpcyBjYW5jZWxsZWQsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgZmlyc3Qgc2V0IHRvCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLgogICAgICBUaGUgdmFsdWUgb2YgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLiBBZGRpdGlvbmFsIHRleHR1YWwKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvcgogICAgICAnQ0FOQ0VMTEVEJy4gSXQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIG1ha2luZyB0aGUgb3V0Y29tZSwgdGhhdCB0aGUKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55CiAgICAgIG1vcmUgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUsIG9yIHRoZSBwcm9jZXNzIG91dGNvbWUgaXMgbmVlZGVkIHVudGlsIGEKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4KICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMKICAgICAgaW5kaWNhdGVkIGJ5IHRoZSAndGltZXInIGF0dHJpYnV0ZS4iOwoKICAgIGxlYWYgaWQgewogICAgICB0eXBlIHN0cmluZzsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJJZCBvZiB0aGUgcHJvY2Vzcy4gSXQgaXMgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZQogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KCiAgICBsZWFmIHN0YXR1cyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gTk9UX1NUQVJURUQgOwogICAgICAgIGVudW0gUlVOTklORyA7CiAgICAgICAgZW51bSBDQU5DRUxMSU5HIDsKICAgICAgICBlbnVtIEZJTklTSEVEIDsKICAgICAgICBlbnVtIEZBSUxFRCA7CiAgICAgICAgZW51bSBQQVJUSUFMTFlfRkFJTEVEIDsKICAgICAgICBlbnVtIENBTkNFTExFRCA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZWZhdWx0ICBSVU5OSU5HOwogICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLgogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkCiAgICAgICAgcHJvY2Vzcy4gIjsKICAgIH0KCiAgICBsZWFmIHByb2dyZXNzUGVyY2VudGFnZSB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlIDAuLjEwMDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJQcm9ncmVzcyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGFzIHBlcmNlbnRhZ2UiOwogICAgfQoKICAgIGxlYWYtbGlzdCBwcm9ncmVzc1N0YXRlSW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZwogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcwogICAgICAgICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCBhbmQgJ0NBTkNFTExFRCcuCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcwogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MKICAgICAgICBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCwgaWYgYW55LiBGb3IgdGhpcyBwdXJwb3NlLCBkZWRpY2F0ZWQKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgc3RhcnRUaW1lIHsKICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlN0YXJ0IHRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgaS5lLiB0aGUgdGltZSB3aGVuIHRoZQogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLgoKICAgICAgICBJZiB0aGUgdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBpdCBpcyB0aGUgZXN0aW1hdGVkIHRpbWUKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUKICAgICAgICBNblNfUHJvZHVjZXIuCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCgogICAgICAgIE9uY2UgdGhlIHRpbWVyIGlzIHNldCwgdGhlIGNvbnN1bWVyIGNhbiBub3QgY2hhbmdlIGl0IGFueW1vcmUuCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgICAgeWV4dDNncHA6bm90Tm90aWZ5YWJsZTsKICAgIH0KICB9CgogIHR5cGVkZWYgVGVudGhPZkRlZ3JlZXMgewogICAgdHlwZSB1aW50MTYgewogICAgICByYW5nZSAwLi4zNjAwOwogICAgfQogICAgdW5pdHMgIjAuMSBkZWdyZWVzIjsKICAgIGRlc2NyaXB0aW9uICJBIHNpbmdsZSBpbnRlZ3JhbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGFuZ2xlIGluIGRlZ3JlZXMKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIEFsdGl0dWRlICB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgfQogICAgdW5pdHMgIm1ldGVycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4iOwogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBMYXRpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBsb25naXR1ZGUgewogICAgICB0eXBlIExvbmdpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBhbHRpdHVkZSB7CiAgICAgIHR5cGUgQWx0aXR1ZGU7CiAgICB9CgogIH0KCiAgdHlwZWRlZiBPbk9mZiB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBPTjsKICAgICAgZW51bSBPRkY7CiAgICB9CiAgfQoKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcwogIC8vICBiZWluZyBtb3ZlZCB0byBfM2dwcC01Z2MtbnJtLW5mcHJvZmlsZQogIGdyb3VwaW5nIE1hbmFnZWRORlByb2ZpbGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORiI7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuNTAxIjsKCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQoKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLgogICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIE5GIEluc3RhbmNlIElEIHNoYWxsIGJlIGEKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgICB5ZXh0M2dwcDppblZhcmlhbnQ7CiAgICB9CgogICAgbGVhZi1saXN0IG5mVHlwZSB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIHR5cGUgTmZUeXBlOwogICAgICBkZXNjcmlwdGlvbiAiVHlwZSBvZiB0aGUgTmV0d29yayBGdW5jdGlvbiIgOwogICAgfQoKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQoKICAgIGxlYWYgYXV0aHpJbmZvIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBORiBTcGVjaWZpYyBTZXJ2aWNlIGF1dGhvcml6YXRpb24KICAgICAgICBpbmZvcm1hdGlvbi4gSXQgc2hhbGwgaW5jbHVkZSB0aGUgTkYgdHlwZSAocykgYW5kIE5GIHJlYWxtcy9vcmlnaW5zCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KCiAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBORiBpbnN0YW5jZQogICAgICAgIChlLmcuIGdlb2dyYXBoaWMgbG9jYXRpb24sIGRhdGEgY2VudGVyKSBkZWZpbmVkIGJ5IG9wZXJhdG9yIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uCiAgICAgICAgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIGV4cHJlc3NlZCBhcyBhIHdlaWdodCByZWxhdGl2ZSB0byBvdGhlcgogICAgICAgIE5GIGluc3RhbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyBpZiBjYXBhY2l0eSBpcyBhbHNvIHByZXNlbnQgaW4gdGhlCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMKICAgICAgICBzZXJ2ZWQgYnkgdGhlIE5GIGluc3RhbmNlLgogICAgICAgIE1heSBiZSBjb25maWcgZmFsc2Ugb3IgdHJ1ZSBkZXBlbmRpbmcgb24gdGhlIE1hbmFnZWRGdW5jdGlvbi4KICAgICAgICBDb25maWc9dHJ1ZSBmb3IgVWRyaW5mby4gQ29uZmlnPWZhbHNlIGZvciBVZG1JbmZvIGFuZCBBdXNmSW5mby4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc3VwcG9ydGVkRGF0YVNldElkcyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU1VCU0NSSVBUSU9OOwogICAgICAgIGVudW0gUE9MSUNZOwogICAgICAgIGVudW0gRVhQT1NVUkU7CiAgICAgICAgZW51bSBBUFBMSUNBVElPTjsKICAgICAgfQogICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBzdXBwb3J0ZWQgZGF0YSBzZXRzIGluIHRoZSBVRFIgaW5zdGFuY2UuCiAgICAgICAgTWF5IGJlIHByZXNlbnQgaWYgLi4vbmZUeXBlID0gVURSIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVQRiI7CiAgICAgIHJlZmVyZW5jZSAiVFMgMjkuNTEwIiA7CiAgICB9CgogICAgbGVhZiBwcmlvcml0eSB7CiAgICAgIHR5cGUgdWludDE2OwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBQcmlvcml0eSAocmVsYXRpdmUgdG8gb3RoZXIgTkZzCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsKICAgICAgICBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgYSBoaWdoZXIgcHJpb3JpdHkuIElmIHByaW9yaXR5IGlzIGFsc28gcHJlc2VudAogICAgICAgIGluIHRoZSBuZlNlcnZpY2VMaXN0IHBhcmFtZXRlcnMsIHRob3NlIHdpbGwgaGF2ZSBwcmVjZWRlbmNlIG92ZXIKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KCiAgdHlwZWRlZiB1c2FnZVN0YXRlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIElETEU7CiAgICAgIGVudW0gQUNUSVZFOwogICAgICBlbnVtIEJVU1k7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiSXQgZGVzY3JpYmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZXNvdXJjZSBpcyBhY3RpdmVseSBpbgogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZQogICAgICBjYXBhY2l0eSBmb3IgYWRkaXRpb25hbCB1c2VycyBhdCB0aGF0IGluc3RhbnQuIFRoZSB2YWx1ZSBpcyBSRUFELU9OTFkuIjsKICAgIHJlZmVyZW5jZSAiSVRVIFQgUmVjb21tZW5kYXRpb24gWC43MzEiOwogIH0KCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CgogIHR5cGVkZWYgTWNjIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIGNvdW50cnkgY29kZSBjb25zaXN0cyBvZiB0aHJlZSBkZWNpbWFsIGRpZ2l0cywKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMKICAgICAgcmVnaW9uICh0aGUgZGlnaXRzIDEgYW5kIDggYXJlIG5vdCB1c2VkKToiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMDItNzldWzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgdHlwZWRlZiBNbmMgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgbmV0d29yayBjb2RlIGNvbnNpc3RzIG9mIHR3byBvciB0aHJlZQogICAgICBkZWNpbWFsIGRpZ2l0cyAoZm9yIGV4YW1wbGU6IE1OQyBvZiAwMDEgaXMgbm90IHRoZSBzYW1lIGFzIE1OQyBvZiAwMSkiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05XVswLTldWzAtOV18WzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgZ3JvdXBpbmcgUExNTklkIHsKICAgIGxlYWYgbWNjIHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgTWNjOwogICAgfQogICAgbGVhZiBtbmMgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNbmM7CiAgICB9CiAgICByZWZlcmVuY2UgIlRTIDM4LjQxMyBjbGF1c2UgOS4zLjMuNSI7CiAgfQoKICB0eXBlZGVmIE5jaSB7CiAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4gVGhlIE5DSSBzaGFsbCBiZSBvZiBmaXhlZCBsZW5ndGggb2YgMzYgYml0cwogICAgICBhbmQgc2hhbGwgYmUgY29kZWQgdXNpbmcgZnVsbCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQoKICB0eXBlZGVmIE9wZXJhdGlvbmFsU3RhdGUgewogICAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyNSBhbmQgSVRVLVQgWC43MzEiOwogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyB0b3RhbGx5IGlub3BlcmFibGUuIjsKICAgICAgfQoKICAgICAgZW51bSBFTkFCTEVEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgcGFydGlhbGx5IG9yIGZ1bGx5IG9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICB9CiAgfQoKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KCiAgICAgIGVudW0gU0hVVFRJTkdET1dOIHsKICAgICAgICB2YWx1ZSAyOwogICAgICAgIGRlc2NyaXB0aW9uICJVc2Ugb2YgdGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcGVybWl0dGVkIHRvCiAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZXMgb2YgdXNlIG9ubHkuIFdoaWxlIHRoZSBzeXN0ZW0gcmVtYWlucyBpbgogICAgICAgICAgdGhlIHNodXR0aW5nIGRvd24gc3RhdGUgdGhlIG1hbmFnZXIgb3IgdGhlIG1hbmFnZWQgZWxlbWVudAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZQogICAgICAgICAgbG9ja2VkIHN0YXRlLiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOwogICAgICAgICAgZW51bSBPRkZfTElORTsKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7CiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7CiAgICAgICAgICBlbnVtIERFR1JBREVEOwogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOwogICAgICAgICAgZW51bSBMT0dfRlVMTDsKICAgICAgIH0KICB9CgogIHR5cGVkZWYgQ2VsbFN0YXRlIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBJRExFOwogICAgICAgIGVudW0gSU5BQ1RJVkU7CiAgICAgICAgZW51bSBBQ1RJVkU7CiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKQogICAgICBhcyBzcGVjaWZpZWQgaW4gY2xhdXNlIDI4LjYgb2YgVFMgMjMuMDAzLCBjbGF1c2UgOC4yIG9mIFRTIDM4LjMwMAogICAgICBhbmQgY2xhdXNlIDkuMy4zLjExIG9mIFRTIDM4LjQxMy4gSXQgaXMgY29tcG9zZWQgb2YgdGhlIFBMTU4KICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQKICAgICAgdGhlIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4gIjsKICAgIGxpc3QgcGxtbklkIHsKICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSWRlbnRpdHkuIjsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIG1heC1lbGVtZW50cyAxOwogICAgICBrZXkgIm1jYyBtbmMiOwogICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICB9CgogICAgbGVhZiB0YWMgeyB0eXBlIFRhYzsgfQogIH0KCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsKICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgICAgcmFuZ2UgLTkwLi45MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMYXRpdHVkZSBiYXNlZCBvbiBXb3JsZCBHZW9kZXRpYyBTeXN0ZW0gKDE5ODQgdmVyc2lvbikKICAgICAgICBnbG9iYWwgcmVmZXJlbmNlIGZyYW1lIChXR1MgODQpLiBQb3NpdGl2ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgICByYW5nZSAtMTgwLi4xODAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIGJhc2VkIG9uIFdvcmxkIEdlb2RldGljIFN5c3RlbSAoMTk4NCB2ZXJzaW9uKQogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvCiAgICAgICAgZGVncmVlcyBlYXN0IG9mIDAgZGVncmVlcyBsb25naXR1ZGUuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIEdlb0FyZWFHcnAgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YSB0eXBlIGRlZmluZXMgYSBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgVGhlIGdlby1hcmVhIGlzIGRlZmluZWQgdXNpbmcgYSBjb252ZXggcG9seWdvbiBpbiB0aGUgYXR0cmlidXRlCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwoKICAgIGxpc3QgY29udmV4R2VvUG9seWdvbiB7CiAgICAgIGRlc2NyaXB0aW9uICJTcGVjaWZpZXMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHdpdGggYSBjb252ZXggcG9seWdvbi4KICAgICAgICBUaGUgY29udmV4IHBvbHlnb24gaXMgc3BlY2lmaWVkIGJ5IGl0cyBjb3JuZXJzLiI7CiAgICAgICAga2V5ICJsYXRpdHVkZSBsb25naXR1ZGUiOwogICAgICBtaW4tZWxlbWVudHMgMzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwoKICAgICAgdXNlcyBHZW9Db29yZGluYXRlR3JwOwogICAgfQogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSB1aW50OCA7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlNldElkIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgewogICAgbGVhZiBhbWZSZWdpb25JZCB7CiAgICAgIHR5cGUgQW1mUmVnaW9uSWQ7CiAgICB9CiAgICBsZWFmIGFtZlNldElkIHsKICAgICAgdHlwZSBBbWZTZXRJZDsKICAgIH0KICAgIGxlYWYgYW1mUG9pbnRlciB7CiAgICAgIHR5cGUgQW1mUG9pbnRlcjsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLgogICAgICBUaGUgQU1GIFJlZ2lvbiBJRCBpZGVudGlmaWVzIHRoZSByZWdpb24sCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7CiAgfQoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0KICB9CgogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9CiAgfQoKICB0eXBlZGVmIExvYWQgewogICAgZGVzY3JpcHRpb24gIkxhdGVzdCBrbm93biBsb2FkIGluZm9ybWF0aW9uIG9mIHRoZSBORiwgcGVyY2VudGFnZSAiOwogICAgdHlwZSB1aW50OCB7CiAgICAgIHJhbmdlIDAuLjEwMDsKICAgIH0KICB9CgogIHR5cGVkZWYgTjFNZXNzYWdlQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gNUdNTTsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBMUFA7CiAgICAgIGVudW0gU01TOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMkluZm9ybWF0aW9uQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTlJQUEE7CiAgICAgIGVudW0gUFdTOwogICAgICBlbnVtIFBXU19CQ0FMOwogICAgICBlbnVtIFBXU19SRjsKICAgIH0KICB9CgogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewoKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KCiAgICBsZWFmIGNhbGxiYWNrVXJpIHsKICAgICAgdHlwZSBpbmV0OnVyaTsKICAgIH0KCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfQogIH0KCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgfQoKICBncm91cGluZyBJcHY2UHJlZml4UmFuZ2UgewogIGxlYWYgc3RhcnQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICB9CgogIHR5cGVkZWYgTnNpSWQgewogICAgdHlwZSBzdHJpbmc7CiAgfQoKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CgogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CgogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CgogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOwogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9CiAgfQoKICAvKiBEaXN0aW5ndWlzaGVkTmFtZSBwYXR0ZXJuIGlzIGJ1aWx0IHVwIGJhc2VkIG9uIHRoZQogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KCiAgICBsZWFmIEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vICBTYW1lIHBhdHRlcm4gYXMgTG9jYWxETgogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPygsW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQgICBNZS5teWtleT0xIGFsbG93ZWQKICAgICAgLy8gIChmdWxsTG9jYWxSRE4pKCwoZnVsbExvY2FsUkROKSkqCiAgICAgIHBhdHRlcm4gJygoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSgsKChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qfChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qXC5bYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qKSk9KChbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykpKSonOwogICAgfSB9CgogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0gfQoKICAgIGxlYWYgZnVsbExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgZnVsbExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICAvLyBwYXR0ZXJuIExvY2FsRE5BdHRyaWJ1dGVUeXBlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsKICAgIH0gfQoKICAgICAgLy8gbGltaXRhdGlvbjogTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlbm90IHN1cHBvcnRlZCBNZS5teWtleT0xCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUgeyB0eXBlIHN0cmluZyB7CiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOwogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWVzT2ZDbGFzc0FuZE5hbWluZ0F0dHJpYnV0ZSAgeyB0eXBlIHN0cmluZyB7ICAvLyBDbGFzc05hbWUgLCBDbGFzc05hbWluZ0F0dHJpYnV0ZVNlcGFyYXRvciAsIE5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgLy8gcGF0dGVybjogQ2xhc3NOYW1lXC5OYW1pbmdBdHRyaWJ1dGVOYW1lCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSonIDsKICAgIH0gfQoKICAgIGxlYWYgcmVzdHJpY3RpdmVDbGFzc05hbWUgeyB0eXBlIHN0cmluZyB7ICAgICAvLwogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7CiAgICB9IH0KCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwnCiAgICAgICsgJyhcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKicKICAgICAgKyAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JwogICAgICArICcoLFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKScKICAgICAgKyAnKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSAzR1BQIHN0YW5kYXJkIGZvciBEaXN0aW5ndWlzaGVkTmFtZS4KCiAgICAgIExpbWl0YXRpb25zOgogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZAogICAgICAgIChlZy4gTWFuYWdlZEVsZW1lbnQubXlrZXk9MzQ1NDM2KSI7CiAgICByZWZlcmVuY2UgICIzR1BQIFRTIDMyLjMwMCI7CiAgfQoKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsKICAgICAgcmFuZ2UgIi0yNCB8IC0yMiB8IC0yMCB8IC0xOCB8IC0xNiB8IC0xNCB8IC0xMiB8IC0xMCB8IC04IHwgLTYgfCAiICsKICAgICAgICAiIC01IHwgLTQgfCAtMyB8IC0yIHwgLTEgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgOCB8IDEwIHwgIiArCiAgICAgICAgIiAxMiB8IDE0IHwgMTYgfCAxOCB8IDIwIHwgMjIgfCAyNCI7CiAgICB9CiAgICB1bml0cyBkQjsKICB9CgogIGdyb3VwaW5nIFJlcG9ydGluZ0N0cmwgewogICAgY2hvaWNlIHJlcG9ydGluZ0N0cmwgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIgogICAgICAgIFRoaXMgY2hvaWNlIGRlZmluZXMgdGhlIG1ldGhvZCBmb3IgcmVwb3J0aW5nIGNvbGxlY3RlZCBwZXJmb3JtYW5jZQogICAgICAgIG1ldHJpY3MgdG8gTW5TIGNvbnN1bWVycyBhcyB3ZWxsIGFzIHRoZSBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmluZyB0aGUKICAgICAgICByZXBvcnRpbmcgZnVuY3Rpb24uIEl0IGlzIGEgY2hvaWNlIGJldHdlZW4gdGhlIGNvbnRyb2wgcGFyYW1ldGVyCiAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnRpbmcgbWV0aG9kcywgd2hvc2UgcHJlc2VuY2Ugc2VsZWN0cyB0aGUKICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGFzIGZvbGxvd3M6CgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TCiAgICAgICAgcHJvZHVjZXIgc2hhbGwgc3RvcmUgZmlsZXMgb24gdGhlIE1uUyBwcm9kdWNlciBhdCBhIGxvY2F0aW9uIHNlbGVjdGVkCiAgICAgICAgYnkgdGhlIE1uUyBwcm9kdWNlciBhbmQsIG9uIGNvbmRpdGlvbiB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YnNjcmlwdGlvbgogICAgICAgIGlzIGluIHBsYWNlLCBpbmZvcm0gdGhlIE1uUyBjb25zdW1lciBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIG5ldwogICAgICAgIGZpbGVzIGFuZCB0aGUgZmlsZSBsb2NhdGlvbiB1c2luZyB0aGUgbm90aWZ5RmlsZVJlYWR5IG5vdGlmaWNhdGlvbi4KICAgICAgICBJbiBjYXNlIHRoZSBwcmVwYXJhdGlvbiBvZiBhIGZpbGUgZmFpbHMsICdub3RpZnlGaWxlUHJlcGFyYXRpb25FcnJvcicKICAgICAgICBzaGFsbCBiZSBzZW50IGluc3RlYWQuCgogICAgICAgIC0gV2hlbiB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGFuZCAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycKICAgICAgICBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LCB0aGVuIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgYmVoYXZlIGxpa2UKICAgICAgICBkZXNjcmliZWQgZm9yIHRoZSBjYXNlIHRoYXQgb25seSB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGlzIHByZXNlbnQuCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgY3JlYXRlIG9uIGJlaGFsZiBvZiB0aGUgTW5TCiAgICAgICAgY29uc3VtZXIgYSBzdWJzY3JpcHRpb24sIHVzaW5nICdOdGZTdWJzY3JpcHRpb25Db250cm9sJywgZm9yIHRoZQogICAgICAgIG5vdGlmaWNhdGlvbiB0eXBlcyAnbm90aWZ5TU9JQ3JlYXRpb24nIGFuZCAnbm90aWZ5TU9JRGVsZXRpb24nIHJlbGF0ZWQKICAgICAgICB0byB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgcHJvZHVjZWQgbGF0ZXIuIEluIGNhc2UgYW4gZXhpc3RpbmcKICAgICAgICBzdWJzY3JpcHRpb24gZG9lcyBhbHJlYWR5IGluY2x1ZGUgdGhlICdGaWxlJyBpbnN0YW5jZXMgdG8gYmUgcHJvZHVjZWQsCiAgICAgICAgbm8gbmV3IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBjcmVhdGVkLiBUaGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgYXR0cmlidXRlIGluIHRoZSBjcmVhdGVkCiAgICAgICAgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIHNoYWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICAgJ25vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MnIGluIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJy4gVGhpcwogICAgICAgIGZlYXR1cmUgaXMgY2FsbGVkIGltcGxpY2l0IG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24sIGFzIG9wcG9zZWQgdG8gdGhlCiAgICAgICAgY2FzZSB3aGVyZSB0aGUgTW5TIGNvbnN1bWVyIGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiAoZXhwbGljaXQKICAgICAgICBub3RpZmljYXRpb24gc3Vic2NyaXB0aW9uKS4gV2hlbiB0aGUgcmVsYXRlZCAnUGVyZk1ldHJpY0pvYicgaXMKICAgICAgICBkZWxldGVkLCB0aGUgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIGNyZWF0ZWQgZHVlIHRvIHRoZQogICAgICAgIHJlcXVlc3QgZm9yIGltcGxpY2l0IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBkZWxldGVkIGFzIHdlbGwuCgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGFuZCBmaWxlTG9jYXRpb24gYXR0cmlidXRlcyBhcmUKICAgICAgICBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyIHNoYWxsIHN0b3JlIHRoZSBmaWxlcyBvbiBhIE1uUyBjb25zdW1lciwgdGhhdAogICAgICAgIGNhbiBiZSBhbnkgZW50aXR5IHN1Y2ggYXMgYSBmaWxlIHNlcnZlciwgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQogICAgICAgIGZpbGVMb2NhdGlvbi4gTm8gbm90aWZpY2F0aW9uIGlzIGVtaXR0ZWQgYnkgdGhlIE1uUyBwcm9kdWNlci4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIHN0cmVhbVRhcmdldCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIE1uUyBwcm9kdWNlcgogICAgICAgIHNoYWxsIHN0cmVhbSB0aGUgZGF0YSB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHN0cmVhbVRhcmdldC4KCiAgICAgICAgRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2RzIHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZQogICAgICAgIHNwZWNpZmllcyB0aGUgdGltZSB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlCiAgICAgICAgc3RvcmVkIGludG8gdGhlIHNhbWUgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzCiAgICAgICAgb3BlbmVkLiI7CgogICAgICBjYXNlIGZpbGUtYmFzZWQtcmVwb3J0aW5nIHsKICAgICAgICBsZWFmIGZpbGVSZXBvcnRpbmdQZXJpb2QgewogICAgICAgICAgdHlwZSB1aW50MzIgewogICAgICAgICAgICByYW5nZSAxLi5tYXg7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyBtaW51dGVzOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgdGhpcyBpcyB0aGUgdGltZQogICAgICAgICAgICB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCBpbnRvIHRoZSBzYW1lCiAgICAgICAgICAgIGZpbGUgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCBhbmQgYSBuZXcgZmlsZSBpcyBvcGVuZWQuCiAgICAgICAgICAgIFRoZSB0aW1lLXBlcmlvZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGdyYW51bGFyaXR5UGVyaW9kLgoKICAgICAgICAgICAgQXBwbGljYWJsZSB3aGVuIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICAgIGNob2ljZSByZXBvcnRpbmctdGFyZ2V0IHsKICAgICAgICAgIGNhc2UgZmlsZS10YXJnZXQgewogICAgICAgICAgICBsZWFmIGZpbGVMb2NhdGlvbiB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFwcGxpY2FibGUgYW5kIG11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBmaWxlLWJhc2VkCiAgICAgICAgICAgICAgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgZmlsZXMgYXJlIHN0b3JlZCBvbiB0aGUgTW5TCiAgICAgICAgICAgICAgY29uc3VtZXIuIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY2FzZSBub3RpZmljYXRpb24tdGFyZ2V0IHsKICAgICAgICAgICAgbGVhZiBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNdXN0IGJlIHByZXNlbnQgd2hlbiB0aGUgbm90aWZpY2F0aW9uLWJhc2VkIHJlcG9ydGluZwogICAgICAgICAgICAgIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgdGhlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXMKICAgICAgICAgICAgICBub3RpZmljYXRpb25zIGZvciB0aGUgTW5TIGNvbnN1bWVyIHRvIHN1YnNjcmliZSB0by4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZGVzY3JpcHRpb24gIldoZW4gbmV0aWhlciBmaWxlTG9jYXRpb24gb3Igbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcwogICAgICAgICAgYXJlIHByZXNlbnQsIHRoZSBmaWxlcyBhcmUgc3RvcmVkIGFuZCBhdmFpbGFibGUgdG8gdGhlIE1uUyBjb25zdW1lcgogICAgICAgICAgaWYgdGhlIE1uUyBzdWJzY3JpYmVzIHRvIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLiI7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYXNlIHN0cmVhbS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgc3RyZWFtVGFyZ2V0IHsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSB3aGVuIHN0cmVhbS1iYXNlZCByZXBvcnRpbmcgbWV0aG9kIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4iOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo= +ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjppZXRmOnBhcmFtczp4bWw6bnM6eWFuZzppZXRmLWdlby1sb2NhdGlvbiI7CiAgICBwcmVmaXggZ2VvOwogICAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7CiAgICBwcmVmaXggeWFuZzsKICAgIHJlZmVyZW5jZSAiUkZDIDY5OTE6IENvbW1vbiBZQU5HIERhdGEgVHlwZXMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogICAgY29udGFjdAogICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICAgIDxtYWlsdG86Y2hvcHBzQGNob3Bwcy5vcmc+IjsKCiAgICBkZXNjcmlwdGlvbgogICAgIlRoaXMgbW9kdWxlIGRlZmluZXMgYSBncm91cGluZyBvZiBhIGNvbnRhaW5lciBvYmplY3QgZm9yCiAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAnZWFydGgnKS4KCiAgICBUaGUga2V5IHdvcmRzICdNVVNUJywgJ01VU1QgTk9UJywgJ1JFUVVJUkVEJywgJ1NIQUxMJywgJ1NIQUxMCiAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICdNQVknLCBhbmQgJ09QVElPTkFMJyBpbiB0aGlzIGRvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcwogICAgZGVzY3JpYmVkIGluIEJDUCAxNCAoUkZDIDIxMTkpIChSRkMgODE3NCkgd2hlbiwgYW5kIG9ubHkgd2hlbiwKICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjIgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywKICAgIGFuZCBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlCiAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgIElFVEYgVHJ1c3QncyBMZWdhbCBQcm92aXNpb25zIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cHM6Ly90cnVzdGVlLmlldGYub3JnL2xpY2Vuc2UtaW5mbykuCgogICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2luZm8vcmZjOTE3OSk7IHNlZSB0aGUgUkZDIGl0c2VsZgogICAgZm9yIGZ1bGwgbGVnYWwgbm90aWNlcy4iOwoKICAgIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgICAiSW5pdGlhbCBSZXZpc2lvbiI7CiAgICByZWZlcmVuY2UKICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIGZlYXR1cmUgYWx0ZXJuYXRlLXN5c3RlbXMgewogICAgZGVzY3JpcHRpb24KICAgICAgICAiVGhpcyBmZWF0dXJlIG1lYW5zIHRoZSBkZXZpY2Ugc3VwcG9ydHMgc3BlY2lmeWluZyBsb2NhdGlvbnMKICAgICAgICB1c2luZyBhbHRlcm5hdGUgc3lzdGVtcyBmb3IgcmVmZXJlbmNlIGZyYW1lcy4iOwogICAgfQoKICAgIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJHcm91cGluZyB0byBpZGVudGlmeSBhIGxvY2F0aW9uIG9uIGFuIGFzdHJvbm9taWNhbCBvYmplY3QuIjsKCiAgICBjb250YWluZXIgZ2VvLWxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICJBIGxvY2F0aW9uIG9uIGFuIGFzdHJvbm9taWNhbCBib2R5IChlLmcuLCAnZWFydGgnKQogICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICAgIGNvbnRhaW5lciByZWZlcmVuY2UtZnJhbWUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgRnJhbWUgb2YgUmVmZXJlbmNlIGZvciB0aGUgbG9jYXRpb24gdmFsdWVzLiI7CgogICAgICAgIGxlYWYgYWx0ZXJuYXRlLXN5c3RlbSB7CiAgICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgc3lzdGVtIGluIHdoaWNoIHRoZSBhc3Ryb25vbWljYWwgYm9keSBhbmQKICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICBwcmVzZW50IGFuZCB0aGUgc3lzdGVtIGlzIHRoZSBuYXR1cmFsIHVuaXZlcnNlOyBob3dldmVyLAogICAgICAgICAgICB3aGVuIHByZXNlbnQsIHRoaXMgdmFsdWUgYWxsb3dzIGZvciBzcGVjaWZ5aW5nIGFsdGVybmF0ZQogICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgIG1vZGlmaWVzIHRoZSBkZWZpbml0aW9uIChidXQgbm90IHRoZSB0eXBlKSBvZiB0aGUgb3RoZXIKICAgICAgICAgICAgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUuIjsKICAgICAgICB9CiAgICAgICAgbGVhZiBhc3Ryb25vbWljYWwtYm9keSB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQgImVhcnRoIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgIEFzdHJvbm9taWNhbCBVbmlvbiAoSUFVKSBvciBhY2NvcmRpbmcgdG8gdGhlIGFsdGVybmF0ZQogICAgICAgICAgICBzeXN0ZW0gaWYgc3BlY2lmaWVkLiAgRXhhbXBsZXMgaW5jbHVkZSAnc3VuJyAob3VyIHN0YXIpLAogICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgIG1vb24gb2YgU2F0dXJuKSwgJ2NlcmVzJyAoYW4gYXN0ZXJvaWQpLCBhbmQKICAgICAgICAgICAgJzY3cC9jaHVyeXVtb3YtZ2VyYXNpbWVua28gKGEgY29tZXQpLiAgVGhlIEFTQ0lJIHZhbHVlCiAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgaW5jbHVkZSBjb250cm9sIGNoYXJhY3RlcnMgKGkuZS4sIHZhbHVlcyAzMi4uNjQsIGFuZAogICAgICAgICAgICA5MS4uMTI2KS4gIEFueSBwcmVjZWRpbmcgJ3RoZScgaW4gdGhlIG5hbWUgU0hPVUxEIE5PVCBiZQogICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgICByZWZlcmVuY2UKICAgICAgICAgICAgImh0dHBzOi8vd3d3LmlhdS5vcmcvIjsKICAgICAgICB9CiAgICAgICAgY29udGFpbmVyIGdlb2RldGljLXN5c3RlbSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgZ2VvZGV0aWMgc3lzdGVtIG9mIHRoZSBsb2NhdGlvbiBkYXRhLiI7CiAgICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuICdbIC1AXFstXF5fLX5dKic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJBIGdlb2RldGljLWRhdHVtIGRlZmluaW5nIHRoZSBtZWFuaW5nIG9mIGxhdGl0dWRlLAogICAgICAgICAgICAgICAgbG9uZ2l0dWRlLCBhbmQgaGVpZ2h0LiAgVGhlIGRlZmF1bHQgd2hlbiB0aGUKICAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBHbG9iYWwgUG9zaXRpb25pbmcgU3lzdGVtIChHUFMpLiAgVGhlCiAgICAgICAgICAgICAgICBBU0NJSSB2YWx1ZSBTSE9VTEQgaGF2ZSB1cHBlcmNhc2UgY29udmVydGVkIHRvCiAgICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgKGkuZS4sIHZhbHVlcyAzMi4uNjQsIGFuZCA5MS4uMTI2KS4gIFRoZSBJQU5BIHJlZ2lzdHJ5CiAgICAgICAgICAgICAgICBmdXJ0aGVyIHJlc3RyaWN0cyB0aGUgdmFsdWUgYnkgY29udmVydGluZyBhbGwgc3BhY2VzCiAgICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGdlb2RldGljLWRhdHVtIGluZGljYXRlcwogICAgICAgICAgICAgICAgaG93IGFjY3VyYXRlbHkgaXQgbW9kZWxzIHRoZSBhc3Ryb25vbWljYWwgYm9keSBpbgogICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgIGxhdGl0dWRlL2xvbmdpdHVkZSBjb29yZGluYXRlcyBhbmQgZm9yIGhlaWdodAogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuIjsKICAgICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMsCiAgICAgICAgICAgICAgICBTZWN0aW9uIDYuMSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgcGFpciBmb3IKICAgICAgICAgICAgICAgIGVsbGlwc29pZGFsIGNvb3JkaW5hdGVzLCBvciB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cwogICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgaXQgaW5kaWNhdGVzIGhvdyBwcmVjaXNlbHkgdGhlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgICAgICBpbiB0aGUgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4KICAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICAgZGVmaW5lZCBieSB0aGUgZ2VvZGV0aWMtZGF0dW0uICBGb3IgZXhhbXBsZSwgdGhlcmUKICAgICAgICAgICAgICAgIG1pZ2h0IGJlIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgICBsb2NhdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWYgaGVpZ2h0LWFjY3VyYWN5IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgICBjb29yZGluYXRlczsgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCB3aXRoIENhcnRlc2lhbgogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuICBXaGVuIGhlaWdodC1hY2N1cmFjeSBpcyBzcGVjaWZpZWQsIGl0CiAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuIGRldGVybWluZWQKICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gZGVmaW5lZCBieSB0aGUKICAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgICB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBtZWFzdXJlbWVudCB3YXMgbWFkZSB0byBkZXRlcm1pbmUgZWFjaAogICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxvY2F0aW9uIGRhdGEgZWl0aGVyIGluIGxhdGl0dWRlL2xvbmdpdHVkZSBvcgogICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBhbmQgcHJlY2lzaW9uIG9mIHRoaXMgbWVhc3VyZW1lbnQgaXMKICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGxvbmdpdHVkZSB2YWx1ZSBvbiB0aGUgYXN0cm9ub21pY2FsIGJvZHkuICBUaGUKICAgICAgICAgICAgICAgIGRlZmluaXRpb24gYW5kIHByZWNpc2lvbiBvZiB0aGlzIG1lYXN1cmVtZW50IGlzCiAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWYgaGVpZ2h0IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4gIFRoZSBwcmVjaXNpb24gYW5kCiAgICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FzZSBjYXJ0ZXNpYW4gewogICAgICAgICAgICBsZWFmIHggewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWCB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWFmIHogewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiSWYgdGhlIG9iamVjdCBpcyBpbiBtb3Rpb24sIHRoZSB2ZWxvY2l0eSB2ZWN0b3IgZGVzY3JpYmVzCiAgICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgICBmb3JtdWxhIHRvIGNvbnZlcnQgdGhlc2UgdmFsdWVzIHRvIHNwZWVkIGFuZCBoZWFkaW5nLCBzZWUKICAgICAgICAgICAgUkZDIDkxNzkuIjsKICAgICAgICByZWZlcmVuY2UKICAgICAgICAgICAgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKCiAgICAgICAgbGVhZiB2LW5vcnRoIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICB0cnVlIG5vcnRoIGFzIGRlZmluZWQgYnkgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LWVhc3QgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAidi1lYXN0IGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIHBlcnBlbmRpY3VsYXIKICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgZ2VvZGV0aWMtc3lzdGVtLiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHYtdXAgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAidi11cCBpcyB0aGUgcmF0ZSBvZiBjaGFuZ2UgKGkuZS4sIHNwZWVkKSBhd2F5IGZyb20gdGhlCiAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZWFmIHRpbWVzdGFtcCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgICAgfQogICAgICAgIGxlYWYgdmFsaWQtdW50aWwgewogICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICAgSWYgdW5zcGVjaWZpZWQsIHRoZSBnZW8tbG9jYXRpb24gaGFzIG5vIHNwZWNpZmljCiAgICAgICAgICAgIGV4cGlyYXRpb24gdGltZS4iOwogICAgICAgIH0KICAgIH0KICAgIH0KfQo= +o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsKICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyBleHRlbnNpb25zIHRvIHRoZSBZQU5HIGxhbmd1YWdlIHRoYXQgdG9wb2xvZ3kgYW5kCiAgICBpbnZlbnRvcnkgbW9kZWxzIHdpbGwgdXNlIHRvIGRlZmluZSBhbmQgYW5ub3RhdGUgdHlwZXMgYW5kIHJlbGF0aW9uc2hpcHMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMg4oCYeC55LnrigJkg4oCTIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9 +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogICAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZQogICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICB9CgogICAgY29udGFpbmVyIG1ldGFkYXRhIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCB0byBkZWZpbmUgbWV0YWRhdGEuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGlkZW50aXR5IGNsYXNzaWZpZXJ7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjbGFzc2lmaWVyIGlzIHVzZWQgYXMgYSBiYXNlIHRvIHByb3ZpZGUgYWxsIGNsYXNzaWZpZXJzCiAgICAgICAgICAgIHdpdGggaWRlbnRpdHkuICI7CiAgICB9Cn0= +o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgRXF1aXBtZW50CiAgICBkb21haW4sIHdoaWNoIGlzIG1vZGVsbGVkIHRvIHVuZGVyc3RhbmQgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIGVxdWlwbWVudAogICAgc3VjaCBhcyBhbnRlbm5hcyBhc3NvY2lhdGVkIHdpdGggYSBjZWxsL2NhcnJpZXIgYW5kIHRoZWlyIHJlbGV2YW50CiAgICBwcm9wZXJ0aWVzIGUuZy4gdGlsdCwgbWF4IHBvd2VyIGV0Yy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgICAgIGFudGVubmEuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhbnRlbm5hTW9kZWxOdW1iZXIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlZlbmRvci1zcGVjaWZpYyBhbnRlbm5hIG1vZGVsIGlkZW50aWZpZXIuIFRoaXMKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgICAgIHVuaXQgaXMgaW5zdGFsbGVkLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLCBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGluY2xpbmF0aW9uIG9mIHRoZSBhbnRlbm5hIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgICAgIGRvd250aWx0LCBhbmQgbmVnYXRpdmUgaW5kaWNhdGVzIHVwdGlsdC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBwb3NpdGlvbldpdGhpblNlY3RvciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSB1bml0IHBvc2l0aW9uIHdpdGhpbiBzZWN0b3IuIFRoaXMgYXR0cmlidXRlCiAgICAgICAgICAgICAgICAgICAgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vIG9wZXJhdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgdGlsdCBhbmQgdGhlIHRpbHQgYXBwbGllZCBieSB0aGUgUmVtb3RlIEVsZWN0cmljYWwKICAgICAgICAgICAgICAgICAgICBUaWx0IChSRVQpLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGVsZWN0cmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRWxlY3RyaWNhbGx5LWNvbnRyb2xsZWQgdGlsdCBvZiBtYWluIGJlYW0gbWF4aW11bQogICAgICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBheGlzIChzZWUgM0dQUCBUUyAyNS40NjYpLiBWYWx1ZSBpcyBzaWduZWQ7IHRpbHQgZG93biBpcwogICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLCB0aWx0IHVwIGlzIG5lZ2F0aXZlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgYW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hCiAgICAgICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICAgICAgZGVncmVlcy4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgUkFOIGRvbWFpbiwKICAgIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eSBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlCiAgICByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgR05CRFVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLgoKICAgICAgICAgICAgQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ2VudHJhbGl6ZWQgVW5pdCAoZ05CLUNVKSBhbmQgYSBnTkItRFUuCiAgICAgICAgICAgIFRoZSBDVSBwcm9jZXNzZXMgbm9uLXJlYWwgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVCiAgICAgICAgICAgIHByb2Nlc3NlcyBQSFkgbGV2ZWwgcHJvdG9jb2wgYW5kIHJlYWwgdGltZSBzZXJ2aWNlcy4gVGhlIGdOQi1DVSBhbmQKICAgICAgICAgICAgdGhlIGdOQi1EVSB1bml0cyBhcmUgY29ubmVjdGVkIHZpYSBGMSBsb2dpY2FsIGludGVyZmFjZS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBmb3IgYSBnTkItRFU6CiAgICAgICAgICAgIElzIGNvbm5lY3RlZCB0byB0aGUgZ05CLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgICAgICBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIGdOQi1EVSBpcwogICAgICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgbXVsdGlwbGUgZ05CLUNVLVVQcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBnTkItQ1UtQ1AuCgogICAgICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DVS1DUCwgbXVsdGlwbGUgZ05CLUNVLVVQcyBhbmQKICAgICAgICAgICAgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4KICAgICAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGNvbnRhaW5lciBkVXBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHVzZWQgYXMgcGFydCBvZiBQTSBFdmVudHMgZGF0YSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gRXZvbHZlZCBOb2RlIEIgKGVOb2RlQikgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IG5vZGUgaW4KICAgICAgICAgICAgdGhlIHJhZGlvIGFjY2VzcyBuZXR3b3JrIChSQU4pIG9mIExvbmctVGVybSBFdm9sdXRpb24gKExURSkuIFRoZQogICAgICAgICAgICBlTm9kZUIgaXMgYSBjb21wbGV4IGJhc2Ugc3RhdGlvbiB0aGF0IGhhbmRsZXMgcmFkaW8gY29tbXVuaWNhdGlvbnMKICAgICAgICAgICAgaW4gdGhlIGNlbGwgYW5kIGNhcnJpZXMgb3V0IHJhZGlvIHJlc291cmNlIG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyCiAgICAgICAgICAgIGRlY2lzaW9ucy4gVW5saWtlIDIvM0cgd2lyZWxlc3MgUkFOLCB0aGVyZSBpcyBubyBjZW50cmFsaXplZCByYWRpbwogICAgICAgICAgICBuZXR3b3JrIGNvbnRyb2xsZXIgaW4gTFRFLiBJdCBpcyB0aGUgaGFyZHdhcmUgdGhhdCBpcyBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgdGhlIG1vYmlsZSBwaG9uZSBuZXR3b3JrIHRoYXQgY29tbXVuaWNhdGVzIGRpcmVjdGx5IHdpdGggbW9iaWxlCiAgICAgICAgICAgIGhhbmRzZXRzIChVc2VyIEVxdWlwbWVudCksIGxpa2UgYSBiYXNlIHRyYW5zY2VpdmVyIHN0YXRpb24gKEJUUykgaW4KICAgICAgICAgICAgR1NNIG5ldHdvcmtzLiBUaGlzIHNpbXBsaWZpZXMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgYWxsb3dzIGxvd2VyCiAgICAgICAgICAgIHJlc3BvbnNlIHRpbWVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBDZWxsIEdsb2JhbAogICAgICAgICAgICAgICAgICAgIElkZW50aXR5LCBhbmQgaXMgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIgdGhlIFMxCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBlTm9kZUJQbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgUHVibGljIExhbmQgTW9iaWxlIE5ldHdvcmsgKFBMTU4pIElECiAgICAgICAgICAgICAgICAgICAgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUIgR2xvYmFsIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhlCiAgICAgICAgICAgICAgICAgICAgbm9kZSBvdmVyIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIChNQ0M9MDAxLCBNTkM9MDEpIGluZGljYXRlcyB0aGF0IHRoZSBQTE1OIGlzIG5vdCBpbml0aWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGNhbiBub3QgYmUgdXNlZCBhcyBhIHZhbGlkIFBMTU4gSWRlbnRpdHkuIjsKCiAgICAgICAgICAgICAgICBsZWFmIG1jYyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNQ0MgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5IHVzZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvIG5ldHdvcmsuIjsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMC4uOTk5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlYWYgbW5jTGVuZ3RoIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGxlbmd0aCBvZiB0aGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIHJhZGlvIG5ldHdvcmsuIjsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMi4uMzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBMVEVTZWN0b3JDYXJyaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIExURSBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgICAgIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEKICAgICAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZCB3aXRoIGEgYmFzZSBzdGF0aW9uCiAgICAgICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgICAgICBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwgaW50ZXJmZXJlbmNlCiAgICAgICAgICAgIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzIHN5c3RlbXMgdXNlIHRocmVlIHNlY3RvcgogICAgICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvckNhcnJpZXJUeXBlIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNlY3RvciBjYXJyaWVyCiAgICAgICAgICAgICAgICAgICAgbW9kZWxsZWQgYnkgTU8gU2VjdG9yQ2FycmllciBpcyBhIGRpZ2l0YWwgc2VjdG9yLiI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIG5vcm1hbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1pZGRsZSBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBBbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgZ2VyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcyB0aGF0IGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5PREVCRlVOQ1RJT05fUFJPVklERVNfTFRFU0VDVE9SQ0FSUklFUiB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLWx0ZVNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZU5vZGVCIEZ1bmN0aW9uIHByb3ZpZGVzIExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRU5vZGVCRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktZW5vZGViRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IGVOb2RlQiBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBMVEVTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgdXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIExURVNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LWx0ZVNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IHJlbGF0aW9ucyBiZXR3ZWVuIEVxdWlwbWVudCBhbmQgUkFOLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9FUVVJUE1FTlRfUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgc2VydmljZWQgYnkgdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHNlcnZlcyB0aGlzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("name", "moduleReferenceName") FROM stdin; -AntennaModule o-ran-smo-teiv-equipment -CloudSite o-ran-smo-teiv-cloud -ENodeBFunction o-ran-smo-teiv-ran -AntennaCapability o-ran-smo-teiv-ran -LTESectorCarrier o-ran-smo-teiv-ran +COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "relationshipDataLocation", "connectSameEntity", "moduleReferenceName") FROM stdin; -ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction 1 1 provided-by-enodebFunction LTESectorCarrier 0 9223372036854775807 BI_DIRECTIONAL B_SIDE false o-ran-smo-teiv-ran +COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran \. ; diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql new file mode 100644 index 0000000..e393eb0 --- /dev/null +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql @@ -0,0 +1,53 @@ +-- +-- ============LICENSE_START======================================================= +-- Copyright (C) 2024 Ericsson +-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe +-- ================================================================================ +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- SPDX-License-Identifier: Apache-2.0 +-- ============LICENSE_END========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_consumer_data; +ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +SET default_tablespace = ''; +SET default_table_access_method = heap; + +SET ROLE :'pguser'; + +CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL, + "ownerAppId" VARCHAR(511) NOT NULL, + "status" VARCHAR(127) NOT NULL +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( + "name" TEXT PRIMARY KEY, + "dataType" VARCHAR(511) NOT NULL, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( + "name" TEXT PRIMARY KEY, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE +); + +COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql index c3da7c1..4052755 100644 --- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql @@ -23,6 +23,7 @@ BEGIN; CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; +CREATE EXTENSION IF NOT EXISTS pg_trgm; GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; @@ -49,412 +50,506 @@ END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); - -CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ( - "id" VARCHAR(511), - "aSide_AntennaCapability" VARCHAR(511), - "bSide_AntennaCapability" VARCHAR(511), +INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); + +CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( + "id" TEXT, + "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F" TEXT, + "F03B534AFF0872651FED60C54AB56BEDADAB94B5" BIGINT, + "333177AA699C0DE6399503171DCF48FB396322B0" INTEGER, + "027B1A8019C6DEF04558B90D9D8B52253B82FEC6" BIGINT, + "478D043D81678134EF1C8BFB073A70F882C4AF12" DECIMAL, + "8252D18D44F633831557076D827993C45278024D" jsonb, + "68C48305AB6C3A30DD927F5D38562379374A4B31" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "REL_FK_provided-by-entityTypeA" TEXT, + "REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0" TEXT, + "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" jsonb, + "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" jsonb, + "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" jsonb ); -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ( - "id" VARCHAR(511), - "aSide_AntennaModule" VARCHAR(511), - "bSide_AntennaCapability" VARCHAR(511), +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ( + "id" TEXT, + "aSide_EntityTypeA" TEXT, + "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ( - "id" VARCHAR(511), - "aSide_AntennaModule" VARCHAR(511), - "bSide_AntennaModule" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_AntennaCapability" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."AntennaCapability" ( - "id" VARCHAR(511), - "geranFqBands" jsonb, - "nRFqBands" jsonb, - "eUtranFqBands" jsonb, +CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ( + "id" TEXT, + "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815" TEXT, + "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."AntennaModule" ( - "id" VARCHAR(511), - "positionWithinSector" TEXT, - "electricalAntennaTilt" BIGINT, - "mechanicalAntennaBearing" BIGINT, +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( + "id" TEXT, "antennaBeamWidth" jsonb, - "mechanicalAntennaTilt" BIGINT, "antennaModelNumber" TEXT, - "totalTilt" BIGINT, - "geo-location" geography, + "electricalAntennaTilt" INTEGER, + "geo-location" geography, + "mechanicalAntennaBearing" INTEGER, + "mechanicalAntennaTilt" INTEGER, + "positionWithinSector" TEXT, + "totalTilt" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."ENodeBFunction" ( - "id" VARCHAR(511), - "eNBId" BIGINT, +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( + "id" TEXT, + "eUtranFqBands" jsonb, + "geranFqBands" jsonb, + "nRFqBands" jsonb, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ( + "id" TEXT, + "eNBId" INTEGER, "eNodeBPlmnId" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; -ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."GNBDUFunction" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ( + "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, - "gNBIdLength" BIGINT, "gNBId" BIGINT, + "gNBIdLength" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb, + "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."GNBDUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."GNBDUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."GNBDUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."LTESectorCarrier" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( + "id" TEXT, "sectorCarrierType" TEXT, "CD_sourceIds" jsonb, - "REL_FK_provided-by-enodebFunction" VARCHAR(511), - "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" VARCHAR(511), - "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, - "REL_FK_used-antennaCapability" VARCHAR(511), - "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY" VARCHAR(511), - "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, - "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, - "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, - "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb + "REL_FK_provided-by-enodebFunction" TEXT, + "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" TEXT, + "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, + "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, + "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, + "REL_FK_used-antennaCapability" TEXT, + "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY" TEXT, + "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb ); -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."NRSectorCarrier" ( - "id" VARCHAR(511), - "frequencyDL" BIGINT, - "arfcnDL" BIGINT, - "arfcnUL" BIGINT, - "bSChannelBwDL" BIGINT, - "frequencyUL" BIGINT, +CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" ( + "id" TEXT, "CD_sourceIds" jsonb, - "REL_FK_used-antennaCapability" VARCHAR(511), - "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" VARCHAR(511), - "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, - "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb -); - -ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ( - "id" VARCHAR(511), - "aSide_AntennaCapability" VARCHAR(511), - "bSide_AntennaCapability" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb + "REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5" TEXT, + "REL_ID_31A5B55158140557F09AE15589A8B8038416689B" TEXT, + "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" jsonb, + "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" jsonb, + "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" jsonb, + "REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA" TEXT, + "REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845" TEXT, + "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" jsonb, + "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" jsonb, + "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" jsonb ); -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ( - "id" VARCHAR(511), - "aSide_AntennaCapability" VARCHAR(511), - "bSide_AntennaCapability" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb -); +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ( - "id" VARCHAR(511), - "aSide_AntennaCapability" VARCHAR(511), - "bSide_AntennaCapability" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb -); - -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" SET DEFAULT '{}'; SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY', - 'PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id" PRIMARY KEY ("id");' + '10B9F515756871D3EF6558FAF1F112BAE207945D', + 'PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB', + 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNAMODULE_SERVES_ANTENNACAPABILITY', - 'PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id', - 'ALTER TABLE ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");' + '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', + 'PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D', + 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNAMODULE_USES_ANTENNAMODULE', - 'PK_ANTENNAMODULE_USES_ANTENNAMODULE_id', - 'ALTER TABLE ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ADD CONSTRAINT "PK_ANTENNAMODULE_USES_ANTENNAMODULE_id" PRIMARY KEY ("id");' + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', + 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'AntennaCapability', - 'PK_AntennaCapability_id', - 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_AntennaCapability_id" PRIMARY KEY ("id");' + 'FB1E124031A12CD85D3335194B39B193723A0490', + 'PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD', + 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'AntennaModule', - 'PK_AntennaModule_id', - 'ALTER TABLE ties_data."AntennaModule" ADD CONSTRAINT "PK_AntennaModule_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-equipment_AntennaModule', + 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ENodeBFunction', - 'PK_ENodeBFunction_id', - 'ALTER TABLE ties_data."ENodeBFunction" ADD CONSTRAINT "PK_ENodeBFunction_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_AntennaCapability', + 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'GNBDUFunction', - 'PK_GNBDUFunction_id', - 'ALTER TABLE ties_data."GNBDUFunction" ADD CONSTRAINT "PK_GNBDUFunction_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'PK_LTESectorCarrier_id', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "PK_LTESectorCarrier_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_GNBDUFunction', + 'PK_o-ran-smo-teiv-ran_GNBDUFunction_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_GNBDUFunction_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'NRSectorCarrier', - 'PK_NRSectorCarrier_id', - 'ALTER TABLE ties_data."NRSectorCarrier" ADD CONSTRAINT "PK_NRSectorCarrier_id" PRIMARY KEY ("id");' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY', - 'PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");' + 'test-built-in-module_EntityTypeA', + 'PK_test-built-in-module_EntityTypeA_id', + 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "PK_test-built-in-module_EntityTypeA_id" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY', - 'PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");' + '10B9F515756871D3EF6558FAF1F112BAE207945D', + 'FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228', + 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228" FOREIGN KEY ("REL_FK_provided-by-entityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_USES_ANTENNACAPABILITY', - 'PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");' + '10B9F515756871D3EF6558FAF1F112BAE207945D', + 'UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14', + 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY', - 'FK_59989F20BF725E08F0327C7C555B1CF7B4F8661C', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ADD CONSTRAINT "FK_59989F20BF725E08F0327C7C555B1CF7B4F8661C" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', + 'FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30', + 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30" FOREIGN KEY ("aSide_EntityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY', - 'FK_8B87C4FA55D9F0A4164C35942D91E2E4E0B6140D', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ADD CONSTRAINT "FK_8B87C4FA55D9F0A4164C35942D91E2E4E0B6140D" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', + 'FK_33B5669A341584011D9A73FB491FF2242A158057', + 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_33B5669A341584011D9A73FB491FF2242A158057" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY', - 'FK_F407B43F3D94FFE0CBDF7E2BFAEAD9A4047DF252', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_F407B43F3D94FFE0CBDF7E2BFAEAD9A4047DF252" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960', + 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY', - 'FK_73581B1E05EA3AC4C029F090C067BD88029F1195', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_73581B1E05EA3AC4C029F090C067BD88029F1195" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06', + 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY', - 'FK_3613A8C84275763DE5294B04DB6E6BF74E9412F4', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_3613A8C84275763DE5294B04DB6E6BF74E9412F4" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'FB1E124031A12CD85D3335194B39B193723A0490', + 'FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F', + 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F" FOREIGN KEY ("aSide_C812C285BEFA4EC42026AB075D9C65200A00F815") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY', - 'FK_C21710428B73A144CC8DE4063CB24D4852D2EFE1', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_C21710428B73A144CC8DE4063CB24D4852D2EFE1" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'FB1E124031A12CD85D3335194B39B193723A0490', + 'FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5', + 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_USES_ANTENNACAPABILITY', - 'FK_0F27D391D210980029D4A879344BFC1DF7E56047', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_0F27D391D210980029D4A879344BFC1DF7E56047" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNACAPABILITY_USES_ANTENNACAPABILITY', - 'FK_C66086ACCFA9455ED438AE9381A7E4B0668EA027', - 'ALTER TABLE ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_C66086ACCFA9455ED438AE9381A7E4B0668EA027" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNAMODULE_SERVES_ANTENNACAPABILITY', - 'FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule', - 'ALTER TABLE ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."AntennaModule" (id) ON DELETE CASCADE;' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNAMODULE_SERVES_ANTENNACAPABILITY', - 'FK_AB3CEA707D389B107F1D10BC724542418E02ABEC', - 'ALTER TABLE ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_AB3CEA707D389B107F1D10BC724542418E02ABEC" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF', + 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNAMODULE_USES_ANTENNAMODULE', - 'FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule', - 'ALTER TABLE ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ADD CONSTRAINT "FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."AntennaModule" (id) ON DELETE CASCADE;' + 'test-built-in-module_EntityTypeA', + 'FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0', + 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0" FOREIGN KEY ("REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'ANTENNAMODULE_USES_ANTENNAMODULE', - 'FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule', - 'ALTER TABLE ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ADD CONSTRAINT "FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule" FOREIGN KEY ("bSide_AntennaModule") REFERENCES ties_data."AntennaModule" (id) ON DELETE CASCADE;' + 'test-built-in-module_EntityTypeA', + 'UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD', + 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD" UNIQUE ("REL_ID_31A5B55158140557F09AE15589A8B8038416689B");' ); SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."ENodeBFunction" (id) ON DELETE CASCADE;' + 'test-built-in-module_EntityTypeA', + 'FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF', + 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF" FOREIGN KEY ("REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' + 'test-built-in-module_EntityTypeA', + 'UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9', + 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9" UNIQUE ("REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845");' ); -SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'FK_LTESectorCarrier_REL_FK_used-antennaCapability', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_used-antennaCapability" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_1B734406AE75EF103D3E0913637A741DB602A6E9" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("8252D18D44F633831557076D827993C45278024D"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'LTESectorCarrier', - 'UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88', - 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");' -); +CREATE INDEX IF NOT EXISTS "IDX_93D8689B66D668B64409D69EB1AD4670419BE4F0" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("68C48305AB6C3A30DD927F5D38562379374A4B31"); -SELECT ties_data.create_constraint_if_not_exists( - 'NRSectorCarrier', - 'FK_NRSectorCarrier_REL_FK_used-antennaCapability', - 'ALTER TABLE ties_data."NRSectorCarrier" ADD CONSTRAINT "FK_NRSectorCarrier_REL_FK_used-antennaCapability" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_EDE92A1D90AEC06F2C60361D36437D1A20691FDC" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'NRSectorCarrier', - 'UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991', - 'ALTER TABLE ties_data."NRSectorCarrier" ADD CONSTRAINT "UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' -); +CREATE INDEX IF NOT EXISTS "IDX_371097F35C137586E6DD7526076CA322C72FAF79" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_06503CC4580E197BA869DF60207E5CC1778223F0" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_2B6D6CECE23DAE6820ECA50ECC172FE6FCE673DF" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_F613D04BF286E43A7BBBE6C306F015D0A40BC451" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_15F7CCF328E4FA23EE20BE521E07C475825B38C6" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("REL_CD_92559ED73C761B860682582A040E745ECEC194D5"); + +CREATE INDEX IF NOT EXISTS "IDX_D16FC793292C549EEB2EDCA074EC9726CD0986B1" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_73D270B07D89D7F4D54B82DB95E6168F6ED54AF1" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_786DFF3328DE8D28C54F9ACA126AF6ADB1D21645" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_DCA3B27EBD61104A41BE23B1C864D67CBF3AA45E" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_26EE0E66CE3AF1DE2E107F6A99712F2BEC1F47E3" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_C212962DB49654BB1526341141D01AF2A3699B5D" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("eNodeBPlmnId"); + +CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN ("dUpLMNId"); + +CREATE INDEX IF NOT EXISTS "IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_601A4514FFACA8985471531013AFC8F760361F09" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY"); + +CREATE INDEX IF NOT EXISTS "IDX_497353902DBA614467FFC457A40F39BF04CADC33" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_C4788824417A9F41E8CB948DAC0C2D1C0580FFD4" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_86B531D9388F1780960FB5C3BA9D3EDEF14CCB48" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E050A7DD176C8D18F3307D3851586C8124CA8268" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_CCBCF9A86E2AA678D2589DEB3A895076012F941D" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54"); + +CREATE INDEX IF NOT EXISTS "IDX_41BEE4E46184F6F17D338D2F8691EF31D188C76D" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA"); + +ANALYZE ties_data."o-ran-smo-teiv-ran_GNBDUFunction"; + +ANALYZE ties_data."FB1E124031A12CD85D3335194B39B193723A0490"; + +ANALYZE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier"; + +ANALYZE ties_data."test-built-in-module_EntityTypeA"; + +ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability"; + +ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_ENodeBFunction"; + +ANALYZE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE"; -COMMIT; \ No newline at end of file +COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql index bd3b338..2967b77 100644 --- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql @@ -46,44 +46,34 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "domain" VARCHAR(511), "includedModules" jsonb DEFAULT '[]'::jsonb, "revision" VARCHAR(511) NOT NULL, - "content" TEXT NOT NULL, - "ownerAppId" VARCHAR(511) NOT NULL, - "status" VARCHAR(127) NOT NULL + "content" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS ties_model.entity_info ( - "name" VARCHAR(511) PRIMARY KEY, + "storedAt" VARCHAR(511) PRIMARY KEY, + "name" VARCHAR(511) NOT NULL, "moduleReferenceName" VARCHAR(511) NOT NULL, FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( - "name" VARCHAR(511) PRIMARY KEY, + "name" VARCHAR(511) NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, + "aSideModule" TEXT NOT NULL, "aSideMinCardinality" BIGINT NOT NULL, "aSideMaxCardinality" BIGINT NOT NULL, "bSideAssociationName" TEXT NOT NULL, "bSideMOType" TEXT NOT NULL, + "bSideModule" TEXT NOT NULL, "bSideMinCardinality" BIGINT NOT NULL, "bSideMaxCardinality" BIGINT NOT NULL, "associationKind" TEXT NOT NULL, "relationshipDataLocation" TEXT NOT NULL, "connectSameEntity" BOOLEAN NOT NULL, + "storedAt" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.decorators ( - "name" VARCHAR(511) PRIMARY KEY, - "dataType" VARCHAR(511) NOT NULL, - "moduleReferenceName" VARCHAR(511) NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ties_model.classifiers ( - "name" VARCHAR(511) PRIMARY KEY, - "moduleReferenceName" VARCHAR(511) NOT NULL, + PRIMARY KEY ("name", "moduleReferenceName"), FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); @@ -91,122 +81,186 @@ CREATE TABLE IF NOT EXISTS ties_model.classifiers ( INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; -eNodeBPlmnId eNodeBPlmnId COLUMN -PK_NRSectorCarrier_id PK_NRSectorCarrier_id CONSTRAINT -UNIQUE_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9 CONSTRAINT -PK_ENodeBFunction_id PK_ENodeBFunction_id CONSTRAINT CD_classifiers CD_classifiers COLUMN -mechanicalAntennaBearing mechanicalAntennaBearing COLUMN -frequencyDL frequencyDL COLUMN -AntennaModule AntennaModule TABLE -ENodeBFunction ENodeBFunction TABLE -LTESectorCarrier LTESectorCarrier TABLE -antennaModelNumber antennaModelNumber COLUMN -NRSectorCarrier NRSectorCarrier TABLE +CD_decorators CD_decorators COLUMN +CD_sourceIds CD_sourceIds COLUMN +FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD CONSTRAINT +FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_used-antennaCapability FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06 CONSTRAINT +FK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_aSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F CONSTRAINT +FK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5 CONSTRAINT +FK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_aSide_EntityTypeA FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30 CONSTRAINT +FK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_33B5669A341584011D9A73FB491FF2242A158057 CONSTRAINT +FK_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_FK_provided-by-entityTypeA FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228 CONSTRAINT +FK_test-built-in-module_EntityTypeA_REL_FK_grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0 CONSTRAINT +FK_test-built-in-module_EntityTypeA_REL_FK_used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF CONSTRAINT +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_classifiers IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_sourceIds IDX_905011128A2C218B5352C19ED1FE9851F43EB911 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_antennaBeamWidth IDX_21B0F1FE632B6CB185C49BA6F00224068F443215 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_classifiers IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_sourceIds IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_eUtranFqBands IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_geranFqBands IDX_A94722FF7B95D8974B494793908B57B4E1A9743B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_nRFqBands IDX_441B5C05448D63552C6414BD59C13641D8A4408D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_classifiers IDX_B598B74193845587BA03553CEDBA058D33956847 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_sourceIds IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_GNBDUFunction_CD_classifiers IDX_601A4514FFACA8985471531013AFC8F760361F09 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_GNBDUFunction_CD_sourceIds IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_classifiers IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_sourceIds IDX_6EC539C61EA7078DBA264C9877B87FC263605D42 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_1EBC7271CEA658156DE25286404CBC4593340F8E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_classifiers IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_sourceIds IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_classifiers IDX_26EE0E66CE3AF1DE2E107F6A99712F2BEC1F47E3 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_sourceIds IDX_DCA3B27EBD61104A41BE23B1C864D67CBF3AA45E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_classifiers IDX_73D270B07D89D7F4D54B82DB95E6168F6ED54AF1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_sourceIds IDX_D16FC793292C549EEB2EDCA074EC9726CD0986B1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_CD_classifiers IDX_371097F35C137586E6DD7526076CA322C72FAF79 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_CD_sourceIds IDX_EDE92A1D90AEC06F2C60361D36437D1A20691FDC INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_CD_classifiers_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_F613D04BF286E43A7BBBE6C306F015D0A40BC451 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_CD_sourceIds_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_2B6D6CECE23DAE6820ECA50ECC172FE6FCE673DF INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters IDX_1B734406AE75EF103D3E0913637A741DB602A6E9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_CD_classifiers IDX_C4788824417A9F41E8CB948DAC0C2D1C0580FFD4 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_CD_sourceIds IDX_497353902DBA614467FFC457A40F39BF04CADC33 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_classifiers_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_E050A7DD176C8D18F3307D3851586C8124CA8268 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_classifiers_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_sourceIds_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_86B531D9388F1780960FB5C3BA9D3EDEF14CCB48 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_sourceIds_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_41BEE4E46184F6F17D338D2F8691EF31D188C76D INDEX +IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId INDEX +IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_44075E1D464599B61924196C20F2B88332520CD8 INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators IDX_7BF09D0227840279556AD27ACECB068705893D28 INDEX +IDX_GIN_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_decorators IDX_C212962DB49654BB1526341141D01AF2A3699B5D INDEX +IDX_GIN_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_decorators IDX_786DFF3328DE8D28C54F9ACA126AF6ADB1D21645 INDEX +IDX_GIN_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_CD_decorators IDX_06503CC4580E197BA869DF60207E5CC1778223F0 INDEX +IDX_GIN_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_CD_decorators_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_15F7CCF328E4FA23EE20BE521E07C475825B38C6 INDEX +IDX_GIN_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters IDX_93D8689B66D668B64409D69EB1AD4670419BE4F0 INDEX +IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators INDEX +IDX_GIN_test-built-in-module_EntityTypeA_REL_CD_decorators_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_CCBCF9A86E2AA678D2589DEB3A895076012F941D INDEX +IDX_GIN_test-built-in-module_EntityTypeA_REL_CD_decorators_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589 INDEX +PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT +PK_o-ran-smo-teiv-ran_AntennaCapability_id PK_o-ran-smo-teiv-ran_AntennaCapability_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ENodeBFunction_id PK_o-ran-smo-teiv-ran_ENodeBFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_GNBDUFunction_id PK_o-ran-smo-teiv-ran_GNBDUFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_LTESectorCarrier_id PK_o-ran-smo-teiv-ran_LTESectorCarrier_id CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT +PK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_id PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD CONSTRAINT +PK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_id PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D CONSTRAINT +PK_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_id PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB CONSTRAINT +PK_test-built-in-module_EntityTypeA_id PK_test-built-in-module_EntityTypeA_id CONSTRAINT +REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_CD_classifiers_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9 COLUMN +REL_CD_classifiers_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386 COLUMN +REL_CD_classifiers_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A COLUMN +REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_CD_decorators_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54 COLUMN +REL_CD_decorators_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_92559ED73C761B860682582A040E745ECEC194D5 COLUMN +REL_CD_decorators_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA COLUMN +REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_CD_sourceIds_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C COLUMN +REL_CD_sourceIds_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A COLUMN +REL_CD_sourceIds_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B COLUMN +REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_FK_grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5 COLUMN +REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN +REL_FK_provided-by-entityTypeA REL_FK_provided-by-entityTypeA COLUMN REL_FK_used-antennaCapability REL_FK_used-antennaCapability COLUMN -FK_LTESectorCarrier_REL_FK_used-antennaCapability FK_LTESectorCarrier_REL_FK_used-antennaCapability CONSTRAINT +REL_FK_used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA COLUMN +REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_ID_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_ID_31A5B55158140557F09AE15589A8B8038416689B COLUMN +REL_ID_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0 COLUMN +REL_ID_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845 COLUMN +REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrier_REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF CONSTRAINT +UNIQUE_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_ID_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14 CONSTRAINT +UNIQUE_test-built-in-module_EntityTypeA_REL_ID_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD CONSTRAINT +UNIQUE_test-built-in-module_EntityTypeA_REL_ID_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9 CONSTRAINT aSide_AntennaModule aSide_AntennaModule COLUMN -REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +aSide_EntityTypeA aSide_EntityTypeA COLUMN +aSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters aSide_C812C285BEFA4EC42026AB075D9C65200A00F815 COLUMN +antennaBeamWidth antennaBeamWidth COLUMN +antennaModelNumber antennaModelNumber COLUMN +attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters 6446B2D4BE5E367FB0396383C4BDEF42D51CF74F COLUMN +attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters F03B534AFF0872651FED60C54AB56BEDADAB94B5 COLUMN +attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters 333177AA699C0DE6399503171DCF48FB396322B0 COLUMN +attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters 027B1A8019C6DEF04558B90D9D8B52253B82FEC6 COLUMN +attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters 478D043D81678134EF1C8BFB073A70F882C4AF12 COLUMN +attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters 8252D18D44F633831557076D827993C45278024D COLUMN +attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters 68C48305AB6C3A30DD927F5D38562379374A4B31 COLUMN +bSide_AntennaCapability bSide_AntennaCapability COLUMN +bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515 COLUMN dUpLMNId dUpLMNId COLUMN -frequencyUL frequencyUL COLUMN -bSChannelBwDL bSChannelBwDL COLUMN -CD_sourceIds CD_sourceIds COLUMN -REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -geranFqBands geranFqBands COLUMN -PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id CONSTRAINT -arfcnUL arfcnUL COLUMN -PK_LTESectorCarrier_id PK_LTESectorCarrier_id CONSTRAINT -PK_GNBDUFunction_id PK_GNBDUFunction_id CONSTRAINT -UNIQUE_NRSectorCarrier_REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991 CONSTRAINT -PK_AntennaCapability_id PK_AntennaCapability_id CONSTRAINT -nRFqBands nRFqBands COLUMN -ANTENNACAPABILITY_USES_ANTENNACAPABILITY ANTENNACAPABILITY_USES_ANTENNACAPABILITY TABLE -FK_NRSectorCarrier_REL_FK_used-antennaCapability FK_NRSectorCarrier_REL_FK_used-antennaCapability CONSTRAINT +eNBId eNBId COLUMN +eNodeBPlmnId eNodeBPlmnId COLUMN +eUtranFqBands eUtranFqBands COLUMN +electricalAntennaTilt electricalAntennaTilt COLUMN +gNBDUId gNBDUId COLUMN +gNBId gNBId COLUMN +gNBIdLength gNBIdLength COLUMN geo-location geo-location COLUMN -PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id CONSTRAINT -arfcnDL arfcnDL COLUMN -FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction CONSTRAINT +geranFqBands geranFqBands COLUMN id id COLUMN -gNBId gNBId COLUMN -REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -ANTENNAMODULE_USES_ANTENNAMODULE ANTENNAMODULE_USES_ANTENNAMODULE TABLE -ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY TABLE -bSide_AntennaModule bSide_AntennaModule COLUMN -REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -eNBId eNBId COLUMN +mechanicalAntennaBearing mechanicalAntennaBearing COLUMN +mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +nRFqBands nRFqBands COLUMN +o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE +o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE +o-ran-smo-teiv-ran_ENodeBFunction o-ran-smo-teiv-ran_ENodeBFunction TABLE +o-ran-smo-teiv-ran_GNBDUFunction o-ran-smo-teiv-ran_GNBDUFunction TABLE +o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran_LTESectorCarrier TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE positionWithinSector positionWithinSector COLUMN -aSide_AntennaCapability aSide_AntennaCapability COLUMN -FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_AB3CEA707D389B107F1D10BC724542418E02ABEC CONSTRAINT -REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id CONSTRAINT -FK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_aSide_AntennaCapability FK_3613A8C84275763DE5294B04DB6E6BF74E9412F4 CONSTRAINT -PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id CONSTRAINT -FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule CONSTRAINT -CD_decorators CD_decorators COLUMN -PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id CONSTRAINT -totalTilt totalTilt COLUMN -FK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_C21710428B73A144CC8DE4063CB24D4852D2EFE1 CONSTRAINT -REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -gNBIdLength gNBIdLength COLUMN -AntennaCapability AntennaCapability TABLE -FK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_bSide_AntennaCapability FK_73581B1E05EA3AC4C029F090C067BD88029F1195 CONSTRAINT -REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -bSide_AntennaCapability bSide_AntennaCapability COLUMN -PK_ANTENNAMODULE_USES_ANTENNAMODULE_id PK_ANTENNAMODULE_USES_ANTENNAMODULE_id CONSTRAINT -FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule CONSTRAINT -FK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_bSide_AntennaCapability FK_8B87C4FA55D9F0A4164C35942D91E2E4E0B6140D CONSTRAINT -REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -FK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_aSide_AntennaCapability FK_F407B43F3D94FFE0CBDF7E2BFAEAD9A4047DF252 CONSTRAINT -PK_AntennaModule_id PK_AntennaModule_id CONSTRAINT -REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -antennaBeamWidth antennaBeamWidth COLUMN -UNIQUE_LTESectorCarrier_REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88 CONSTRAINT sectorCarrierType sectorCarrierType COLUMN -REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule CONSTRAINT -GNBDUFunction GNBDUFunction TABLE -mechanicalAntennaTilt mechanicalAntennaTilt COLUMN -electricalAntennaTilt electricalAntennaTilt COLUMN -ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY TABLE -REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -FK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_aSide_AntennaCapability FK_0F27D391D210980029D4A879344BFC1DF7E56047 CONSTRAINT -FK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_aSide_AntennaCapability FK_59989F20BF725E08F0327C7C555B1CF7B4F8661C CONSTRAINT -REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN -gNBDUId gNBDUId COLUMN -ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY TABLE -FK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_bSide_AntennaCapability FK_C66086ACCFA9455ED438AE9381A7E4B0668EA027 CONSTRAINT -eUtranFqBands eUtranFqBands COLUMN -REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -ANTENNAMODULE_SERVES_ANTENNACAPABILITY ANTENNAMODULE_SERVES_ANTENNACAPABILITY TABLE +test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS FB1E124031A12CD85D3335194B39B193723A0490 TABLE +test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS 54110F8D085BBBA7BB6DE5CE71B511562090F7EE TABLE +test-built-in-module_EntityTypeA test-built-in-module_EntityTypeA TABLE +test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters 10B9F515756871D3EF6558FAF1F112BAE207945D TABLE +totalTilt totalTilt COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content", "ownerAppId", "status") FROM stdin; -o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogICAgaW52ZW50b3J5IG1vZGVscyB3aWxsIHVzZSB0byBkZWZpbmUgYW5kIGFubm90YXRlIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyBhIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wb2xvZ3kuCgogICAgICAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YgYW4KICAgICAgICAgICAgQS1zaWRlIGFuZCBhIEItc2lkZS4gVGhlIEEtc2lkZSBpcyBjb25zaWRlcmVkIHRoZSBvcmlnaW5hdGluZyBzaWRlIG9mCiAgICAgICAgICAgIHRoZSByZWxhdGlvbnNoaXA7IHRoZSBCLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcgc2lkZSBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YgaW1wb3J0YW5jZSBhbmQgTVVTVAogICAgICAgICAgICBOT1QgYmUgY2hhbmdlZCBvbmNlIGRlZmluZWQuCgogICAgICAgICAgICBCb3RoIEEtc2lkZSBhbmQgQi1zaWRlIGFyZSBkZWZpbmVkIG9uIGEgdHlwZSwgYW5kIGFyZSBnaXZlbiBhIHJvbGUuIEEKICAgICAgICAgICAgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgICAgICByZWxhdGlvbnNoaXAsIGFsbCBkaXN0aW5ndWlzaGVkIGJ5IHJvbGUgbmFtZS4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSAnbW9kdWxlJyBzdGF0ZW1lbnQuCiAgICAgICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQKICAgICAgICAgICAgcGVyIHBhcmVudCBzdGF0ZW1lbnQuCgogICAgICAgICAgICBTdWJzdGF0ZW1lbnRzIHRvIHRoZSAnYmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBkZWZpbmUgdGhlCiAgICAgICAgICAgIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzIG9mIHRoZQogICAgICAgICAgICByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUgdXNlZCBmb3IKICAgICAgICAgICAgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aCB0aGUgJ2Etc2lkZScKICAgICAgICAgICAgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZSAnYi1zaWRlJwogICAgICAgICAgICBleHRlbnNpb24uIE90aGVyIGRhdGEgbm9kZXMgZGVmaW5lIHByb3BlcnRpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgcmVsYXRpb25zaGlwIG5hbWUgaXMKICAgICAgICAgICAgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUgdW5pcXVlCiAgICAgICAgICAgIHdpdGhpbiB0aGUgc2NvcGUuIjsKCiAgICAgICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICAgIH0KCiAgICBleHRlbnNpb24gYVNpZGUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIHRoZSBBLXNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAndW5pLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lIG9mCiAgICAgICAgICAgIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUgaXMKICAgICAgICAgICAgc2NvcGVkIHRvIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZSB1bmlxdWUKICAgICAgICAgICAgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5IG9mCiAgICAgICAgICAgIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSByZXNpZGVzLiBJZiB0aGUKICAgICAgICAgICAgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZSBwcmVmaXhlZCwgYW5kIGEKICAgICAgICAgICAgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBwcmVmaXguIjsKCiAgICAgICAgYXJndW1lbnQgYVNpZGVUeXBlOwogICAgfQoKICAgIGV4dGVuc2lvbiBiU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUgb2YKICAgICAgICAgICAgdGhlIHJvbGUgb2YgdGhlIEItc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZSBpcwogICAgICAgICAgICBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlIHVuaXF1ZQogICAgICAgICAgICB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkgb2YKICAgICAgICAgICAgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuIElmIHRoZQogICAgICAgICAgICB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlIHByZWZpeGVkLCBhbmQgYQogICAgICAgICAgICBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBiU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgICAgICBhcmd1bWVudCBkb21haW5OYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBsYWJlbCB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYyB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzIOKAmHgueS564oCZIOKAkyBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUgcmV2aXNpb24gc3RhdGVtZW50LiAgWmVybyBvciBvbmUgcmV2aXNpb24gbGFiZWwgc3RhdGVtZW50cwogICAgICAgICAgICBwZXIgcGFyZW50IHN0YXRlbWVudCBhcmUgYWxsb3dlZC4KCiAgICAgICAgICAgIFJldmlzaW9uIGxhYmVscyBNVVNUIGJlIHVuaXF1ZSBhbW9uZ3N0IGFsbCByZXZpc2lvbnMgb2YgYSBtb2R1bGUgb3Igc3VibW9kdWxlLiI7CgogICAgICAgIGFyZ3VtZW50IHNlbXZlcnNpb247CiAgICB9Cn0= BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKCiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgcHJlZml4IG9yLXRlaXYtdHlwZXM7CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IHR5cGVzM2dwcDsgfQoKICBvcmdhbml6YXRpb24gIk9SQU4iOwogIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogICAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuIEFsbCB0eXBlcwogICAgICAgICAgICAgICAgICAgIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICAgICAgbGVhZiBpZCB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdG9wb2xvZ3kgZW50aXRpZXMuIFJlcHJlc2VudHMgdGhlIEVudGl0eSBJbnN0YW5jZSBJZGVudGlmaWVyLiI7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRhaW5lciBkZWNvcmF0b3JzIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLgogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlCiAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUKICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZSBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcKICAgICAgICAgICAgICAgICAgICBlbnRpdGllcy4KCiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlCiAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUKICAgICAgICAgICAgICAgICAgICBwYWlyLgoKICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUKICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyewogICAgICAgIGRlc2NyaXB0aW9uICAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ== BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIk9SQU4gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgIFJBTiBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZSByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0xNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgR05CRFVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLgoKICAgICAgICAgICAgICAgICAgICBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DZW50cmFsaXplZCBVbml0CiAgICAgICAgICAgICAgICAgICAgKGdOQi1DVSkgYW5kIGEgZ05CLURVLiBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsCiAgICAgICAgICAgICAgICAgICAgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVIHByb2Nlc3NlcwogICAgICAgICAgICAgICAgICAgIFBIWSBsZXZlbCBwcm90b2NvbCBhbmQgcmVhbCB0aW1lIHNlcnZpY2VzLiBUaGUKICAgICAgICAgICAgICAgICAgICBnTkItQ1UgYW5kIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEKICAgICAgICAgICAgICAgICAgICBGMSBsb2dpY2FsIGludGVyZmFjZS4KCiAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIGdOQi1EVToKICAgICAgICAgICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1DUCB0aHJvdWdoIHRoZSBGMS1DCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLklzIGNvbm5lY3RlZCB0byB0aGUgZ05CLUNVLVVQIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMgY29ubmVjdGVkIHRvIG9ubHkKICAgICAgICAgICAgICAgICAgICBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBnTkItQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgZ05CLUNVLUNQLgogICAgICAgICAgICAgICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNVLUNQLCBtdWx0aXBsZQogICAgICAgICAgICAgICAgICAgIGdOQi1DVS1VUHMgYW5kIG11bHRpcGxlIGdOQi1EVXMuIGdOQi1EVSBpcyBhIGNvbmNyZXRlCiAgICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UKICAgICAgICAgICAgICAgICAgICBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgRU5vZGVCRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBFdm9sdmVkIE5vZGUgQiAoZU5vZGVCKSBpcyB0aGUgb25seSBtYW5kYXRvcnkKICAgICAgICAgICAgICAgICAgICBub2RlIGluIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0KICAgICAgICAgICAgICAgICAgICBFdm9sdXRpb24gKExURSkuIFRoZSBlTm9kZUIgaXMgYSBjb21wbGV4IGJhc2UKICAgICAgICAgICAgICAgICAgICBzdGF0aW9uIHRoYXQgaGFuZGxlcyByYWRpbyBjb21tdW5pY2F0aW9ucwogICAgICAgICAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZQogICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyIGRlY2lzaW9ucy4gVW5saWtlIDIvM0cKICAgICAgICAgICAgICAgICAgICB3aXJlbGVzcyBSQU4sIHRoZXJlIGlzIG5vIGNlbnRyYWxpemVkIHJhZGlvIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkCiAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG1vYmlsZSBwaG9uZSBuZXR3b3JrIHRoYXQgY29tbXVuaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgd2l0aCBtb2JpbGUgaGFuZHNldHMgKFVzZXIgRXF1aXBtZW50KSwgbGlrZSBhIGJhc2UKICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzCiAgICAgICAgICAgICAgICAgICAgdGhlIGFyY2hpdGVjdHVyZSBhbmQgYWxsb3dzIGxvd2VyIHJlc3BvbnNlIHRpbWVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ2VsbCBHbG9iYWwgSWRlbnRpdHksIGFuZCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTMSBpbnRlcmZhY2UiOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgICAgICBkZWZhdWx0IDExOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgZU5vZGVCUGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgRU5vZGVCIFB1YmxpYyBMYW5kIE1vYmlsZSBOZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUExNTikgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZSAoTUNDPTAwMSwgTU5DPTAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBjYW4gbm90IGJlIHVzZWQgYXMgYSB2YWxpZCBQTE1OIElkZW50aXR5LiI7CgogICAgICAgICAgICAgICAgbGVhZiBtY2MgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTUNDIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExNTiBpZGVudGl0eSB1c2VkIGluIHRoZSByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDIuLjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbAogICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgUkJTIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UKICAgICAgICAgICAgICAgICAgICBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuIFRoZSBNTyBhbHNvCiAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZi1saXN0IGVVdHJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTFRFIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhc3NvY2lhdGVkIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgZ2VyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhc3NvY2lhdGVkIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IExURVNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTFRFIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIGZvciBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3MKICAgICAgICAgICAgICAgICAgICBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlCiAgICAgICAgICAgICAgICAgICAgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24gaGF2aW5nCiAgICAgICAgICAgICAgICAgICAgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLgogICAgICAgICAgICAgICAgICAgIFRoZSBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwKICAgICAgICAgICAgICAgICAgICBpbnRlcmZlcmVuY2UgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcwogICAgICAgICAgICAgICAgICAgIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzZWN0b3IgY2FycmllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxsZWQgYnkgTU8gU2VjdG9yQ2FycmllciBpcyBhIGRpZ2l0YWwgc2VjdG9yLiI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIG5vcm1hbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMKICAgICAgICAgICAgICAgICAgICB0aGUgYXR0cmlidXRlcyBmb3IgZGVmaW5pbmcgdGhlIGxvZ2ljYWwKICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgICAgICAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIHdpdGggYSBiYXNlIHN0YXRpb24gaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsCiAgICAgICAgICAgICAgICAgICAgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUgY29uY2VwdAogICAgICAgICAgICAgICAgICAgIG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwKICAgICAgICAgICAgICAgICAgICBpbnRlcmZlcmVuY2UgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3MKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGFyZmNuVUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIGZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgdXBsaW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGJTQ2hhbm5lbEJ3REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkJTIENoYW5uZWwgYmFuZHdpZHRoIGluIE1IeiBmb3IgZG93bmxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSB1c2VkIGJ5IE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFDQVBBQklMSVRZX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4uMSB0byAwLi4xKQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BQ0FQQUJJTElUWV9QUk9WSURFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLm4pCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHByb3ZpZGVkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BQ0FQQUJJTElUWV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4ubiB0byAwLi4xKQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHNlcnZpY2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQUNBUEFCSUxJVFlfUkVBTElTRURfQllfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4ubiB0byAwLi5tKQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KfQ== BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSByZWxhdGlvbnMgYmV0d2VlbiBFcXVpcG1lbnQgYW5kIFJBTi4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTE0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9Cg== BUILT_IN_MODULE IN_USAGE -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiBFcXVpcG1lbnQgdG9wb2xvZ3kgbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQogICAgRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsKCiAgICBsaXN0IEFudGVubmFNb2R1bGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsIGFzcGVjdCBvZiBhbiBhbnRlbm5hLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllci4gVGhpcyBhdHRyaWJ1dGUgaXMgcGFydCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGFudGVubmEgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBhcyB0aGUgaW5jbGluYXRpb24gb2YgdGhlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUgdmVydGljYWwgcGxhbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkIGFuZCBoYXMgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZCB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVtb3RlIEVsZWN0cmljYWwgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZWxlY3RyaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbGVjdHJpY2FsbHktY29udHJvbGxlZCB0aWx0IG9mIG1haW4gYmVhbSBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBheGlzIChzZWUgM0dQUCBUUyAyNS40NjYpLiBWYWx1ZSBpcyBzaWduZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWx0IGRvd24gaXMgcG9zaXRpdmUsIHRpbHQgdXAgaXMgbmVnYXRpdmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgYW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hIHJhZGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4gZGVncmVlcy4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1VTRVNfQU5URU5OQU1PRFVMRSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLjEpCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHJlYWxpc2VkIGJ5IEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzZXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KfQ== BUILT_IN_MODULE IN_USAGE +COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +_3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CgogIGltcG9ydCBpZXRmLWluZXQtdHlwZXMgeyBwcmVmaXggaW5ldDsgfQogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgeyBwcmVmaXggeWFuZzsgfQogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IHlleHQzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZAogICAgbmV0d29yayBzbGljaW5nLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLAogICAgVFRBLCBUVEMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLiI7CiAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyMyI7CgogIHJldmlzaW9uIDIwMjMtMTEtMDYgeyByZWZlcmVuY2UgQ1ItMDMwNTsgfQogIHJldmlzaW9uIDIwMjMtMDktMTggeyByZWZlcmVuY2UgQ1ItMDI3MSA7IH0KICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CgogIHJldmlzaW9uIDIwMjEtMDktMzAgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIExvbmdpdHVkZSwgTGF0aXR1ZGUsIFRlbnRoT2ZEZWdyZWVzLCBPbk9mZi4iOwogICAgcmVmZXJlbmNlICJDUi0wMTM4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMTEtMDYgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgaW5jb3JyZWN0IFMtTlNTQUkgZGVmaW5pdGlvbnMuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDExOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTAzLTEwIHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGZhdWx0eSB3aGVuIHN0YXRlbWVudHMuIjsKICAgIHJlZmVyZW5jZSAiU1AtMjAwMjI5IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CgogIGdyb3VwaW5nIG5hbWVWYWx1ZVBhaXIgewogICAgbGVhZiBuYW1lIHsgdHlwZSBzdHJpbmc7IH0KICAgIGxlYWYgdmFsdWUgeyB0eXBlIHN0cmluZzsgfQogIH0KCiAgZ3JvdXBpbmcgUHJvY2Vzc01vbml0b3JHcnAgewogICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGF0dHJpYnV0ZXMgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgcHJvY2Vzc2VzCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcwogICAgICB3aGVuIHNwZWNpZnlpbmcgdGhlIG1hbmFnZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgcHJvY2Vzc2VzLgogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LgogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEKICAgICAgY29uY3JldGUgcHJvY2VzcyByZXByZXNlbnRhdGlvbi4KCiAgICAgIElmIGEgbWFuYWdlbWVudCBvcGVyYXRpb24gb24gc29tZSBJT0NzIHRyaWdnZXJzIGFuIGFzc29jaWF0ZWQKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlCiAgICAgICdQcm9jZXNzTW9uaXRvcicpIGluIHRoZXNlIElPQyhzKS4gVGhlIHByb2Nlc3NNb25pdG9yIGF0dHJpYnV0ZSBtYXkgYmUKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IKICAgICAgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBtYXkgYmUgcHJvdmlkZWQgYnkgdGhlICdwcm9ncmVzc1N0YXRlSW5mbycgYW5kCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0bwogICAgICBzdGFydCBleGVjdXRpbmcgdGhlIHByb2Nlc3MgYW5kIHRvIHRyYW5zaXRpb24gaW50byB0aGUgJ1JVTk5JTkcnIHN0YXRlLgogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lCiAgICAgIGFsdGVybmF0aXZlIG11c3QgYmUgc2VsZWN0ZWQgd2hlbiB1c2luZyB0aGlzIGRhdGEgdHlwZS4KCiAgICAgIER1cmluZyB0aGUgJ1JVTk5JTkcnIHN0YXRlIHRoZSAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGUgbWF5IGJlCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8KICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0bwogICAgICBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbiB0aGUgJ05PVF9SVU5OSU5HJywgJ0NBTkNFTExJTkcnCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzCiAgICAgIHVzZWQuCgogICAgICBVcG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJvY2VzcywgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBzZXQKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkCiAgICAgIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuIFRoZSB0eXBlIG9mCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkCiAgICAgIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIHVzZWQuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgdGhlICdzdGF0dXMnCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZgogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZQogICAgICAncmVzdWx0U3RhdGVJbmZvJyBzcGVjaWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUuCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbgogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbiBhcyB3ZWxsLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBpcyBjYW5jZWxsZWQsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgZmlyc3Qgc2V0IHRvCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLgogICAgICBUaGUgdmFsdWUgb2YgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLiBBZGRpdGlvbmFsIHRleHR1YWwKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvcgogICAgICAnQ0FOQ0VMTEVEJy4gSXQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIG1ha2luZyB0aGUgb3V0Y29tZSwgdGhhdCB0aGUKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55CiAgICAgIG1vcmUgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUsIG9yIHRoZSBwcm9jZXNzIG91dGNvbWUgaXMgbmVlZGVkIHVudGlsIGEKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4KICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMKICAgICAgaW5kaWNhdGVkIGJ5IHRoZSAndGltZXInIGF0dHJpYnV0ZS4iOwoKICAgIGxlYWYgaWQgewogICAgICB0eXBlIHN0cmluZzsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJJZCBvZiB0aGUgcHJvY2Vzcy4gSXQgaXMgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZQogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KCiAgICBsZWFmIHN0YXR1cyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gTk9UX1NUQVJURUQgOwogICAgICAgIGVudW0gUlVOTklORyA7CiAgICAgICAgZW51bSBDQU5DRUxMSU5HIDsKICAgICAgICBlbnVtIEZJTklTSEVEIDsKICAgICAgICBlbnVtIEZBSUxFRCA7CiAgICAgICAgZW51bSBQQVJUSUFMTFlfRkFJTEVEIDsKICAgICAgICBlbnVtIENBTkNFTExFRCA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZWZhdWx0ICBSVU5OSU5HOwogICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLgogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkCiAgICAgICAgcHJvY2Vzcy4gIjsKICAgIH0KCiAgICBsZWFmIHByb2dyZXNzUGVyY2VudGFnZSB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlIDAuLjEwMDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJQcm9ncmVzcyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGFzIHBlcmNlbnRhZ2UiOwogICAgfQoKICAgIGxlYWYtbGlzdCBwcm9ncmVzc1N0YXRlSW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZwogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcwogICAgICAgICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCBhbmQgJ0NBTkNFTExFRCcuCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcwogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MKICAgICAgICBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCwgaWYgYW55LiBGb3IgdGhpcyBwdXJwb3NlLCBkZWRpY2F0ZWQKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgc3RhcnRUaW1lIHsKICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlN0YXJ0IHRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgaS5lLiB0aGUgdGltZSB3aGVuIHRoZQogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLgoKICAgICAgICBJZiB0aGUgdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBpdCBpcyB0aGUgZXN0aW1hdGVkIHRpbWUKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUKICAgICAgICBNblNfUHJvZHVjZXIuCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCgogICAgICAgIE9uY2UgdGhlIHRpbWVyIGlzIHNldCwgdGhlIGNvbnN1bWVyIGNhbiBub3QgY2hhbmdlIGl0IGFueW1vcmUuCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgICAgeWV4dDNncHA6bm90Tm90aWZ5YWJsZTsKICAgIH0KICB9CgogIHR5cGVkZWYgVGVudGhPZkRlZ3JlZXMgewogICAgdHlwZSB1aW50MTYgewogICAgICByYW5nZSAwLi4zNjAwOwogICAgfQogICAgdW5pdHMgIjAuMSBkZWdyZWVzIjsKICAgIGRlc2NyaXB0aW9uICJBIHNpbmdsZSBpbnRlZ3JhbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGFuZ2xlIGluIGRlZ3JlZXMKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIEFsdGl0dWRlICB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgfQogICAgdW5pdHMgIm1ldGVycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4iOwogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBMYXRpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBsb25naXR1ZGUgewogICAgICB0eXBlIExvbmdpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBhbHRpdHVkZSB7CiAgICAgIHR5cGUgQWx0aXR1ZGU7CiAgICB9CgogIH0KCiAgdHlwZWRlZiBPbk9mZiB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBPTjsKICAgICAgZW51bSBPRkY7CiAgICB9CiAgfQoKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcwogIC8vICBiZWluZyBtb3ZlZCB0byBfM2dwcC01Z2MtbnJtLW5mcHJvZmlsZQogIGdyb3VwaW5nIE1hbmFnZWRORlByb2ZpbGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORiI7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuNTAxIjsKCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQoKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLgogICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIE5GIEluc3RhbmNlIElEIHNoYWxsIGJlIGEKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgICB5ZXh0M2dwcDppblZhcmlhbnQ7CiAgICB9CgogICAgbGVhZi1saXN0IG5mVHlwZSB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIHR5cGUgTmZUeXBlOwogICAgICBkZXNjcmlwdGlvbiAiVHlwZSBvZiB0aGUgTmV0d29yayBGdW5jdGlvbiIgOwogICAgfQoKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQoKICAgIGxlYWYgYXV0aHpJbmZvIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBORiBTcGVjaWZpYyBTZXJ2aWNlIGF1dGhvcml6YXRpb24KICAgICAgICBpbmZvcm1hdGlvbi4gSXQgc2hhbGwgaW5jbHVkZSB0aGUgTkYgdHlwZSAocykgYW5kIE5GIHJlYWxtcy9vcmlnaW5zCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KCiAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBORiBpbnN0YW5jZQogICAgICAgIChlLmcuIGdlb2dyYXBoaWMgbG9jYXRpb24sIGRhdGEgY2VudGVyKSBkZWZpbmVkIGJ5IG9wZXJhdG9yIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uCiAgICAgICAgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIGV4cHJlc3NlZCBhcyBhIHdlaWdodCByZWxhdGl2ZSB0byBvdGhlcgogICAgICAgIE5GIGluc3RhbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyBpZiBjYXBhY2l0eSBpcyBhbHNvIHByZXNlbnQgaW4gdGhlCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMKICAgICAgICBzZXJ2ZWQgYnkgdGhlIE5GIGluc3RhbmNlLgogICAgICAgIE1heSBiZSBjb25maWcgZmFsc2Ugb3IgdHJ1ZSBkZXBlbmRpbmcgb24gdGhlIE1hbmFnZWRGdW5jdGlvbi4KICAgICAgICBDb25maWc9dHJ1ZSBmb3IgVWRyaW5mby4gQ29uZmlnPWZhbHNlIGZvciBVZG1JbmZvIGFuZCBBdXNmSW5mby4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc3VwcG9ydGVkRGF0YVNldElkcyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU1VCU0NSSVBUSU9OOwogICAgICAgIGVudW0gUE9MSUNZOwogICAgICAgIGVudW0gRVhQT1NVUkU7CiAgICAgICAgZW51bSBBUFBMSUNBVElPTjsKICAgICAgfQogICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBzdXBwb3J0ZWQgZGF0YSBzZXRzIGluIHRoZSBVRFIgaW5zdGFuY2UuCiAgICAgICAgTWF5IGJlIHByZXNlbnQgaWYgLi4vbmZUeXBlID0gVURSIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVQRiI7CiAgICAgIHJlZmVyZW5jZSAiVFMgMjkuNTEwIiA7CiAgICB9CgogICAgbGVhZiBwcmlvcml0eSB7CiAgICAgIHR5cGUgdWludDE2OwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBQcmlvcml0eSAocmVsYXRpdmUgdG8gb3RoZXIgTkZzCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsKICAgICAgICBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgYSBoaWdoZXIgcHJpb3JpdHkuIElmIHByaW9yaXR5IGlzIGFsc28gcHJlc2VudAogICAgICAgIGluIHRoZSBuZlNlcnZpY2VMaXN0IHBhcmFtZXRlcnMsIHRob3NlIHdpbGwgaGF2ZSBwcmVjZWRlbmNlIG92ZXIKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KCiAgdHlwZWRlZiB1c2FnZVN0YXRlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIElETEU7CiAgICAgIGVudW0gQUNUSVZFOwogICAgICBlbnVtIEJVU1k7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiSXQgZGVzY3JpYmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZXNvdXJjZSBpcyBhY3RpdmVseSBpbgogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZQogICAgICBjYXBhY2l0eSBmb3IgYWRkaXRpb25hbCB1c2VycyBhdCB0aGF0IGluc3RhbnQuIFRoZSB2YWx1ZSBpcyBSRUFELU9OTFkuIjsKICAgIHJlZmVyZW5jZSAiSVRVIFQgUmVjb21tZW5kYXRpb24gWC43MzEiOwogIH0KCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CgogIHR5cGVkZWYgTWNjIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIGNvdW50cnkgY29kZSBjb25zaXN0cyBvZiB0aHJlZSBkZWNpbWFsIGRpZ2l0cywKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMKICAgICAgcmVnaW9uICh0aGUgZGlnaXRzIDEgYW5kIDggYXJlIG5vdCB1c2VkKToiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMDItNzldWzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgdHlwZWRlZiBNbmMgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgbmV0d29yayBjb2RlIGNvbnNpc3RzIG9mIHR3byBvciB0aHJlZQogICAgICBkZWNpbWFsIGRpZ2l0cyAoZm9yIGV4YW1wbGU6IE1OQyBvZiAwMDEgaXMgbm90IHRoZSBzYW1lIGFzIE1OQyBvZiAwMSkiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05XVswLTldWzAtOV18WzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgZ3JvdXBpbmcgUExNTklkIHsKICAgIGxlYWYgbWNjIHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgTWNjOwogICAgfQogICAgbGVhZiBtbmMgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNbmM7CiAgICB9CiAgICByZWZlcmVuY2UgIlRTIDM4LjQxMyBjbGF1c2UgOS4zLjMuNSI7CiAgfQoKICB0eXBlZGVmIE5jaSB7CiAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4gVGhlIE5DSSBzaGFsbCBiZSBvZiBmaXhlZCBsZW5ndGggb2YgMzYgYml0cwogICAgICBhbmQgc2hhbGwgYmUgY29kZWQgdXNpbmcgZnVsbCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQoKICB0eXBlZGVmIE9wZXJhdGlvbmFsU3RhdGUgewogICAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyNSBhbmQgSVRVLVQgWC43MzEiOwogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyB0b3RhbGx5IGlub3BlcmFibGUuIjsKICAgICAgfQoKICAgICAgZW51bSBFTkFCTEVEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgcGFydGlhbGx5IG9yIGZ1bGx5IG9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICB9CiAgfQoKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KCiAgICAgIGVudW0gU0hVVFRJTkdET1dOIHsKICAgICAgICB2YWx1ZSAyOwogICAgICAgIGRlc2NyaXB0aW9uICJVc2Ugb2YgdGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcGVybWl0dGVkIHRvCiAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZXMgb2YgdXNlIG9ubHkuIFdoaWxlIHRoZSBzeXN0ZW0gcmVtYWlucyBpbgogICAgICAgICAgdGhlIHNodXR0aW5nIGRvd24gc3RhdGUgdGhlIG1hbmFnZXIgb3IgdGhlIG1hbmFnZWQgZWxlbWVudAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZQogICAgICAgICAgbG9ja2VkIHN0YXRlLiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOwogICAgICAgICAgZW51bSBPRkZfTElORTsKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7CiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7CiAgICAgICAgICBlbnVtIERFR1JBREVEOwogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOwogICAgICAgICAgZW51bSBMT0dfRlVMTDsKICAgICAgIH0KICB9CgogIHR5cGVkZWYgQ2VsbFN0YXRlIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBJRExFOwogICAgICAgIGVudW0gSU5BQ1RJVkU7CiAgICAgICAgZW51bSBBQ1RJVkU7CiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKQogICAgICBhcyBzcGVjaWZpZWQgaW4gY2xhdXNlIDI4LjYgb2YgVFMgMjMuMDAzLCBjbGF1c2UgOC4yIG9mIFRTIDM4LjMwMAogICAgICBhbmQgY2xhdXNlIDkuMy4zLjExIG9mIFRTIDM4LjQxMy4gSXQgaXMgY29tcG9zZWQgb2YgdGhlIFBMTU4KICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQKICAgICAgdGhlIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4gIjsKICAgIGxpc3QgcGxtbklkIHsKICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSWRlbnRpdHkuIjsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIG1heC1lbGVtZW50cyAxOwogICAgICBrZXkgIm1jYyBtbmMiOwogICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICB9CgogICAgbGVhZiB0YWMgeyB0eXBlIFRhYzsgfQogIH0KCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsKICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgICAgcmFuZ2UgLTkwLi45MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMYXRpdHVkZSBiYXNlZCBvbiBXb3JsZCBHZW9kZXRpYyBTeXN0ZW0gKDE5ODQgdmVyc2lvbikKICAgICAgICBnbG9iYWwgcmVmZXJlbmNlIGZyYW1lIChXR1MgODQpLiBQb3NpdGl2ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgICByYW5nZSAtMTgwLi4xODAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIGJhc2VkIG9uIFdvcmxkIEdlb2RldGljIFN5c3RlbSAoMTk4NCB2ZXJzaW9uKQogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvCiAgICAgICAgZGVncmVlcyBlYXN0IG9mIDAgZGVncmVlcyBsb25naXR1ZGUuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIEdlb0FyZWFHcnAgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YSB0eXBlIGRlZmluZXMgYSBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgVGhlIGdlby1hcmVhIGlzIGRlZmluZWQgdXNpbmcgYSBjb252ZXggcG9seWdvbiBpbiB0aGUgYXR0cmlidXRlCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwoKICAgIGxpc3QgY29udmV4R2VvUG9seWdvbiB7CiAgICAgIGRlc2NyaXB0aW9uICJTcGVjaWZpZXMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHdpdGggYSBjb252ZXggcG9seWdvbi4KICAgICAgICBUaGUgY29udmV4IHBvbHlnb24gaXMgc3BlY2lmaWVkIGJ5IGl0cyBjb3JuZXJzLiI7CiAgICAgICAga2V5ICJsYXRpdHVkZSBsb25naXR1ZGUiOwogICAgICBtaW4tZWxlbWVudHMgMzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwoKICAgICAgdXNlcyBHZW9Db29yZGluYXRlR3JwOwogICAgfQogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSB1aW50OCA7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlNldElkIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgewogICAgbGVhZiBhbWZSZWdpb25JZCB7CiAgICAgIHR5cGUgQW1mUmVnaW9uSWQ7CiAgICB9CiAgICBsZWFmIGFtZlNldElkIHsKICAgICAgdHlwZSBBbWZTZXRJZDsKICAgIH0KICAgIGxlYWYgYW1mUG9pbnRlciB7CiAgICAgIHR5cGUgQW1mUG9pbnRlcjsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLgogICAgICBUaGUgQU1GIFJlZ2lvbiBJRCBpZGVudGlmaWVzIHRoZSByZWdpb24sCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7CiAgfQoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0KICB9CgogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9CiAgfQoKICB0eXBlZGVmIExvYWQgewogICAgZGVzY3JpcHRpb24gIkxhdGVzdCBrbm93biBsb2FkIGluZm9ybWF0aW9uIG9mIHRoZSBORiwgcGVyY2VudGFnZSAiOwogICAgdHlwZSB1aW50OCB7CiAgICAgIHJhbmdlIDAuLjEwMDsKICAgIH0KICB9CgogIHR5cGVkZWYgTjFNZXNzYWdlQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gNUdNTTsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBMUFA7CiAgICAgIGVudW0gU01TOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMkluZm9ybWF0aW9uQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTlJQUEE7CiAgICAgIGVudW0gUFdTOwogICAgICBlbnVtIFBXU19CQ0FMOwogICAgICBlbnVtIFBXU19SRjsKICAgIH0KICB9CgogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewoKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KCiAgICBsZWFmIGNhbGxiYWNrVXJpIHsKICAgICAgdHlwZSBpbmV0OnVyaTsKICAgIH0KCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfQogIH0KCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgfQoKICBncm91cGluZyBJcHY2UHJlZml4UmFuZ2UgewogIGxlYWYgc3RhcnQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICB9CgogIHR5cGVkZWYgTnNpSWQgewogICAgdHlwZSBzdHJpbmc7CiAgfQoKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CgogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CgogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CgogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOwogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9CiAgfQoKICAvKiBEaXN0aW5ndWlzaGVkTmFtZSBwYXR0ZXJuIGlzIGJ1aWx0IHVwIGJhc2VkIG9uIHRoZQogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KCiAgICBsZWFmIEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vICBTYW1lIHBhdHRlcm4gYXMgTG9jYWxETgogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPygsW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQgICBNZS5teWtleT0xIGFsbG93ZWQKICAgICAgLy8gIChmdWxsTG9jYWxSRE4pKCwoZnVsbExvY2FsUkROKSkqCiAgICAgIHBhdHRlcm4gJygoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSgsKChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qfChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qXC5bYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qKSk9KChbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykpKSonOwogICAgfSB9CgogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0gfQoKICAgIGxlYWYgZnVsbExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgZnVsbExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICAvLyBwYXR0ZXJuIExvY2FsRE5BdHRyaWJ1dGVUeXBlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsKICAgIH0gfQoKICAgICAgLy8gbGltaXRhdGlvbjogTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlbm90IHN1cHBvcnRlZCBNZS5teWtleT0xCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUgeyB0eXBlIHN0cmluZyB7CiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOwogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWVzT2ZDbGFzc0FuZE5hbWluZ0F0dHJpYnV0ZSAgeyB0eXBlIHN0cmluZyB7ICAvLyBDbGFzc05hbWUgLCBDbGFzc05hbWluZ0F0dHJpYnV0ZVNlcGFyYXRvciAsIE5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgLy8gcGF0dGVybjogQ2xhc3NOYW1lXC5OYW1pbmdBdHRyaWJ1dGVOYW1lCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSonIDsKICAgIH0gfQoKICAgIGxlYWYgcmVzdHJpY3RpdmVDbGFzc05hbWUgeyB0eXBlIHN0cmluZyB7ICAgICAvLwogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7CiAgICB9IH0KCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwnCiAgICAgICsgJyhcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKicKICAgICAgKyAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JwogICAgICArICcoLFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKScKICAgICAgKyAnKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSAzR1BQIHN0YW5kYXJkIGZvciBEaXN0aW5ndWlzaGVkTmFtZS4KCiAgICAgIExpbWl0YXRpb25zOgogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZAogICAgICAgIChlZy4gTWFuYWdlZEVsZW1lbnQubXlrZXk9MzQ1NDM2KSI7CiAgICByZWZlcmVuY2UgICIzR1BQIFRTIDMyLjMwMCI7CiAgfQoKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsKICAgICAgcmFuZ2UgIi0yNCB8IC0yMiB8IC0yMCB8IC0xOCB8IC0xNiB8IC0xNCB8IC0xMiB8IC0xMCB8IC04IHwgLTYgfCAiICsKICAgICAgICAiIC01IHwgLTQgfCAtMyB8IC0yIHwgLTEgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgOCB8IDEwIHwgIiArCiAgICAgICAgIiAxMiB8IDE0IHwgMTYgfCAxOCB8IDIwIHwgMjIgfCAyNCI7CiAgICB9CiAgICB1bml0cyBkQjsKICB9CgogIGdyb3VwaW5nIFJlcG9ydGluZ0N0cmwgewogICAgY2hvaWNlIHJlcG9ydGluZ0N0cmwgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIgogICAgICAgIFRoaXMgY2hvaWNlIGRlZmluZXMgdGhlIG1ldGhvZCBmb3IgcmVwb3J0aW5nIGNvbGxlY3RlZCBwZXJmb3JtYW5jZQogICAgICAgIG1ldHJpY3MgdG8gTW5TIGNvbnN1bWVycyBhcyB3ZWxsIGFzIHRoZSBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmluZyB0aGUKICAgICAgICByZXBvcnRpbmcgZnVuY3Rpb24uIEl0IGlzIGEgY2hvaWNlIGJldHdlZW4gdGhlIGNvbnRyb2wgcGFyYW1ldGVyCiAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnRpbmcgbWV0aG9kcywgd2hvc2UgcHJlc2VuY2Ugc2VsZWN0cyB0aGUKICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGFzIGZvbGxvd3M6CgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TCiAgICAgICAgcHJvZHVjZXIgc2hhbGwgc3RvcmUgZmlsZXMgb24gdGhlIE1uUyBwcm9kdWNlciBhdCBhIGxvY2F0aW9uIHNlbGVjdGVkCiAgICAgICAgYnkgdGhlIE1uUyBwcm9kdWNlciBhbmQsIG9uIGNvbmRpdGlvbiB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YnNjcmlwdGlvbgogICAgICAgIGlzIGluIHBsYWNlLCBpbmZvcm0gdGhlIE1uUyBjb25zdW1lciBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIG5ldwogICAgICAgIGZpbGVzIGFuZCB0aGUgZmlsZSBsb2NhdGlvbiB1c2luZyB0aGUgbm90aWZ5RmlsZVJlYWR5IG5vdGlmaWNhdGlvbi4KICAgICAgICBJbiBjYXNlIHRoZSBwcmVwYXJhdGlvbiBvZiBhIGZpbGUgZmFpbHMsICdub3RpZnlGaWxlUHJlcGFyYXRpb25FcnJvcicKICAgICAgICBzaGFsbCBiZSBzZW50IGluc3RlYWQuCgogICAgICAgIC0gV2hlbiB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGFuZCAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycKICAgICAgICBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LCB0aGVuIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgYmVoYXZlIGxpa2UKICAgICAgICBkZXNjcmliZWQgZm9yIHRoZSBjYXNlIHRoYXQgb25seSB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGlzIHByZXNlbnQuCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgY3JlYXRlIG9uIGJlaGFsZiBvZiB0aGUgTW5TCiAgICAgICAgY29uc3VtZXIgYSBzdWJzY3JpcHRpb24sIHVzaW5nICdOdGZTdWJzY3JpcHRpb25Db250cm9sJywgZm9yIHRoZQogICAgICAgIG5vdGlmaWNhdGlvbiB0eXBlcyAnbm90aWZ5TU9JQ3JlYXRpb24nIGFuZCAnbm90aWZ5TU9JRGVsZXRpb24nIHJlbGF0ZWQKICAgICAgICB0byB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgcHJvZHVjZWQgbGF0ZXIuIEluIGNhc2UgYW4gZXhpc3RpbmcKICAgICAgICBzdWJzY3JpcHRpb24gZG9lcyBhbHJlYWR5IGluY2x1ZGUgdGhlICdGaWxlJyBpbnN0YW5jZXMgdG8gYmUgcHJvZHVjZWQsCiAgICAgICAgbm8gbmV3IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBjcmVhdGVkLiBUaGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgYXR0cmlidXRlIGluIHRoZSBjcmVhdGVkCiAgICAgICAgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIHNoYWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICAgJ25vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MnIGluIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJy4gVGhpcwogICAgICAgIGZlYXR1cmUgaXMgY2FsbGVkIGltcGxpY2l0IG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24sIGFzIG9wcG9zZWQgdG8gdGhlCiAgICAgICAgY2FzZSB3aGVyZSB0aGUgTW5TIGNvbnN1bWVyIGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiAoZXhwbGljaXQKICAgICAgICBub3RpZmljYXRpb24gc3Vic2NyaXB0aW9uKS4gV2hlbiB0aGUgcmVsYXRlZCAnUGVyZk1ldHJpY0pvYicgaXMKICAgICAgICBkZWxldGVkLCB0aGUgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIGNyZWF0ZWQgZHVlIHRvIHRoZQogICAgICAgIHJlcXVlc3QgZm9yIGltcGxpY2l0IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBkZWxldGVkIGFzIHdlbGwuCgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGFuZCBmaWxlTG9jYXRpb24gYXR0cmlidXRlcyBhcmUKICAgICAgICBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyIHNoYWxsIHN0b3JlIHRoZSBmaWxlcyBvbiBhIE1uUyBjb25zdW1lciwgdGhhdAogICAgICAgIGNhbiBiZSBhbnkgZW50aXR5IHN1Y2ggYXMgYSBmaWxlIHNlcnZlciwgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQogICAgICAgIGZpbGVMb2NhdGlvbi4gTm8gbm90aWZpY2F0aW9uIGlzIGVtaXR0ZWQgYnkgdGhlIE1uUyBwcm9kdWNlci4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIHN0cmVhbVRhcmdldCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIE1uUyBwcm9kdWNlcgogICAgICAgIHNoYWxsIHN0cmVhbSB0aGUgZGF0YSB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHN0cmVhbVRhcmdldC4KCiAgICAgICAgRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2RzIHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZQogICAgICAgIHNwZWNpZmllcyB0aGUgdGltZSB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlCiAgICAgICAgc3RvcmVkIGludG8gdGhlIHNhbWUgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzCiAgICAgICAgb3BlbmVkLiI7CgogICAgICBjYXNlIGZpbGUtYmFzZWQtcmVwb3J0aW5nIHsKICAgICAgICBsZWFmIGZpbGVSZXBvcnRpbmdQZXJpb2QgewogICAgICAgICAgdHlwZSB1aW50MzIgewogICAgICAgICAgICByYW5nZSAxLi5tYXg7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyBtaW51dGVzOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgdGhpcyBpcyB0aGUgdGltZQogICAgICAgICAgICB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCBpbnRvIHRoZSBzYW1lCiAgICAgICAgICAgIGZpbGUgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCBhbmQgYSBuZXcgZmlsZSBpcyBvcGVuZWQuCiAgICAgICAgICAgIFRoZSB0aW1lLXBlcmlvZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGdyYW51bGFyaXR5UGVyaW9kLgoKICAgICAgICAgICAgQXBwbGljYWJsZSB3aGVuIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICAgIGNob2ljZSByZXBvcnRpbmctdGFyZ2V0IHsKICAgICAgICAgIGNhc2UgZmlsZS10YXJnZXQgewogICAgICAgICAgICBsZWFmIGZpbGVMb2NhdGlvbiB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFwcGxpY2FibGUgYW5kIG11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBmaWxlLWJhc2VkCiAgICAgICAgICAgICAgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgZmlsZXMgYXJlIHN0b3JlZCBvbiB0aGUgTW5TCiAgICAgICAgICAgICAgY29uc3VtZXIuIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY2FzZSBub3RpZmljYXRpb24tdGFyZ2V0IHsKICAgICAgICAgICAgbGVhZiBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNdXN0IGJlIHByZXNlbnQgd2hlbiB0aGUgbm90aWZpY2F0aW9uLWJhc2VkIHJlcG9ydGluZwogICAgICAgICAgICAgIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgdGhlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXMKICAgICAgICAgICAgICBub3RpZmljYXRpb25zIGZvciB0aGUgTW5TIGNvbnN1bWVyIHRvIHN1YnNjcmliZSB0by4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZGVzY3JpcHRpb24gIldoZW4gbmV0aWhlciBmaWxlTG9jYXRpb24gb3Igbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcwogICAgICAgICAgYXJlIHByZXNlbnQsIHRoZSBmaWxlcyBhcmUgc3RvcmVkIGFuZCBhdmFpbGFibGUgdG8gdGhlIE1uUyBjb25zdW1lcgogICAgICAgICAgaWYgdGhlIE1uUyBzdWJzY3JpYmVzIHRvIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLiI7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYXNlIHN0cmVhbS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgc3RyZWFtVGFyZ2V0IHsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSB3aGVuIHN0cmVhbS1iYXNlZCByZXBvcnRpbmcgbWV0aG9kIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4iOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo= +ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo= +o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogICAgaW52ZW50b3J5IG1vZGVscyB3aWxsIHVzZSB0byBkZWZpbmUgYW5kIGFubm90YXRlIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyBhIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wb2xvZ3kuCgogICAgICAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YKICAgICAgICAgICAgYW4gQS1zaWRlIGFuZCBhIEItc2lkZS4gVGhlIEEtc2lkZSBpcyBjb25zaWRlcmVkIHRoZSBvcmlnaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXA7IHRoZSBCLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YKICAgICAgICAgICAgaW1wb3J0YW5jZSBhbmQgTVVTVCBOT1QgYmUgY2hhbmdlZCBvbmNlIGRlZmluZWQuCgogICAgICAgICAgICBCb3RoIEEtc2lkZSBhbmQgQi1zaWRlIGFyZSBkZWZpbmVkIG9uIGEgdHlwZSwgYW5kIGFyZSBnaXZlbiBhIHJvbGUuCiAgICAgICAgICAgIEEgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgICAgICByZWxhdGlvbnNoaXAsIGFsbCBkaXN0aW5ndWlzaGVkIGJ5IHJvbGUgbmFtZS4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSAnbW9kdWxlJyBzdGF0ZW1lbnQuCiAgICAgICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlCiAgICAgICAgICAgIGFsbG93ZWQgcGVyIHBhcmVudCBzdGF0ZW1lbnQuCgogICAgICAgICAgICBTdWJzdGF0ZW1lbnRzIHRvIHRoZSAnYmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBkZWZpbmUKICAgICAgICAgICAgdGhlIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzCiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUKICAgICAgICAgICAgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aAogICAgICAgICAgICB0aGUgJ2Etc2lkZScgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZQogICAgICAgICAgICAnYi1zaWRlJyBleHRlbnNpb24uIE90aGVyIGRhdGEgbm9kZXMgZGVmaW5lIHByb3BlcnRpZXMgb2YgdGhlCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgcmVsYXRpb25zaGlwIG5hbWUKICAgICAgICAgICAgaXMgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuIjsKCiAgICAgICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICAgIH0KCiAgICBleHRlbnNpb24gYVNpZGUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIHRoZSBBLXNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAndW5pLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lCiAgICAgICAgICAgIG9mIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUKICAgICAgICAgICAgaXMgc2NvcGVkIHRvIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5CiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlCiAgICAgICAgICAgIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSByZXNpZGVzLgogICAgICAgICAgICBJZiB0aGUgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZQogICAgICAgICAgICBwcmVmaXhlZCwgYW5kIGEgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlCiAgICAgICAgICAgIHRoZSBwcmVmaXguIjsKCiAgICAgICAgYXJndW1lbnQgYVNpZGVUeXBlOwogICAgfQoKICAgIGV4dGVuc2lvbiBiU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEItc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBiU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgICAgICBhcmd1bWVudCBkb21haW5OYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBsYWJlbCB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYwogICAgICAgICAgICB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzIOKAmHgueS564oCZIOKAkyBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMKICAgICAgICAgICAgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUgcmV2aXNpb24gc3RhdGVtZW50LgogICAgICAgICAgICBaZXJvIG9yIG9uZSByZXZpc2lvbiBsYWJlbCBzdGF0ZW1lbnRzIHBlciBwYXJlbnQgc3RhdGVtZW50IGFyZQogICAgICAgICAgICBhbGxvd2VkLgoKICAgICAgICAgICAgUmV2aXNpb24gbGFiZWxzIE1VU1QgYmUgdW5pcXVlIGFtb25nc3QgYWxsIHJldmlzaW9ucyBvZiBhIG1vZHVsZSBvcgogICAgICAgICAgICBzdWJtb2R1bGUuIjsKCiAgICAgICAgYXJndW1lbnQgc2VtdmVyc2lvbjsKICAgIH0KfQ== +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgZ3JvdXBpbmcgVG9wX0dycF9UeXBlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZSBjb21tb24gdG8gYWxsIHR5cGVzLgogICAgICAgICAgICBBbGwgdHlwZXMgTVVTVCB1c2UgdGhpcyBncm91cGluZy4iOwoKICAgICAgICBsZWFmIGlkIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBvZiB0b3BvbG9neSBlbnRpdGllcy4gUmVwcmVzZW50cyB0aGUKICAgICAgICAgICAgICAgIEVudGl0eSBJbnN0YW5jZSBJZGVudGlmaWVyLiI7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRhaW5lciBkZWNvcmF0b3JzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcKICAgICAgICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLiBUaGlzIGlzIGRvbmUgdmlhIGF1Z21lbnRhdGlvbnMuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGxlYWYtbGlzdCBjbGFzc2lmaWVycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkNvbnN1bWVyIGRlZmluZWQgdGFncyB0byB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgaWRlbnRpdHlyZWYgeyBiYXNlIGNsYXNzaWZpZXI7IH0KICAgIH0KCiAgICBsZWFmLWxpc3Qgc291cmNlSWRzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQW4gb3JkZXJlZCBsaXN0IG9mIGlkZW50aXRpZXMgdGhhdCByZXByZXNlbnQgdGhlIHNldCBvZiBuYXRpdmUKICAgICAgICAgICAgc291cmNlIGlkZW50aWZpZXJzIGZvciBwYXJ0aWNpcGF0aW5nIGVudGl0aWVzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIG1ldGFkYXRhLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgY2xhc3NpZmllciBpcyB1c2VkIGFzIGEgYmFzZSB0byBwcm92aWRlIGFsbCBjbGFzc2lmaWVycwogICAgICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQp9 +o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIEVxdWlwbWVudAogICAgZG9tYWluLCB3aGljaCBpcyBtb2RlbGxlZCB0byB1bmRlcnN0YW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiBlcXVpcG1lbnQKICAgIHN1Y2ggYXMgYW50ZW5uYXMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbC9jYXJyaWVyIGFuZCB0aGVpciByZWxldmFudAogICAgcHJvcGVydGllcyBlLmcuIHRpbHQsIG1heCBwb3dlciBldGMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gRVFVSVBNRU5UOwoKICAgIGxpc3QgQW50ZW5uYU1vZHVsZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEFudGVubmEgTW9kdWxlIHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIGFzcGVjdCBvZiBhbgogICAgICAgICAgICBhbnRlbm5hLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbCBpZGVudGlmaWVyLiBUaGlzCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsIGltcGFjdC4iOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFCZWFyaW5nIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIGJlYXJpbmcgb24gYW50ZW5uYSBzdWJ1bml0IHdoZXJlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICB1bml0IGlzIGluc3RhbGxlZC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBmaXhlZCBhbnRlbm5hIHRpbHQgb2YgdGhlIGluc3RhbGxhdGlvbiwgZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgcGxhbmUuIEl0IGlzIGEgc2lnbmVkIHZhbHVlLiBQb3NpdGl2ZSBpbmRpY2F0ZXMKICAgICAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgcG9zaXRpb25XaXRoaW5TZWN0b3IgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgdW5pdCBwb3NpdGlvbiB3aXRoaW4gc2VjdG9yLiBUaGlzIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgICAgIGltcGFjdC4iOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgdG90YWxUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUb3RhbCBhbnRlbm5hIGVsZXZhdGlvbiBpbmNsdWRpbmcgdGhlIGluc3RhbGxlZAogICAgICAgICAgICAgICAgICAgIHRpbHQgYW5kIHRoZSB0aWx0IGFwcGxpZWQgYnkgdGhlIFJlbW90ZSBFbGVjdHJpY2FsCiAgICAgICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgYXhpcyAoc2VlIDNHUFAgVFMgMjUuNDY2KS4gVmFsdWUgaXMgc2lnbmVkOyB0aWx0IGRvd24gaXMKICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgICAgIHJhZGlhdGlvbiBwYXR0ZXJuIGluIHRoZSBob3Jpem9udGFsIHBsYW5lLiBNZWFzdXJlZCBpbgogICAgICAgICAgICAgICAgICAgIGRlZ3JlZXMuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIFJBTiBkb21haW4sCiAgICB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZQogICAgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IEdOQkRVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUIgRGlzdHJpYnV0ZWQgVW5pdCAoZ05CLURVKS4KCiAgICAgICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQgKGdOQi1DVSkgYW5kIGEgZ05CLURVLgogICAgICAgICAgICBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsIHRpbWUgcHJvdG9jb2xzIGFuZCBzZXJ2aWNlcywgYW5kIHRoZSBEVQogICAgICAgICAgICBwcm9jZXNzZXMgUEhZIGxldmVsIHByb3RvY29sIGFuZCByZWFsIHRpbWUgc2VydmljZXMuIFRoZSBnTkItQ1UgYW5kCiAgICAgICAgICAgIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEgRjEgbG9naWNhbCBpbnRlcmZhY2UuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgZ05CLURVOgogICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1DUCB0aHJvdWdoIHRoZSBGMS1DIGludGVyZmFjZS4gSXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIG9ubHkgb25lIGdOQi1DVS1DUC4gT25lIGdOQi1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgZ05CLUNVLUNQLgoKICAgICAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ1UtQ1AsIG11bHRpcGxlIGdOQi1DVS1VUHMgYW5kCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1EVXMuIGdOQi1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgICAgICB0aGUgZ05CLURVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBjb250YWluZXIgZFVwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB1c2VkIGFzIHBhcnQgb2YgUE0gRXZlbnRzIGRhdGEiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQkRVSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBFTm9kZUJGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEV2b2x2ZWQgTm9kZSBCIChlTm9kZUIpIGlzIHRoZSBvbmx5IG1hbmRhdG9yeSBub2RlIGluCiAgICAgICAgICAgIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0gRXZvbHV0aW9uIChMVEUpLiBUaGUKICAgICAgICAgICAgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlIHN0YXRpb24gdGhhdCBoYW5kbGVzIHJhZGlvIGNvbW11bmljYXRpb25zCiAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBoYW5kb3ZlcgogICAgICAgICAgICBkZWNpc2lvbnMuIFVubGlrZSAyLzNHIHdpcmVsZXNzIFJBTiwgdGhlcmUgaXMgbm8gY2VudHJhbGl6ZWQgcmFkaW8KICAgICAgICAgICAgbmV0d29yayBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkIHRvCiAgICAgICAgICAgIHRoZSBtb2JpbGUgcGhvbmUgbmV0d29yayB0aGF0IGNvbW11bmljYXRlcyBkaXJlY3RseSB3aXRoIG1vYmlsZQogICAgICAgICAgICBoYW5kc2V0cyAoVXNlciBFcXVpcG1lbnQpLCBsaWtlIGEgYmFzZSB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluCiAgICAgICAgICAgIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlcgogICAgICAgICAgICByZXNwb25zZSB0aW1lcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGVOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgRU5vZGVCIElEIHRoYXQgZm9ybXMgcGFydCBvZiB0aGUgQ2VsbCBHbG9iYWwKICAgICAgICAgICAgICAgICAgICBJZGVudGl0eSwgYW5kIGlzIGFsc28gdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyIHRoZSBTMQogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVmYXVsdCAxMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGVOb2RlQlBsbW5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIEVOb2RlQiBQdWJsaWMgTGFuZCBNb2JpbGUgTmV0d29yayAoUExNTikgSUQKICAgICAgICAgICAgICAgICAgICB0aGF0IGZvcm1zIHBhcnQgb2YgdGhlIEVOb2RlQiBHbG9iYWwgSUQgdXNlZCB0byBpZGVudGlmeSB0aGUKICAgICAgICAgICAgICAgICAgICBub2RlIG92ZXIgdGhlIFMxIGludGVyZmFjZS4gTm90ZTogVGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgKE1DQz0wMDEsIE1OQz0wMSkgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgY2FuIG5vdCBiZSB1c2VkIGFzIGEgdmFsaWQgUExNTiBJZGVudGl0eS4iOwoKICAgICAgICAgICAgICAgIGxlYWYgbWNjIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE1DQyBwYXJ0IG9mIGEgUExNTiBpZGVudGl0eSB1c2VkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDAuLjk5OTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZWFmIG1uYyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkKICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAyLi4zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IExURVNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTFRFIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgICAgIGNlbGxzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgc2VjdG9yQ2FycmllclR5cGUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdG9yIGNhcnJpZXIKICAgICAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsKICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgICAgIGVudW0gbm9ybWFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb3QgYSBkaWdpdGFsIHNlY3RvciI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIG1pZGRsZV9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcyBhc3NvY2lhdGVkIGhhcmR3YXJlCiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIExURVNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxURSBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBMVEUgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSByZWxhdGlvbnMgYmV0d2VlbiBFcXVpcG1lbnQgYW5kIFJBTi4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 +test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInRlc3QtYnVpbHQtaW4tbmFtZXNwYWNlIjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBURVNUOwoKICAgIGxpc3QgRW50aXR5VHlwZUEgewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICB9CgogICAgbGlzdCBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTFXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBMldpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNFdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTVXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVBN1dpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1BST1ZJREVTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGdyb3VwZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX0lOU1RBTExFRF9BVF9FTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSUyB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWVudGl0eVR5cGVBIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSU19VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("name", "moduleReferenceName") FROM stdin; -GNBDUFunction o-ran-smo-teiv-ran -ENodeBFunction o-ran-smo-teiv-ran -AntennaCapability o-ran-smo-teiv-ran -LTESectorCarrier o-ran-smo-teiv-ran -NRSectorCarrier o-ran-smo-teiv-ran -AntennaModule o-ran-smo-teiv-equipment +COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran +test-built-in-module_EntityTypeA EntityTypeA test-built-in-module +test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "relationshipDataLocation", "connectSameEntity", "moduleReferenceName") FROM stdin; -LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier 0 1 used-by-lteSectorCarrier AntennaCapability 0 1 BI_DIRECTIONAL A_SIDE false o-ran-smo-teiv-ran -ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction 1 1 provided-by-enodebFunction LTESectorCarrier 0 9223372036854775807 BI_DIRECTIONAL B_SIDE false o-ran-smo-teiv-ran -NRSECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability NRSectorCarrier 0 9223372036854775807 used-by-nrSectorCarrier AntennaCapability 0 1 BI_DIRECTIONAL A_SIDE false o-ran-smo-teiv-ran -ANTENNACAPABILITY_USES_ANTENNACAPABILITY used-antennaCapability AntennaCapability 0 1 used-by-antennaCapability AntennaCapability 0 1 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran -ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY provided-antennaCapability AntennaCapability 0 9223372036854775807 provided-by-antennaCapability AntennaCapability 0 1 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran -ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaCapability 0 1 serviced-by-antennaCapability AntennaCapability 0 9223372036854775807 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran -ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY realised-by-antennaCapability AntennaCapability 0 9223372036854775807 realised-antennaCapability AntennaCapability 0 9223372036854775807 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran -ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule 0 9223372036854775807 serving-antennaModule AntennaCapability 0 9223372036854775807 BI_DIRECTIONAL RELATION false o-ran-smo-teiv-rel-equipment-ran -ANTENNAMODULE_USES_ANTENNAMODULE used-by-antennaModule AntennaModule 0 9223372036854775807 used-antennaModule AntennaModule 0 9223372036854775807 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-equipment +COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapability o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran +ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran +ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL true RELATION test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module +ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 9223372036854775807 grouped-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL false A_SIDE test-built-in-module_EntityTypeA test-built-in-module +ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS installed-at-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 9223372036854775807 installed-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 9223372036854775807 BI_DIRECTIONAL false RELATION test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module +ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS provided-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 1 provided-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module +ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 1 used-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL false A_SIDE test-built-in-module_EntityTypeA test-built-in-module +LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran \. ; diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql new file mode 100644 index 0000000..e393eb0 --- /dev/null +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql @@ -0,0 +1,53 @@ +-- +-- ============LICENSE_START======================================================= +-- Copyright (C) 2024 Ericsson +-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe +-- ================================================================================ +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- SPDX-License-Identifier: Apache-2.0 +-- ============LICENSE_END========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_consumer_data; +ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +SET default_tablespace = ''; +SET default_table_access_method = heap; + +SET ROLE :'pguser'; + +CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL, + "ownerAppId" VARCHAR(511) NOT NULL, + "status" VARCHAR(127) NOT NULL +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( + "name" TEXT PRIMARY KEY, + "dataType" VARCHAR(511) NOT NULL, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( + "name" TEXT PRIMARY KEY, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE +); + +COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang index a8f4dc8..fba4d6e 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang @@ -14,7 +14,7 @@ module o-ran-smo-teiv-common-yang-extensions { This model contains extensions to the YANG language that topology and inventory models will use to define and annotate types and relationships."; - revision "2024-05-14" { + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; } @@ -23,30 +23,31 @@ module o-ran-smo-teiv-common-yang-extensions { description "Defines a bi-directional relationship in the topology. - A bi-directional-association (BDA) is a relationship comprising of an - A-side and a B-side. The A-side is considered the originating side of - the relationship; the B-side is considered the terminating side of the - relationship. The order of A-side and B-side is of importance and MUST - NOT be changed once defined. + A bi-directional-association (BDA) is a relationship comprising of + an A-side and a B-side. The A-side is considered the originating + side of the relationship; the B-side is considered the terminating + side of the relationship. The order of A-side and B-side is of + importance and MUST NOT be changed once defined. - Both A-side and B-side are defined on a type, and are given a role. A - type may have multiple originating and/or terminating sides of a + Both A-side and B-side are defined on a type, and are given a role. + A type may have multiple originating and/or terminating sides of a relationship, all distinguished by role name. The statement MUST only be a substatement of the 'module' statement. - Multiple 'bi-directional-topology-relationship' statements are allowed - per parent statement. + Multiple 'bi-directional-topology-relationship' statements are + allowed per parent statement. - Substatements to the 'bi-directional-topology-relationship' define the - A-side and the B-side, respectively, and optionally properties of the - relationship. Data nodes of types 'leaf' and 'leaf-list' are used for - this purpose. One of the data nodes MUST be annotated with the 'a-side' - extension; another data node MUST be annotated with the 'b-side' - extension. Other data nodes define properties of the relationship. + Substatements to the 'bi-directional-topology-relationship' define + the A-side and the B-side, respectively, and optionally properties + of the relationship. Data nodes of types 'leaf' and 'leaf-list' are + used for this purpose. One of the data nodes MUST be annotated with + the 'a-side' extension; another data node MUST be annotated with the + 'b-side' extension. Other data nodes define properties of the + relationship. - The argument is the name of the relationship. The relationship name is - scoped to the namespace of the declaring module and MUST be unique - within the scope."; + The argument is the name of the relationship. The relationship name + is scoped to the namespace of the declaring module and MUST be + unique within the scope."; argument relationshipName; } @@ -63,19 +64,21 @@ module o-ran-smo-teiv-common-yang-extensions { 'instance-identifier'. Constraints MAY be used as part of the parent 'leaf' or 'leaf-list' to enforce cardinality. - The identifier of the parent 'leaf' or 'leaf-list' is used as name of - the role of the A-side of the relationship. The name of the role is - scoped to the type on which the A-side is defined and MUST be unique - within the scope. + The identifier of the parent 'leaf' or 'leaf-list' is used as name + of the role of the A-side of the relationship. The name of the role + is scoped to the type on which the A-side is defined and MUST be + unique within the scope. - While the parent 'leaf' or 'leaf-list' does not result in a property of - the relationship, it is RECOMMENDED to avoid using the name of an + While the parent 'leaf' or 'leaf-list' does not result in a property + of the relationship, it is RECOMMENDED to avoid using the name of an existing type property as role name to avoid potential ambiguities - between properties of a type, and roles of a relationship on the type. + between properties of a type, and roles of a relationship on the + type. - The argument is the name of the type on which the A-side resides. If the - type is declared in another module, the type must be prefixed, and a - corresponding 'import' statement be used to declare the prefix."; + The argument is the name of the type on which the A-side resides. + If the type is declared in another module, the type must be + prefixed, and a corresponding 'import' statement be used to declare + the prefix."; argument aSideType; } @@ -92,19 +95,21 @@ module o-ran-smo-teiv-common-yang-extensions { 'instance-identifier'. Constraints MAY be used as part of the parent 'leaf' or 'leaf-list' to enforce cardinality. - The identifier of the parent 'leaf' or 'leaf-list' is used as name of - the role of the B-side of the relationship. The name of the role is - scoped to the type on which the B-side is defined and MUST be unique - within the scope. + The identifier of the parent 'leaf' or 'leaf-list' is used as name + of the role of the B-side of the relationship. The name of the role + is scoped to the type on which the B-side is defined and MUST be + unique within the scope. - While the parent 'leaf' or 'leaf-list' does not result in a property of - the relationship, it is RECOMMENDED to avoid using the name of an + While the parent 'leaf' or 'leaf-list' does not result in a property + of the relationship, it is RECOMMENDED to avoid using the name of an existing type property as role name to avoid potential ambiguities - between properties of a type, and roles of a relationship on the type. + between properties of a type, and roles of a relationship on the + type. - The argument is the name of the type on which the B-side resides. If the - type is declared in another module, the type must be prefixed, and a - corresponding 'import' statement be used to declare the prefix."; + The argument is the name of the type on which the B-side resides. + If the type is declared in another module, the type must be + prefixed, and a corresponding 'import' statement be used to declare + the prefix."; argument bSideType; } @@ -116,14 +121,18 @@ module o-ran-smo-teiv-common-yang-extensions { extension label { description - "The label can be used to give modules and submodules a semantic version, in addition to their revision. + "The label can be used to give modules and submodules a semantic + version, in addition to their revision. - The format of the label is ‘x.y.z’ – expressed as pattern, it is [0-9]+\\.[0-9]+\\.[0-9]+ + The format of the label is ‘x.y.z’ – expressed as pattern, it is + [0-9]+\\.[0-9]+\\.[0-9]+ - The statement MUST only be a substatement of the revision statement. Zero or one revision label statements - per parent statement are allowed. + The statement MUST only be a substatement of the revision statement. + Zero or one revision label statements per parent statement are + allowed. - Revision labels MUST be unique amongst all revisions of a module or submodule."; + Revision labels MUST be unique amongst all revisions of a module or + submodule."; argument semversion; } diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang index 72c2820..4585747 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang @@ -1,5 +1,4 @@ module o-ran-smo-teiv-common-yang-types { - yang-version 1.1; namespace "urn:o-ran:smo-teiv-common-yang-types"; prefix or-teiv-types; @@ -8,73 +7,88 @@ module o-ran-smo-teiv-common-yang-types { import _3gpp-common-yang-types { prefix types3gpp; } - organization "ORAN"; - contact "The Authors"; + organization "ORAN"; + contact "The Authors"; description "Topology and Inventory common types model. - Copyright (C) 2024 Ericsson - Modifications Copyright (C) 2024 OpenInfra Foundation Europe + Copyright (C) 2024 Ericsson + Modifications Copyright (C) 2024 OpenInfra Foundation Europe This model contains re-usable data types that topology and inventory models will frequently use as part of types and relationships."; - revision "2024-05-14" { + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; } grouping Top_Grp_Type { - description "Grouping containing the key attribute common to all types. All types - MUST use this grouping."; + description "Grouping containing the key attribute common to all types. + All types MUST use this grouping."; leaf id { type string; - description "Unique identifier of topology entities. Represents the Entity Instance Identifier."; + description "Unique identifier of topology entities. Represents the + Entity Instance Identifier."; } } container decorators { - description "This container serves as extension point for applications wishing to define their own decorators. - This is done via augmentations. They can only be defined in name value pair. - - This is a consumer data and can be attached to Topology Entity or Topology Relation instance, - outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be - instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise."; + description + "This container serves as extension point for applications wishing + to define their own decorators. This is done via augmentations. They + can only be defined in name value pair. + + This is a consumer data and can be attached to Topology Entity or + Topology Relation instance, outside of the declared Topology Entity + or Topology Relationship's attributes. This cannot be instantiated, + and it MUST NOT be augmented or deviated in any way, unless stated + otherwise."; } leaf-list classifiers { - description "Consumer defined tags to topology entities and relationships. + description + "Consumer defined tags to topology entities and relationships. - This is a consumer data and can be attached to Topology Entity or Topology Relation instance, - outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be - instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise."; + This is a consumer data and can be attached to Topology Entity or + Topology Relation instance, outside of the declared Topology Entity + or Topology Relationship's attributes. This cannot be instantiated, + and it MUST NOT be augmented or deviated in any way, unless stated + otherwise."; type identityref { base classifier; } } leaf-list sourceIds { - description "An ordered list of identities that represent the set of native source identifiers for participating - entities. + description + "An ordered list of identities that represent the set of native + source identifiers for participating entities. - This is a consumer data and can be attached to Topology Entity or Topology Relation instance, - outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be - instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise."; + This is a consumer data and can be attached to Topology Entity or + Topology Relation instance, outside of the declared Topology Entity + or Topology Relationship's attributes. This cannot be instantiated, + and it MUST NOT be augmented or deviated in any way, unless stated + otherwise."; type string; ordered-by user; } container metadata { - description "This container serves as extension point to define metadata. They can only be defined in name value - pair. - - This is a consumer data and can be attached to Topology Entity or Topology Relation instance, - outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be - instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise."; + description + "This container serves as extension point to define metadata. They + can only be defined in name value pair. + + This is a consumer data and can be attached to Topology Entity or + Topology Relation instance, outside of the declared Topology Entity + or Topology Relationship's attributes. This cannot be instantiated, + and it MUST NOT be augmented or deviated in any way, unless stated + otherwise."; } identity classifier{ - description "The classifier is used as a base to provide all classifiers with identity. "; + description "The classifier is used as a base to provide all classifiers + with identity. "; } } \ No newline at end of file diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang index 55e0071..d25ea98 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang @@ -15,17 +15,17 @@ module o-ran-smo-teiv-equipment { organization "ORAN"; contact "The Authors"; description - "RAN Equipment topology model. + "Equipment topology model. Copyright (C) 2024 Ericsson Modifications Copyright (C) 2024 OpenInfra Foundation Europe - This model contains the topology entities and relations in the - Equipment domain, which is modelled to understand the physical - location of equipment such as antennas associated with a cell/carrier - and their relevant properties e.g. tilt, max power etc."; + This model contains the topology entities and relations in the Equipment + domain, which is modelled to understand the physical location of equipment + such as antennas associated with a cell/carrier and their relevant + properties e.g. tilt, max power etc."; - revision "2024-05-14" { + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; } @@ -33,83 +33,64 @@ module o-ran-smo-teiv-equipment { or-teiv-yext:domain EQUIPMENT; list AntennaModule { - description "An Antenna Module represents the - physical aspect of an antenna."; + description "An Antenna Module represents the physical aspect of an + antenna."; uses or-teiv-types:Top_Grp_Type; key id; container attributes { leaf antennaModelNumber { - description "Vendor-specific antenna model - identifier. This attribute is part of - AISG v3 ADB Standard and has - no operational impact."; + description "Vendor-specific antenna model identifier. This + attribute is part of AISG v3 ADB Standard and has no + operational impact."; type string; } leaf mechanicalAntennaBearing { - description "Antenna bearing on antenna subunit - where antenna unit is installed."; - type uint32; + description "Antenna bearing on antenna subunit where antenna + unit is installed."; + type int32; } leaf mechanicalAntennaTilt { - description "The fixed antenna tilt of the installation, - defined as the inclination of the antenna - element respect to the vertical plane. - It is a signed value. Positive indicates - downtilt, and negative indicates uptilt."; - type uint32; + description "The fixed antenna tilt of the installation, defined + as the inclination of the antenna element respect to the + vertical plane. It is a signed value. Positive indicates + downtilt, and negative indicates uptilt."; + type int32; } leaf positionWithinSector { - description "Antenna unit position within sector. - This attribute is part of AISG v3 ADB - Standard and has no operational impact."; + description "Antenna unit position within sector. This attribute + is part of AISG v3 ADB Standard and has no operational + impact."; type string; } leaf totalTilt { - description "Total antenna elevation including the - installed tilt and the tilt applied by - the Remote Electrical Tilt (RET)."; - type uint32; + description "Total antenna elevation including the installed + tilt and the tilt applied by the Remote Electrical + Tilt (RET)."; + type int32; } leaf electricalAntennaTilt { description "Electrically-controlled tilt of main beam maximum - with respect to direction orthogonal to antenna - element axis (see 3GPP TS 25.466). Value is signed; - tilt down is positive, tilt up is negative."; - type uint32; + with respect to direction orthogonal to antenna element + axis (see 3GPP TS 25.466). Value is signed; tilt down is + positive, tilt up is negative."; + type int32; } leaf-list antennaBeamWidth { - description "The angular span of the main lobe of the antenna radiation - pattern in the horizontal plane. Measured in degrees."; + description "The angular span of the main lobe of the antenna + radiation pattern in the horizontal plane. Measured in + degrees."; type uint32; } uses geo:geo-location; } } - - or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULE_USES_ANTENNAMODULE { // Same entity (0..1 to 0..1) - - uses or-teiv-types:Top_Grp_Type; - key id; - - leaf-list used-by-antennaModule { - description "Antenna Module realised by Antenna Module."; - or-teiv-yext:aSide AntennaModule; - type instance-identifier; - } - - leaf-list used-antennaModule { - description "Antenna Module realises Antenna Module."; - or-teiv-yext:bSide AntennaModule; - type instance-identifier; - } - } } \ No newline at end of file diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang index 00fee0e..474b2af 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang @@ -9,19 +9,24 @@ module o-ran-smo-teiv-ran { import _3gpp-common-yang-types { prefix types3gpp; } + import ietf-geo-location { + prefix geo; + reference "RFC 9179: A YANG Grouping for Geographic Locations"; + } + organization "ORAN"; - contact "ORAN first line support via email"; + contact "The Authors"; description - "RAN Logical topology model. + "RAN topology model. Copyright (C) 2024 Ericsson Modifications Copyright (C) 2024 OpenInfra Foundation Europe - This model contains the topology entities and relations in the - RAN domain, which represents the functional capability - of the deployed RAN that are relevant to rApps use cases."; + This model contains the topology entities and relations in the RAN domain, + which represents the functional capability of the deployed RAN that are + relevant to rApps use cases."; - revision "2024-05-14" { + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; } @@ -31,24 +36,21 @@ module o-ran-smo-teiv-ran { list GNBDUFunction { description "gNodeB Distributed Unit (gNB-DU). - A gNB may consist of a gNB-Centralized Unit - (gNB-CU) and a gNB-DU. The CU processes non-real - time protocols and services, and the DU processes - PHY level protocol and real time services. The - gNB-CU and the gNB-DU units are connected via - F1 logical interface. - - The following is true for a gNB-DU: - Is connected to the gNB-CU-CP through the F1-C - interface.Is connected to the gNB-CU-UP through - the F1-U interface. One gNB-DU is connected to only - one gNB-CU-CP. One gNB-DU can be connected to - multiple gNB-CU-UPs under the control of the same - gNB-CU-CP. - Note: A gNB may consist of a gNB-CU-CP, multiple - gNB-CU-UPs and multiple gNB-DUs. gNB-DU is a concrete - class that extends the NG-RAN node object. In Topology, you - can create, read, update, and delete the gNB-DU object."; + A gNB may consist of a gNB-Centralized Unit (gNB-CU) and a gNB-DU. + The CU processes non-real time protocols and services, and the DU + processes PHY level protocol and real time services. The gNB-CU and + the gNB-DU units are connected via F1 logical interface. + + The following is true for a gNB-DU: + Is connected to the gNB-CU-CP through the F1-C interface. Is + connected to the gNB-CU-UP through the F1-U interface. One gNB-DU is + connected to only one gNB-CU-CP. One gNB-DU can be connected to + multiple gNB-CU-UPs under the control of the same gNB-CU-CP. + + Note: A gNB may consist of a gNB-CU-CP, multiple gNB-CU-UPs and + multiple gNB-DUs. gNB-DU is a concrete class that extends the NG-RAN + node object. In Topology, you can create, read, update, and delete + the gNB-DU object."; uses or-teiv-types:Top_Grp_Type; key id; @@ -61,73 +63,69 @@ module o-ran-smo-teiv-ran { leaf gNBDUId { description "Unique identifier for the DU within a gNodeB"; - type uint32; + type int64; } leaf gNBId { description "Identity of gNodeB within a PLMN"; - type uint32; + type int64; } leaf gNBIdLength { description "Length of gNBId bit string representation"; - type uint32; + type int32; } } } list ENodeBFunction { - description "An Evolved Node B (eNodeB) is the only mandatory - node in the radio access network (RAN) of Long-Term - Evolution (LTE). The eNodeB is a complex base - station that handles radio communications - in the cell and carries out radio resource - management and handover decisions. Unlike 2/3G - wireless RAN, there is no centralized radio network - controller in LTE. It is the hardware that is connected - to the mobile phone network that communicates - directly with mobile handsets (User Equipment), like a base - transceiver station (BTS) in GSM networks. This simplifies - the architecture and allows lower response times."; + description "An Evolved Node B (eNodeB) is the only mandatory node in + the radio access network (RAN) of Long-Term Evolution (LTE). The + eNodeB is a complex base station that handles radio communications + in the cell and carries out radio resource management and handover + decisions. Unlike 2/3G wireless RAN, there is no centralized radio + network controller in LTE. It is the hardware that is connected to + the mobile phone network that communicates directly with mobile + handsets (User Equipment), like a base transceiver station (BTS) in + GSM networks. This simplifies the architecture and allows lower + response times."; uses or-teiv-types:Top_Grp_Type; key id; container attributes { leaf eNBId { - description "The ENodeB ID that forms part of - the Cell Global Identity, and is - also used to identify the node over - the S1 interface"; - type uint32; + description "The ENodeB ID that forms part of the Cell Global + Identity, and is also used to identify the node over the S1 + interface"; + type int32; default 11; } container eNodeBPlmnId { - description "The ENodeB Public Land Mobile Network - (PLMN) ID that forms part of the ENodeB - Global ID used to identify the node over - the S1 interface. Note: The value (MCC=001, MNC=01) - indicates that the PLMN is not initiated. - The value can not be used as a valid PLMN Identity."; + description "The ENodeB Public Land Mobile Network (PLMN) ID + that forms part of the ENodeB Global ID used to identify the + node over the S1 interface. Note: The value + (MCC=001, MNC=01) indicates that the PLMN is not initiated. + The value can not be used as a valid PLMN Identity."; leaf mcc { - description "The MCC part of a PLMN identity - used in the radio network."; + description "The MCC part of a PLMN identity used in the + radio network."; type int32 { range 0..999; } } leaf mnc { - description "The MNC part of a PLMN identity - used in the radio network."; + description "The MNC part of a PLMN identity used in the + radio network."; type int32 { range 0..999; } } leaf mncLength { - description "The length of the MNC part of a - PLMN identity used in the radio network."; + description "The length of the MNC part of a PLMN identity + used in the radio network."; type int32 { range 2..3; } @@ -136,45 +134,14 @@ module o-ran-smo-teiv-ran { } } - list AntennaCapability { - description "This MO serves as a mapping between the cell - and the RBS equipment used to provide coverage - in a certain geographical area. The MO also - controls the maximum output power of the sector."; - - uses or-teiv-types:Top_Grp_Type; - key id; - - container attributes { - leaf-list eUtranFqBands { - description "List of LTE frequency bands - that associated hardware supports"; - type string; - } - - leaf-list geranFqBands { - description "List of GERAN frequency bands - that associated hardware supports"; - type string; - } - - leaf-list nRFqBands { - description "List of NR frequency bands - associated hardware supports"; - type string; - } - } - } - list LTESectorCarrier { - description "The LTE Sector Carrier object provides the - attributes for defining the logical characteristics - of a carrier (cell) in a sector. A sector is a coverage - area associated with a base station having - its own antennas, radio ports, and control channels. - The concept of sectors was developed to improve co-channel - interference in cellular systems, and most wireless systems - use three sector cells."; + description "The LTE Sector Carrier object provides the attributes for + defining the logical characteristics of a carrier (cell) in a + sector. A sector is a coverage area associated with a base station + having its own antennas, radio ports, and control channels. The + concept of sectors was developed to improve co-channel interference + in cellular systems, and most wireless systems use three sector + cells."; uses or-teiv-types:Top_Grp_Type; key id; @@ -182,7 +149,7 @@ module o-ran-smo-teiv-ran { container attributes { leaf sectorCarrierType { description "Indicates whether or not the sector carrier - modelled by MO SectorCarrier is a digital sector."; + modelled by MO SectorCarrier is a digital sector."; type enumeration { enum normal_sector { value 0; @@ -204,7 +171,7 @@ module o-ran-smo-teiv-ran { value 4; description "Right digital sector for 3DS"; } - enum middle_digital_sector { + enum middle_digital_sector_3ds { value 5; description "Middle digital sector for 3DS"; } @@ -213,68 +180,35 @@ module o-ran-smo-teiv-ran { } } - list NRSectorCarrier { - description "The NR Sector Carrier object provides - the attributes for defining the logical - characteristics of a carrier (cell) in a - sector. A sector is a coverage area associated - with a base station having its own antennas, - radio ports, and control channels. The concept - of sectors was developed to improve co-channel - interference in cellular systems, and most wireless - systems use three sector cells."; + list AntennaCapability { + description "This MO serves as a mapping between the cell and the RBS + equipment used to provide coverage in a certain geographical area. + The MO also controls the maximum output power of the sector."; uses or-teiv-types:Top_Grp_Type; key id; container attributes { - leaf arfcnDL { - description "NR Absolute Radio Frequency Channel - Number (NR-ARFCN) for downlink"; - type uint32; - } - - leaf arfcnUL { - description "NR Absolute Radio frequency Channel Number - (NR-ARFCN) for uplink."; - type uint32; - } - - leaf frequencyDL { - description "RF Reference Frequency of downlink channel"; - type uint32; + leaf-list eUtranFqBands { + description "List of LTE frequency bands that associated + hardware supports"; + type string; } - leaf frequencyUL { - description "RF Reference Frequency of uplink channel"; - type uint32; + leaf-list geranFqBands { + description "List of GERAN frequency bands that associated + hardware supports"; + type string; } - leaf bSChannelBwDL { - description "BS Channel bandwidth in MHz for downlink."; - type uint32; + leaf-list nRFqBands { + description "List of NR frequency bands associated hardware + supports"; + type string; } } } - or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIER_USES_ANTENNACAPABILITY { // 0..1 to 0..1 - - uses or-teiv-types:Top_Grp_Type; - key id; - - leaf used-antennaCapability { - description "LTE Sector Carrier uses Antenna Capability."; - or-teiv-yext:aSide LTESectorCarrier; - type instance-identifier; - } - - leaf used-by-lteSectorCarrier { - description "Antenna Cpability used by LTE Sector Carrier."; - or-teiv-yext:bSide AntennaCapability; - type instance-identifier; - } - } - or-teiv-yext:biDirectionalTopologyRelationship ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER { // 1 to 0..n uses or-teiv-types:Top_Grp_Type; @@ -294,93 +228,21 @@ module o-ran-smo-teiv-ran { } } - or-teiv-yext:biDirectionalTopologyRelationship NRSECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1 + or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1 uses or-teiv-types:Top_Grp_Type; key id; leaf used-antennaCapability { - description "NR Sector Carrier uses Antenna Capability."; - or-teiv-yext:aSide NRSectorCarrier; - type instance-identifier; - } - - leaf-list used-by-nrSectorCarrier { - description "Antenna Capability used by NR Sector Carrier."; - or-teiv-yext:bSide AntennaCapability; - type instance-identifier; - } - } - - or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_USES_ANTENNACAPABILITY { // Same entity (0..1 to 0..1) - - uses or-teiv-types:Top_Grp_Type; - key id; - - leaf used-antennaCapability { - description "Antenna Capability realised by Antenna Capability."; - or-teiv-yext:aSide AntennaCapability; - type instance-identifier; - } - - leaf used-by-antennaCapability { - description "Antenna Capability realises Antenna Capability."; - or-teiv-yext:bSide AntennaCapability; - type instance-identifier; - } - } - - or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY { // Same entity (0..1 to 0..n) - - uses or-teiv-types:Top_Grp_Type; - key id; - - leaf provided-antennaCapability { - description "Antenna Capability realised by Antenna Capability."; - or-teiv-yext:aSide AntennaCapability; - type instance-identifier; - } - - leaf-list provided-by-antennaCapability { - description "Antenna Capability realises Antenna Capability."; - or-teiv-yext:bSide AntennaCapability; - type instance-identifier; - } - } - - or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY { // Same entity (0..n to 0..1) - - uses or-teiv-types:Top_Grp_Type; - key id; - - leaf-list serviced-antennaCapability { - description "Antenna Capability realised by Antenna Capability."; - or-teiv-yext:aSide AntennaCapability; + description "LTE Sector Carrier uses Antenna Capability."; + or-teiv-yext:aSide LTESectorCarrier; type instance-identifier; } - leaf serviced-by-antennaCapability { - description "Antenna Capability realises Antenna Capability."; + leaf-list used-by-lteSectorCarrier { + description "Antenna Capability used by LTE Sector Carrier."; or-teiv-yext:bSide AntennaCapability; type instance-identifier; } } - - or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY { // Same entity (0..n to 0..m) - - uses or-teiv-types:Top_Grp_Type; - key id; - - leaf-list realised-by-antennaCapability { - description "Antenna Capability realised by Antenna Capability."; - or-teiv-yext:aSide AntennaCapability; - type instance-identifier; - } - - leaf-list realised-antennaCapability { - description "Antenna Capability realises Antenna Capability."; - or-teiv-yext:bSide AntennaCapability; - type instance-identifier; - } - } } \ No newline at end of file diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang index 4d30b10..a860ef1 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang @@ -21,7 +21,7 @@ module o-ran-smo-teiv-rel-equipment-ran { This model contains the topology relations between Equipment and RAN."; - revision "2024-05-14" { + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; } @@ -45,4 +45,4 @@ module o-ran-smo-teiv-rel-equipment-ran { type instance-identifier; } } -} +} \ No newline at end of file diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang new file mode 100644 index 0000000..349135b --- /dev/null +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang @@ -0,0 +1,153 @@ +module test-built-in-module { + yang-version 1.1; + namespace "test-built-in-namespace"; + + import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; } + + import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; } + + import _3gpp-common-yang-types { prefix types3gpp; } + + import ietf-geo-location { + prefix geo; + reference "RFC 9179: A YANG Grouping for Geographic Locations"; + } + + organization "ORAN"; + contact "The Authors"; + description + "Test topology model."; + + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + + or-teiv-yext:domain TEST; + + list EntityTypeA { + + uses or-teiv-types:Top_Grp_Type; + key id; + + } + + list EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + + uses or-teiv-types:Top_Grp_Type; + key id; + + container attributes { + leaf attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters { + type string; + } + + leaf attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters { + type uint32; + } + + leaf attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters { + type int32; + } + + leaf attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters { + type int64; + } + + leaf attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters { + type decimal64{ + fraction-digits 6; + } + units "degrees"; + } + + leaf-list attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters { + type string; + } + + container attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters { + uses types3gpp:PLMNId; + } + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..1 to 0..1 + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + or-teiv-yext:aSide EntityTypeA; + type instance-identifier; + } + + leaf used-by-entityTypeA { + or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters; + type instance-identifier; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..1 to 0..n + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf-list provided-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + or-teiv-yext:aSide EntityTypeA; + type instance-identifier; + } + + leaf provided-by-entityTypeA { + or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters; + type instance-identifier; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..n to 0..1 + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + or-teiv-yext:aSide EntityTypeA; + type instance-identifier; + } + + leaf-list grouped-by-entityTypeA { + or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters; + type instance-identifier; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..n to 0..m + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf-list installed-at-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + or-teiv-yext:aSide EntityTypeA; + type instance-identifier; + } + + leaf-list installed-entityTypeA { + or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters; + type instance-identifier; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..1 to 0..1 + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + or-teiv-yext:aSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters; + type instance-identifier; + } + + leaf used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters { + or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters; + type instance-identifier; + } + } +} \ No newline at end of file -- 2.16.6