From 175682f20090d2143ece479c2cd19462a3762844 Mon Sep 17 00:00:00 2001 From: JvD_Ericsson Date: Thu, 10 Apr 2025 10:14:10 +0100 Subject: [PATCH] TEIV: Fix ordering of items in responses - Added specific yang modles for testing, and updated tests and sql schemas to show this Issue-ID: SMO-186 Issue-ID: SMO-185 Change-Id: I651a548e00ab79508de344e73091fcea6a52b8e4 Signed-off-by: JvD_Ericsson --- .../utils => }/CachedBodyHttpServletRequest.java | 51 +- .../utils => }/CachedBodyServletInputStream.java | 2 +- .../main/java/org/oran/smo/teiv/RequestFilter.java | 58 + .../smo/teiv/exception/YangParsingException.java | 7 + .../OranTeivErrorJsonMessage.java} | 30 +- .../rest/controller/ClassifiersRequestFilter.java | 72 + .../rest/controller/ClassifiersRestController.java | 15 + .../rest/controller/DecoratorsRequestFilter.java | 73 + .../rest/controller/DecoratorsRestController.java | 19 +- .../exception/ApplicationExceptionHandler.java | 32 +- .../oran/smo/teiv/exposure/spi/DataRepository.java | 2 +- .../teiv/exposure/spi/impl/DataRepositoryImpl.java | 2 +- .../teivpath/innerlanguage/AndOrLogicalBlock.java | 6 +- .../teivpath/innerlanguage/EmptyLogicalBlock.java | 2 +- .../innerlanguage/InnerFilterCriteria.java | 9 +- .../teivpath/innerlanguage/LogicalBlock.java | 2 +- .../teivpath/innerlanguage/ScopeLogicalBlock.java | 83 +- .../teivpath/refiner/PathToJooqRefinement.java | 6 - .../controller}/GroupCreationRequestFilter.java | 29 +- .../groups/rest/controller/GroupsController.java | 16 +- .../teiv/groups/spi/impl/GroupsRepositoryImpl.java | 2 +- .../smo/teiv/listener/CreateTopologyProcessor.java | 14 +- .../smo/teiv/listener/DeleteTopologyProcessor.java | 10 +- .../smo/teiv/listener/MergeTopologyProcessor.java | 13 +- .../SourceEntityDeleteTopologyProcessor.java | 10 +- .../teiv/listener/audit/IngestionAuditLogger.java | 29 +- .../org/oran/smo/teiv/schema/SchemaRegistry.java | 72 +- .../smo/teiv/schema/SchemaRegistryErrorCode.java | 6 +- .../oran/smo/teiv/service/TeivDbOperations.java | 62 +- .../smo/teiv/service/kafka/KafkaTopicService.java | 6 - .../smo/teiv/service/models/OperationResult.java | 7 +- .../java/org/oran/smo/teiv/startup/AppInit.java | 2 +- .../oran/smo/teiv/utils/OperationResultParser.java | 35 + .../java/org/oran/smo/teiv/utils/ResponseUtil.java | 34 + .../java/org/oran/smo/teiv/utils/YangParser.java | 1 + .../teiv/utils/yangparser/ExposureYangParser.java | 5 +- .../teiv/utils/yangparser/IngestionYangParser.java | 4 +- .../smo/teiv/utils/yangparser/YangModelLoader.java | 32 +- ...topology-exposure-inventory-kafka-asyncapi.yaml | 42 +- .../oran/smo/teiv/db/TestPostgresqlContainer.java | 15 + .../api/contract/TopologyExposureApiBase.java | 43 +- ...RepositoryImplGETRequestsContainerizedTest.java | 25 +- .../teivpath/innerlanguage/DtoToJooqTest.java | 206 +- .../teivpath/refiner/BasePathRefinementTest.java | 121 +- .../smo/teiv/groups/TopologyGroupsApiBase.java | 9 +- .../IngestionOperationValidatorTest.java | 2 + .../teiv/listener/CreateTopologyProcessorTest.java | 8 +- .../teiv/listener/DeleteTopologyProcessorTest.java | 4 +- .../teiv/listener/MergeTopologyProcessorTest.java | 8 +- .../SourceEntityDeleteTopologyProcessorTest.java | 8 +- .../oran/smo/teiv/schema/SchemaRegistryTest.java | 58 +- .../org/oran/smo/teiv/service/EndToEndDbTest.java | 49 +- .../teiv/service/TeivDbOperationResultsTest.java | 124 +- .../oran/smo/teiv/utils/CloudEventTestUtil.java | 3 + .../org/oran/smo/teiv/utils/EndToEndTestUtil.java | 149 +- .../smo/teiv/utils/ExposureYangParserTest.java | 4 +- .../smo/teiv/utils/IngestionYangParserTest.java | 23 + .../teiv/utils/YangModelValidationTestUtil.java | 108 + .../common/ce-invalid-entity-attribute.json | 2 +- .../end-to-end/ce-create-inferred.json | 40 +- .../end-to-end/ce-create-many-to-many.json | 16 +- .../end-to-end/ce-create-one-to-many.json | 3 - .../end-to-end/ce-create-one-to-many3.json | 10 +- .../end-to-end/ce-create-one-to-one.json | 12 +- ...create-relationship-connecting-same-entity.json | 6 +- .../end-to-end/ce-create-second-case.json | 16 +- .../end-to-end/ce-delete-one-to-one.json | 4 +- ...delete-relationship-connecting-same-entity.json | 4 +- .../end-to-end/ce-merge-long-names.json | 30 +- .../end-to-end/ce-merge-many-to-many.json | 16 +- .../end-to-end/ce-merge-one-to-many.json | 2 +- .../end-to-end/ce-merge-one-to-many2.json | 10 +- .../expected-results/exp-create-inferred.json | 60 +- .../expected-results/exp-create-many-to-many.json | 16 +- .../expected-results/exp-create-one-to-one.json | 4 +- .../expected-results/exp-create-second-case.json | 16 +- .../expected-results/exp-delete-one-to-one.json | 10 +- .../expected-results/exp-merge-many-to-many.json | 16 +- .../expected-results/exp-merge-one-to-many.json | 2 +- .../not-exp-delete-one-to-one.json | 2 +- .../one-to-one/ce-create-one-to-one.json | 6 +- .../one-to-one/ce-create-one-to-one2.json | 2 +- .../one-to-one/ce-create-one-to-one3.json | 4 +- .../one-to-one/ce-create-one-to-one4.json | 2 +- .../one-to-one/ce-create-one-to-one5.json | 4 +- .../one-to-one/ce-create-one-to-one6.json | 4 +- .../one-to-one/ce-create-one-to-one7.json | 2 +- .../one-to-one/ce-create-one-to-one8.json | 4 +- ...01_getClassifiers_getRelationshipsByType.groovy | 4 +- .../classifiers/04_postClassifiers_delete.groovy | 76 + .../exposure/data/00_getAllDomains.groovy | 2 +- .../exposure/data/01_getTopologyEntityTypes.groovy | 4 +- .../data/02_getTopologyByEntityTypeName.groovy | 105 +- .../exposure/data/03_getTopologyById.groovy | 4 +- .../data/04_getAllRelationshipsForEntityId.groovy | 4 +- .../exposure/data/05_getRelationshipTypes.groovy | 2 +- .../exposure/data/06_getRelationshipsByType.groovy | 4 +- .../exposure/data/07_getRelationshipById.groovy | 4 +- .../exposure/data/08_getEntitiesByDomain.groovy | 108 +- .../decorators/04_postDecoratorsDelete.groovy | 75 + .../exposure/schemas/00_getAllSchemas.groovy | 2 +- .../exposure/schemas/01_getSchemaContent.groovy | 2 +- .../exposure/schemas/02_postSchemas.groovy | 136 + .../exposure/schemas/03_deleteSchemas.groovy | 6 + .../contracts/groups/00_createGroup.groovy | 44 +- .../resources/contracts/groups/01_getGroups.groovy | 3 + .../contracts/groups/02_getGroupById.groovy | 8 +- .../contracts/groups/03_deleteGroup.groovy | 3 + .../resources/contracts/groups/04_putGroup.groovy | 2 +- .../contracts/groups/05_getMembers.groovy | 17 +- .../contracts/groups/06_getProvidedMembers.groovy | 6 + .../groups/07_updateProvidedMembers.groovy | 40 +- .../resources/pgsqlschema/end-to-end-test-data.sql | 2898 ++++++++++++++++++++ .../pgsqlschema/end-to-end-test-model.sql | 667 +++++ .../resources/pgsqlschema/ingestion-test-data.sql | 8 + .../yang/models/o-ran-smo-teiv-equipment-test.yang | 192 ++ .../yang/models/o-ran-smo-teiv-oam-test.yang | 38 + .../yang/models/o-ran-smo-teiv-ran-test.yang | 240 ++ .../o-ran-smo-teiv-rel-equipment-ran-test.yang | 43 + .../models/o-ran-smo-teiv-rel-oam-ran-test.yang | 69 + 120 files changed, 6241 insertions(+), 769 deletions(-) rename teiv/src/main/java/org/oran/smo/teiv/{groups/utils => }/CachedBodyHttpServletRequest.java (52%) rename teiv/src/main/java/org/oran/smo/teiv/{groups/utils => }/CachedBodyServletInputStream.java (98%) create mode 100644 teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java rename teiv/src/main/java/org/oran/smo/teiv/{listener/audit/IngestionAuditInfo.java => exposure/OranTeivErrorJsonMessage.java} (52%) create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java rename teiv/src/main/java/org/oran/smo/teiv/groups/{utils => rest/controller}/GroupCreationRequestFilter.java (86%) create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java create mode 100644 teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql create mode 100644 teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql create mode 100644 teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang create mode 100644 teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang create mode 100644 teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang create mode 100644 teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang create mode 100644 teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java b/teiv/src/main/java/org/oran/smo/teiv/CachedBodyHttpServletRequest.java similarity index 52% rename from teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java rename to teiv/src/main/java/org/oran/smo/teiv/CachedBodyHttpServletRequest.java index 02cea94..5d0bca8 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java +++ b/teiv/src/main/java/org/oran/smo/teiv/CachedBodyHttpServletRequest.java @@ -1,7 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe + * Modifications Copyright (C) 2025 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. @@ -18,39 +17,51 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.groups.utils; + +package org.oran.smo.teiv; + +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import org.springframework.util.StreamUtils; - -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; - public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper { + private final byte[] requestBody; - private final byte[] cachedBody; - - public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException { + public CachedBodyHttpServletRequest(final HttpServletRequest request) throws IOException { super(request); - InputStream requestInputStream = request.getInputStream(); - this.cachedBody = StreamUtils.copyToByteArray(requestInputStream); + this.requestBody = readRequestBody(request); } @Override - public ServletInputStream getInputStream() throws IOException { - return new CachedBodyServletInputStream(this.cachedBody); + public ServletInputStream getInputStream() { + return new CachedBodyServletInputStream(this.requestBody); } @Override - public BufferedReader getReader() throws IOException { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedBody); - return new BufferedReader(new InputStreamReader(byteArrayInputStream, StandardCharsets.UTF_8)); + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(requestBody), StandardCharsets.UTF_8)); + } + + public String getRequestBody() { + return new String(requestBody, StandardCharsets.UTF_8); + } + + private byte[] readRequestBody(final HttpServletRequest request) throws IOException { + StringBuilder body = new StringBuilder(); + char[] buffer = new char[1024]; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), + StandardCharsets.UTF_8))) { + int bytesRead; + while ((bytesRead = reader.read(buffer)) != -1) { + body.append(buffer, 0, bytesRead); + } + } + return body.toString().getBytes(StandardCharsets.UTF_8); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java b/teiv/src/main/java/org/oran/smo/teiv/CachedBodyServletInputStream.java similarity index 98% rename from teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java rename to teiv/src/main/java/org/oran/smo/teiv/CachedBodyServletInputStream.java index 5b651d1..eb633e0 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java +++ b/teiv/src/main/java/org/oran/smo/teiv/CachedBodyServletInputStream.java @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.groups.utils; +package org.oran.smo.teiv; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java new file mode 100644 index 0000000..01f51ea --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java @@ -0,0 +1,58 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 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; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.exc.ValueInstantiationException; +import jakarta.servlet.Filter; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; +import org.oran.smo.teiv.exposure.OranTeivErrorJsonMessage; +import org.springframework.http.HttpStatus; + +import java.io.IOException; +import java.util.List; + +public abstract class RequestFilter implements Filter { + protected void writeError(final ServletResponse servletResponse, final JsonProcessingException exception, + final String message) throws IOException { + HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; + httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); + httpResponse.setContentType("application/problem+json"); + final OranTeivErrorJsonMessage errorMessage = OranTeivErrorJsonMessage.extendedBuilder().status( + HttpStatus.BAD_REQUEST.name()).message(message).details(getErrorDetails(exception)).build(); + httpResponse.getWriter().write(errorMessage.toJson()); + httpResponse.getWriter().flush(); + } + + private String getErrorDetails(JsonProcessingException exception) { + String details; + if (exception instanceof ValueInstantiationException e && exception + .getCause()instanceof IllegalArgumentException cause) { + final Class targetType = e.getType().getRawClass(); + details = cause.getMessage() + ". Invalid value for " + targetType.getSimpleName() + ", allowed values: " + List + .of(targetType.getEnumConstants()); + } else { + details = exception.getOriginalMessage(); + } + return details; + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java index 9ea5529..1f63c95 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java @@ -21,6 +21,9 @@ package org.oran.smo.teiv.exception; public class YangParsingException extends YangException { + private YangParsingException(final String message) { + super(message); + } public YangParsingException(final String message, final Throwable cause) { super(message, cause); @@ -29,4 +32,8 @@ public class YangParsingException extends YangException { public static YangParsingException failedIOExecution(Exception e) { return new YangParsingException("Failed to execute IO operation", e); } + + public static YangParsingException modelDirectoryDoesNotExists() { + return new YangParsingException("Model directory does not exist"); + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/OranTeivErrorJsonMessage.java similarity index 52% rename from teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/OranTeivErrorJsonMessage.java index 2dad952..9eeb2b6 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/OranTeivErrorJsonMessage.java @@ -1,7 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2025 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. @@ -18,27 +17,20 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.listener.audit; -import static org.oran.smo.teiv.listener.audit.ExecutionStatus.SUCCESS; - -import org.apache.commons.lang3.StringUtils; +package org.oran.smo.teiv.exposure; import lombok.Builder; +import org.oran.smo.teiv.api.model.OranTeivErrorMessage; -@Builder -public class IngestionAuditInfo { - private final ExecutionStatus status; - private final String operation; - private final String messageKey; - private final String cloudEvent; - private final String exceptionMessage; - - @Override - public String toString() { - String baseMessage = String.format("%s - %s topology. Message key: %s, CloudEvent: %s", status, StringUtils - .capitalize(operation), messageKey, cloudEvent); +public class OranTeivErrorJsonMessage extends OranTeivErrorMessage { + @Builder(builderMethodName = "extendedBuilder") + public OranTeivErrorJsonMessage(String status, final String message, final String details) { + super(status, message, details); + } - return status.equals(SUCCESS) ? baseMessage : (baseMessage + ", " + exceptionMessage); + public String toJson() { + return "{" + "\"status\": \"" + this.getStatus() + "\"," + "\"message\": \"" + this + .getMessage() + "\"," + "\"details\": \"" + this.getDetails() + "\"}"; } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java new file mode 100644 index 0000000..9137abc --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java @@ -0,0 +1,72 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 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.exposure.classifiers.rest.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.oran.smo.teiv.CustomMetrics; +import org.oran.smo.teiv.RequestFilter; +import org.oran.smo.teiv.api.model.OranTeivClassifier; +import org.oran.smo.teiv.exposure.audit.LoggerHandler; +import org.oran.smo.teiv.CachedBodyHttpServletRequest; +import org.springframework.context.annotation.Profile; + +import java.io.IOException; + +@Slf4j +@Profile("exposure") +@RequiredArgsConstructor +public class ClassifiersRequestFilter extends RequestFilter { + private final LoggerHandler loggerHandler; + private final ObjectMapper objectMapper; + private final CustomMetrics customMetrics; + + @Override + public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, + final FilterChain filterChain) throws IOException, ServletException { + if (servletRequest instanceof HttpServletRequest request) { + CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(request); + if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) { + final String payload = cachedBodyHttpServletRequest.getRequestBody(); + try { + objectMapper.readValue(payload, OranTeivClassifier.class); + filterChain.doFilter(cachedBodyHttpServletRequest, servletResponse); + } catch (final JsonProcessingException exception) { + customMetrics.incrementNumUnsuccessfullyUpdatedClassifiers(); + final String logMsg = String.format( + "Failed to process the request to merge/remove classifiers. Exception= %s , Payload= %s", + exception.getMessage(), payload); + loggerHandler.logAudit(log, logMsg, cachedBodyHttpServletRequest); + writeError(servletResponse, exception, "Failed to process the request to merge/remove classifiers"); + } + } + } else { + filterChain.doFilter(servletRequest, servletResponse); + } + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java index edc7484..a4a7d59 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java @@ -25,6 +25,7 @@ import java.util.Optional; import java.util.function.Consumer; import java.util.function.Supplier; +import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -39,12 +40,17 @@ import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.exposure.classifiers.api.ClassifiersService; import org.oran.smo.teiv.utils.TeivConstants; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Profile; +import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING; + @Slf4j @RestController @RequestMapping(TeivConstants.REQUEST_MAPPING) @@ -97,4 +103,13 @@ public class ClassifiersRestController implements ClassifiersApi { throw ex; } } + + @Bean + public FilterRegistrationBean classifiersRequestFilter(final ObjectMapper objectMapper) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new ClassifiersRequestFilter(loggerHandler, objectMapper, customMetrics)); + registrationBean.addUrlPatterns(REQUEST_MAPPING + "/classifiers"); + registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); + return registrationBean; + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java new file mode 100644 index 0000000..a75aa7f --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java @@ -0,0 +1,73 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 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.exposure.decorators.rest.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.oran.smo.teiv.CachedBodyHttpServletRequest; +import org.oran.smo.teiv.CustomMetrics; +import org.oran.smo.teiv.RequestFilter; +import org.oran.smo.teiv.api.model.OranTeivDecorator; +import org.oran.smo.teiv.exposure.audit.LoggerHandler; +import org.springframework.context.annotation.Profile; + +import java.io.IOException; + +@Slf4j +@Profile("exposure") +@RequiredArgsConstructor +public class DecoratorsRequestFilter extends RequestFilter { + private final LoggerHandler loggerHandler; + private final ObjectMapper objectMapper; + private final CustomMetrics customMetrics; + + @Override + public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, + final FilterChain filterChain) throws IOException, ServletException { + if (servletRequest instanceof HttpServletRequest request) { + CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(request); + if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) { + final String payload = cachedBodyHttpServletRequest.getRequestBody(); + try { + objectMapper.readValue(payload, OranTeivDecorator.class); + filterChain.doFilter(cachedBodyHttpServletRequest, servletResponse); + } catch (final JsonProcessingException exception) { + customMetrics.incrementNumUnsuccessfullyUpdatedDecorators(); + final String logMsg = String.format( + "Failed to process the request to merge/remove decorators. Exception= %s , Payload= %s", + exception.getMessage(), payload); + loggerHandler.logAudit(log, logMsg, cachedBodyHttpServletRequest); + writeError(servletResponse, exception, "Failed to process the request to merge/remove decorators"); + } + } + } else { + filterChain.doFilter(servletRequest, servletResponse); + } + } + +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java index 9a460f4..53b3575 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java @@ -24,6 +24,8 @@ import java.util.Collections; import java.util.Optional; import java.util.function.Consumer; import java.util.function.Supplier; + +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import io.micrometer.core.annotation.Timed; @@ -37,17 +39,21 @@ import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.audit.AuditMapper; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.exposure.decorators.api.DecoratorsService; -import org.oran.smo.teiv.utils.TeivConstants; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Profile; +import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING; + @Slf4j @RestController -@RequestMapping(TeivConstants.REQUEST_MAPPING) +@RequestMapping(REQUEST_MAPPING) @RequiredArgsConstructor @Profile("exposure") public class DecoratorsRestController implements DecoratorsApi { @@ -97,4 +103,13 @@ public class DecoratorsRestController implements DecoratorsApi { throw ex; } } + + @Bean + public FilterRegistrationBean decoratorsRequestFilter(final ObjectMapper objectMapper) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new DecoratorsRequestFilter(loggerHandler, objectMapper, customMetrics)); + registrationBean.addUrlPatterns(REQUEST_MAPPING + "/decorators"); + registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); + return registrationBean; + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java index 113a0f5..90bb607 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java @@ -38,6 +38,8 @@ import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import org.springframework.web.servlet.resource.NoResourceFoundException; +import static org.oran.smo.teiv.utils.ResponseUtil.getHeadersContentTypeAppProblemJson; + @Slf4j @ControllerAdvice public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler { @@ -48,8 +50,9 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler if (exception.getException() != null) { log.error(exception.getMessage(), exception.getException()); } - return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).details(exception - .getDetails()).status(exception.getStatus().name()), exception.getStatus()); + return ResponseEntity.status(exception.getStatus()).headers(getHeadersContentTypeAppProblemJson()).body( + OranTeivErrorMessage.builder().status(exception.getStatus().name()).message(exception.getMessage()).details( + exception.getDetails()).build()); } @ResponseBody @@ -58,8 +61,9 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler if (exception.getResponse() != null) { return new ResponseEntity<>(exception.getResponse(), HttpStatus.OK); } else { - return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).details(exception - .getDetails()).status(exception.getHttpStatus().name()), exception.getHttpStatus()); + return ResponseEntity.status(exception.getHttpStatus()).headers(getHeadersContentTypeAppProblemJson()).body( + OranTeivErrorMessage.builder().status(exception.getHttpStatus().name()).message(exception.getMessage()) + .details(exception.getDetails()).build()); } } @@ -67,28 +71,32 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler @ExceptionHandler(Exception.class) protected ResponseEntity handleGeneralException(final Exception ex) { log.error("Handling general exception", ex); - return new ResponseEntity<>(new OranTeivErrorMessage().status(HttpStatus.INTERNAL_SERVER_ERROR.name()), - HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).headers(getHeadersContentTypeAppProblemJson()).body( + new OranTeivErrorMessage().status(HttpStatus.INTERNAL_SERVER_ERROR.name())); } @ResponseBody @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity handleConstraintViolationException(ConstraintViolationException exception) { - return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).status(HttpStatus.BAD_REQUEST - .name()), HttpStatus.BAD_REQUEST); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(getHeadersContentTypeAppProblemJson()).body( + getBadRequestErrorMessage(exception)); } @Override protected ResponseEntity handleNoResourceFoundException(NoResourceFoundException exception, HttpHeaders headers, HttpStatusCode status, WebRequest request) { - return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).status(HttpStatus.BAD_REQUEST - .name()), HttpStatus.BAD_REQUEST); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(getHeadersContentTypeAppProblemJson()).body( + getBadRequestErrorMessage(exception)); } @Override protected ResponseEntity handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException exception, HttpHeaders headers, HttpStatusCode status, WebRequest request) { - return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).status(HttpStatus.BAD_REQUEST - .name()), HttpStatus.BAD_REQUEST); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(getHeadersContentTypeAppProblemJson()).body( + getBadRequestErrorMessage(exception)); + } + + public static OranTeivErrorMessage getBadRequestErrorMessage(final Exception e) { + return OranTeivErrorMessage.builder().status(HttpStatus.BAD_REQUEST.name()).message(e.getMessage()).build(); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java index 64b7df1..cfc1eb7 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java @@ -138,5 +138,5 @@ public interface DataRepository { * The id * @return true if exists, false if it does not */ - boolean isTopologyExist(final Persistable type, final String id); + boolean doesTopologyExist(final Persistable type, final String id); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java index 21799c9..934ab10 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java @@ -175,7 +175,7 @@ public class DataRepositoryImpl implements DataRepository { } @Override - public boolean isTopologyExist(final Persistable type, final String id) { + public boolean doesTopologyExist(final Persistable type, final String id) { return runMethodSafe(() -> readDataDslContext.fetchExists(readDataDslContext.selectFrom(table(type.getTableName())) .where(field(name(type.getIdColumnName())).eq(id)))); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java index 5cb0c3d..dc180ae 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java @@ -45,10 +45,10 @@ public abstract class AndOrLogicalBlock extends LogicalBlock { } @Override - public Set> getJoinCondition() { + public Set> getWhereExistsConditions() { Set> tables = new LinkedHashSet<>(); - tables.addAll(children.get(0).getJoinCondition()); - tables.addAll(children.get(1).getJoinCondition()); + tables.addAll(children.get(0).getWhereExistsConditions()); + tables.addAll(children.get(1).getWhereExistsConditions()); return tables; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java index 4358fb6..f2ee75e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java @@ -53,7 +53,7 @@ public class EmptyLogicalBlock extends LogicalBlock { return Collections.emptySet(); } - public Set> getJoinCondition() { + public Set> getWhereExistsConditions() { return Collections.emptySet(); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java index 17c4bbd..4299a6d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java @@ -74,11 +74,10 @@ public class InnerFilterCriteria { return tables; } - public Set> getJoinCondition() { - Set> joins = new LinkedHashSet<>(); - joins.addAll(scope.getJoinCondition()); - - return joins; + public Set> getWhereExistsCondition() { + Set> whereExistsCondition = new LinkedHashSet<>(); + whereExistsCondition.addAll(scope.getWhereExistsConditions()); + return whereExistsCondition; } public Map> getSelects() { diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java index 29465d4..7bf92e1 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java @@ -36,5 +36,5 @@ public abstract class LogicalBlock { public abstract Set getTables(); - public abstract Set> getJoinCondition(); + public abstract Set> getWhereExistsConditions(); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java index f0c1330..bcfcdd6 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java @@ -35,13 +35,16 @@ import org.oran.smo.teiv.schema.RelationshipDataLocation; import org.oran.smo.teiv.schema.SchemaRegistry; import org.oran.smo.teiv.utils.query.exception.TeivPathException; +import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import static org.jooq.impl.DSL.exists; import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.selectOne; import static org.jooq.impl.DSL.table; import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType.ASSOCIATION; import static org.oran.smo.teiv.utils.PersistableUtil.getTableNameWithColumnName; @@ -56,7 +59,26 @@ public class ScopeLogicalBlock extends LogicalBlock { @Override public Condition getCondition() { - return ConditionFactory.create(scopeObject).getCondition(scopeObject); + Condition scopeCondition = ConditionFactory.create(scopeObject).getCondition(scopeObject); + List> whereExistsConditions = new ArrayList<>(getWhereExistsConditions()); + if (!whereExistsConditions.isEmpty()) { + if (whereExistsConditions.size() > 2) { + //error out as with in a scope block there cannot be more than two joins/where exists conditions(many to many) + throw TeivException.serverException("Server unknown exception", + "More than two where exists condition within a logical block is not supported", null); + } + Condition existsCondition; + if (whereExistsConditions.size() == 1) { + existsCondition = exists(selectOne().from(whereExistsConditions.get(0).getLeft()).where(scopeCondition).and( + whereExistsConditions.get(0).getRight())); + } else { + existsCondition = exists(selectOne().from(whereExistsConditions.get(0).getLeft()).where( + whereExistsConditions.get(0).getRight()).andExists(selectOne().from(whereExistsConditions.get(1) + .getLeft()).where(whereExistsConditions.get(1).getRight()).and(scopeCondition))); + } + return existsCondition; + } + return scopeCondition; } @Override @@ -75,8 +97,8 @@ public class ScopeLogicalBlock extends LogicalBlock { } @SuppressWarnings({ "java:S1874" }) - public Set> getJoinCondition() { - Set> joinCondition = new LinkedHashSet<>(); + public Set> getWhereExistsConditions() { + Set> whereExistsCondition = new LinkedHashSet<>(); String[] topologyObjectSplit = scopeObject.getTopologyObject().split("/"); if (scopeObject.getTopologyObjectType().equals(ASSOCIATION) && SchemaRegistry.getEntityTypeByName( topologyObjectSplit[0]) != null) { @@ -87,26 +109,26 @@ public class ScopeLogicalBlock extends LogicalBlock { entityType) || relation.getBSide().equals(entityType)).findFirst().orElseThrow(() -> TeivPathException .invalidAssociation(entityType.getName(), association)); if (isManyToMany(relationType)) { - String columnName = getColumnNameForManyToManyJoin(entityType, relationType); - String col1 = constructColumnNameForJoinCondition(relationType, columnName); + String columnName = getColumnNameForManyToManyWhereExists(entityType, relationType); + String col1 = constructColumnNameForWhereExistsCondition(relationType, columnName); String col2 = getTableNameWithColumnName(entityType.getTableName(), ID_COLUMN_NAME); - joinCondition.add(constructJoinConditionPair(relationType.getTableName(), col1, col2)); + whereExistsCondition.add(constructWhereExistsConditionPair(relationType.getTableName(), col1, col2)); - if (isSecondJoinNeeded()) { - joinCondition.add(getSecondJoinCondition(entityType, relationType)); + if (isNestedWhereExistsRequired()) { + whereExistsCondition.add(getNestedWhereExistsCondition(entityType, relationType)); } - } else if (isJoinNeeded(topologyObjectSplit, relationType)) { - String col1 = constructColumnNameForJoinCondition(relationType, relationType + } else if (isWhereExistsNeeded(topologyObjectSplit, relationType)) { + String col1 = constructColumnNameForWhereExistsCondition(relationType, relationType .getNotStoringSideEntityIdColumnNameInStoringSideTable()); String col2 = getTableNameWithColumnName(relationType.getNotStoringSideTableName(), ID_COLUMN_NAME); - String tableName = getTableNameForJoin(topologyObjectSplit, relationType); - joinCondition.add(constructJoinConditionPair(tableName, col1, col2)); + String tableName = getTableNameForWhereExists(topologyObjectSplit, relationType); + whereExistsCondition.add(constructWhereExistsConditionPair(tableName, col1, col2)); } } - return joinCondition; + return whereExistsCondition; } - private boolean isSecondJoinNeeded() { + private boolean isNestedWhereExistsRequired() { return !scopeObject.getContainer().equals(ContainerType.ID) && !scopeObject.getContainer().equals( ContainerType.NOT_NULL); } @@ -115,12 +137,12 @@ public class ScopeLogicalBlock extends LogicalBlock { return relationType.getRelationshipStorageLocation().equals(RelationshipDataLocation.RELATION); } - private boolean isJoinNeeded(String[] topologyObjectSplit, RelationType relationType) { + private boolean isWhereExistsNeeded(String[] topologyObjectSplit, RelationType relationType) { return !relationType.getStoringSideEntityType().getName().equals(topologyObjectSplit[0]) || (!scopeObject .getContainer().equals(ContainerType.ID) && !scopeObject.getContainer().equals(ContainerType.NOT_NULL)); } - private static String getTableNameForJoin(String[] topologyObjectSplit, RelationType relationType) { + private static String getTableNameForWhereExists(String[] topologyObjectSplit, RelationType relationType) { if (relationType.getStoringSideEntityType().getName().equals(topologyObjectSplit[0])) { return relationType.getNotStoringSideTableName(); } else { @@ -128,22 +150,25 @@ public class ScopeLogicalBlock extends LogicalBlock { } } - private static Pair getSecondJoinCondition(EntityType entityType, RelationType relationType) { - EntityType entityTypeForSecondJoin; - String columnNameForSecondJoin; + private static Pair getNestedWhereExistsCondition(EntityType entityType, RelationType relationType) { + EntityType entityTypeForNestedWhereExists; + String columnNameForNestedWhereExists; if (!relationType.getASide().equals(entityType)) { - columnNameForSecondJoin = relationType.aSideColumnName(); - entityTypeForSecondJoin = relationType.getASide(); + columnNameForNestedWhereExists = relationType.aSideColumnName(); + entityTypeForNestedWhereExists = relationType.getASide(); } else { - columnNameForSecondJoin = relationType.bSideColumnName(); - entityTypeForSecondJoin = relationType.getBSide(); + columnNameForNestedWhereExists = relationType.bSideColumnName(); + entityTypeForNestedWhereExists = relationType.getBSide(); } - String col1ForSecondJoin = constructColumnNameForJoinCondition(relationType, columnNameForSecondJoin); - String col2ForSecondJoin = getTableNameWithColumnName(entityTypeForSecondJoin.getTableName(), ID_COLUMN_NAME); - return constructJoinConditionPair(entityTypeForSecondJoin.getTableName(), col1ForSecondJoin, col2ForSecondJoin); + String col1ForNestedWhereExists = constructColumnNameForWhereExistsCondition(relationType, + columnNameForNestedWhereExists); + String col2ForNestedWhereExists = getTableNameWithColumnName(entityTypeForNestedWhereExists.getTableName(), + ID_COLUMN_NAME); + return constructWhereExistsConditionPair(entityTypeForNestedWhereExists.getTableName(), col1ForNestedWhereExists, + col2ForNestedWhereExists); } - private static String getColumnNameForManyToManyJoin(EntityType entityType, RelationType relationType) { + private static String getColumnNameForManyToManyWhereExists(EntityType entityType, RelationType relationType) { if (relationType.getASide().equals(entityType)) { return relationType.aSideColumnName(); } else { @@ -151,11 +176,11 @@ public class ScopeLogicalBlock extends LogicalBlock { } } - private static String constructColumnNameForJoinCondition(RelationType relationType, String columnName) { + private static String constructColumnNameForWhereExistsCondition(RelationType relationType, String columnName) { return relationType.getTableName() + "." + String.format(QUOTED_STRING, columnName); } - private static Pair constructJoinConditionPair(String tableName, String col1, String col2) { + private static Pair constructWhereExistsConditionPair(String tableName, String col1, String col2) { Field equalsField = field(col1 + "=" + col2); return new ImmutablePair<>(tableName, equalsField); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java index 349cc3f..009dab7 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java @@ -20,8 +20,6 @@ */ package org.oran.smo.teiv.exposure.teivpath.refiner; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.Field; import org.jooq.JSONB; import org.jooq.OrderField; import org.jooq.Record; @@ -109,10 +107,6 @@ public class PathToJooqRefinement { } SelectJoinStep query = select(resolvedFields).from(filterCriteria.getTableFromTarget(filterCriteria .getTargets().get(0))); - List> joinConditions = new ArrayList<>(filterCriteria.getJoinCondition()); - for (int i = 0; i < joinConditions.size(); i++) { - query = query.join(joinConditions.get(i).getLeft()).on(joinConditions.get(i).getRight()); - } SelectConditionStep conditionStep = query.where(filterCriteria.getCondition()); if (countMode) { return conditionStep; diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupCreationRequestFilter.java similarity index 86% rename from teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java rename to teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupCreationRequestFilter.java index e00bd71..060dd66 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupCreationRequestFilter.java @@ -18,26 +18,21 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.groups.utils; +package org.oran.smo.teiv.groups.rest.controller; import static org.oran.smo.teiv.groups.audit.ExecutionStatus.FAILED; import static org.oran.smo.teiv.groups.audit.GroupOperation.CREATE; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.oran.smo.teiv.CachedBodyHttpServletRequest; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.groups.audit.AuditInfo; import org.springframework.context.annotation.Profile; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingResponseWrapper; @@ -54,14 +49,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j -@Component @RequiredArgsConstructor -@Order(Ordered.HIGHEST_PRECEDENCE) @Profile("groups") public class GroupCreationRequestFilter implements jakarta.servlet.Filter { private final LoggerHandler loggerHandler; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, @@ -70,7 +63,7 @@ public class GroupCreationRequestFilter implements jakarta.servlet.Filter { CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(httpServletRequest); ContentCachingResponseWrapper httpServletResponse = new ContentCachingResponseWrapper( (HttpServletResponse) response); - String payloadString = readRequestBody(cachedBodyHttpServletRequest); + String payloadString = cachedBodyHttpServletRequest.getRequestBody(); try { if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) { JsonNode createGroupPayload = objectMapper.readValue(payloadString, JsonNode.class); @@ -80,7 +73,7 @@ public class GroupCreationRequestFilter implements jakarta.servlet.Filter { payloadString).exceptionMessage(message).status(FAILED).build().toString(), cachedBodyHttpServletRequest); httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); - httpServletResponse.setContentType("application/json"); + httpServletResponse.setContentType("application/problem+json"); httpServletResponse.getWriter().write(generateResponse(message)); httpServletResponse.getWriter().flush(); return; @@ -125,16 +118,4 @@ public class GroupCreationRequestFilter implements jakarta.servlet.Filter { jsonResponse.put("status", HttpStatus.BAD_REQUEST); return objectMapper.writeValueAsString(jsonResponse); } - - private String readRequestBody(HttpServletRequest request) throws IOException { - StringBuilder body = new StringBuilder(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), - StandardCharsets.UTF_8))) { - String line; - while ((line = reader.readLine()) != null) { - body.append(line); - } - } - return body.toString(); - } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java index 9e488bf..cad025f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java @@ -29,17 +29,19 @@ import static org.oran.smo.teiv.groups.audit.GroupOperation.REMOVE_PROVIDED_MEMB import static org.oran.smo.teiv.groups.audit.GroupOperation.UPDATE_NAME; import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.MEMBERS_HREF_TEMPLATE; import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.PROVIDED_MEMBERS_HREF_TEMPLATE; +import static org.oran.smo.teiv.utils.ResponseUtil.getHeadersContentTypeAppProblemJson; +import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING; import java.util.function.Consumer; import java.util.function.Supplier; +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.tuple.Pair; import org.oran.smo.teiv.api.model.OranTeivDynamicGroupByIdResponse; import org.oran.smo.teiv.api.model.OranTeivStaticGroupByIdResponse; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.groups.audit.AuditInfo; import org.oran.smo.teiv.groups.audit.ExecutionStatus; -import org.oran.smo.teiv.groups.utils.GroupCreationRequestFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Profile; @@ -66,11 +68,10 @@ import org.oran.smo.teiv.api.model.OranTeivUpdateGroupNamePayload; import org.oran.smo.teiv.exposure.utils.RequestDetails; import org.oran.smo.teiv.groups.GroupsCustomMetrics; import org.oran.smo.teiv.groups.api.GroupsService; -import org.oran.smo.teiv.utils.TeivConstants; @Slf4j @RestController -@RequestMapping(TeivConstants.REQUEST_MAPPING) +@RequestMapping(REQUEST_MAPPING) @RequiredArgsConstructor @Profile("groups") public class GroupsController implements GroupsApi { @@ -195,7 +196,8 @@ public class GroupsController implements GroupsApi { final OranTeivErrorMessage errorMessage = OranTeivErrorMessage.builder().status(exception.getStatus().name()) .message(exception.getMessage()).details(exception.getDetails()).build(); - return new ResponseEntity<>(errorMessage, exception.getStatus()); + return ResponseEntity.status(exception.getStatus()).headers(getHeadersContentTypeAppProblemJson()).body( + errorMessage); } private T runWithFailCheck(final Supplier supp, final Runnable runnable) { @@ -224,10 +226,10 @@ public class GroupsController implements GroupsApi { } @Bean - public FilterRegistrationBean loggingFilter() { + public FilterRegistrationBean loggingFilter(final ObjectMapper objectMapper) { FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(new GroupCreationRequestFilter(loggerHandler)); - registrationBean.addUrlPatterns("/groups"); + registrationBean.setFilter(new GroupCreationRequestFilter(loggerHandler, objectMapper)); + registrationBean.addUrlPatterns(REQUEST_MAPPING + "/groups"); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java index 9351839..877af76 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java @@ -215,7 +215,7 @@ public class GroupsRepositoryImpl implements GroupsRepository { @Override public void createStaticGroup(final StaticGroupRecord groupRecord) { - log.debug("Create a static group with name {}", groupRecord.getGroupName()); + log.debug("Create a static group with name: {}", groupRecord.getGroupName()); writeDataDslContext.transaction((Configuration trx) -> { trx.dsl().insertInto(GROUPS_TABLE).set(GROUP_ID, groupRecord.getId()).set(GROUP_NAME, groupRecord .getGroupName()).set(GROUP_TYPE, groupRecord.getGroupType()).execute(); diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java index 671f4bf..b4ce191 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java @@ -36,6 +36,7 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.springframework.util.StopWatch; +import java.util.ArrayList; import java.util.List; import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_CREATE; @@ -59,7 +60,7 @@ public class CreateTopologyProcessor implements TopologyProcessor { if (null == parsedCloudEventData) { log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent)); customMetrics.incrementNumUnsuccessfullyParsedCreateCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); return; } @@ -70,28 +71,33 @@ public class CreateTopologyProcessor implements TopologyProcessor { stopWatch.start(); List operationResults; + List inferredItems = new ArrayList<>(); final String sourceAdapter = String.valueOf(cloudEvent.getSource()); try { operationResults = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, sourceAdapter); + operationResults.stream().filter(OperationResult::isInferred).map(result -> String.format( + "{\"%s:%s\":[{\"id\":\"%s\"}]}", result.getModule(), result.getType(), result.getId())).forEach( + inferredItems::add); } catch (InvalidFieldInYangDataException e) { log.error("Invalid field in yang data. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedCreateCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e .getMessage()); return; } catch (RuntimeException e) { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedCreateCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e .getMessage()); return; } stopWatch.stop(); customMetrics.incrementNumSuccessfullyPersistedCreateCloudEvents(); customMetrics.recordCloudEventCreatePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); - auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, ""); + auditLogger.logSuccess(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, + inferredItems); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java index b8ea59c..c150f4c 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java @@ -29,7 +29,6 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jooq.DSLContext; import org.oran.smo.teiv.CustomMetrics; -import org.oran.smo.teiv.listener.audit.ExecutionStatus; import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; @@ -45,6 +44,9 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.springframework.util.StopWatch; +import static org.oran.smo.teiv.listener.audit.ExecutionStatus.FAILED; +import static org.oran.smo.teiv.listener.audit.ExecutionStatus.SUCCESS; +import static org.oran.smo.teiv.utils.OperationResultParser.fromOperationResults; import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_DELETE; @Component @@ -68,7 +70,7 @@ public class DeleteTopologyProcessor implements TopologyProcessor { if (parsedCloudEventData == null) { log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent)); customMetrics.incrementNumUnsuccessfullyParsedDeleteCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); + auditLogger.logError(FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); return; } parsedCloudEventData.sort(); @@ -106,13 +108,13 @@ public class DeleteTopologyProcessor implements TopologyProcessor { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedDeleteCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, e.getMessage()); + auditLogger.logError(FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, e.getMessage()); return; } stopWatch.stop(); customMetrics.recordCloudEventDeletePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); customMetrics.incrementNumSuccessfullyPersistedDeleteCloudEvents(); - auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, ""); + auditLogger.logSuccess(SUCCESS, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, fromOperationResults(operationResults)); } //spotless:on } diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java index 920b915..44349ff 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java @@ -65,7 +65,7 @@ public class MergeTopologyProcessor implements TopologyProcessor { if (null == parsedCloudEventData) { log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent)); customMetrics.incrementNumUnsuccessfullyParsedMergeCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); return; } parsedCloudEventData.sort(); @@ -75,27 +75,32 @@ public class MergeTopologyProcessor implements TopologyProcessor { stopWatch.start(); List operationResults = new ArrayList<>(); + List inferredItems = new ArrayList<>(); final String sourceAdapter = String.valueOf(cloudEvent.getSource()); try { operationResults = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, sourceAdapter); + operationResults.stream() + .filter(OperationResult::isInferred) + .map(result -> String.format("{\"%s:%s\":[{\"id\":\"%s\"}]}", result.getModule(), result.getType(), result.getId())) + .forEach(inferredItems::add); } catch (InvalidFieldInYangDataException e) { log.error("Invalid field in yang data. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedMergeCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage()); + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage()); return; } catch (RuntimeException e) { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedMergeCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage()); + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage()); return; } stopWatch.stop(); customMetrics.incrementNumSuccessfullyPersistedMergeCloudEvents(); customMetrics.recordCloudEventMergePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); - auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, ""); + auditLogger.logSuccess(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, inferredItems); } //spotless:on } diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java index e8f5dba..b8d6258 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java @@ -70,7 +70,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { } catch (IOException e) { log.error("Error while parsing the {} event.", e.getMessage()); customMetrics.incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); return; } @@ -80,7 +80,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { log.error("Unsupported type: {} for source-entity-delete event. Event: {}", sourceEntityDelete.type, cloudEvent); customMetrics.incrementNumReceivedCloudEventNotSupported(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, String.format("Unsupported type: %s for source-entity-delete event.", sourceEntityDelete.type)); return; } @@ -107,7 +107,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents(); - auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, e.getMessage()); return; } @@ -115,8 +115,8 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { stopWatch.stop(); customMetrics.recordCloudEventSourceEntityDeletePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); customMetrics.incrementNumSuccessfullyPersistedSourceEntityDeleteCloudEvents(); - auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, - ""); + auditLogger.logSuccess(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + List.of()); } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java index e1068a4..c710f77 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java @@ -20,6 +20,7 @@ */ package org.oran.smo.teiv.listener.audit; +import org.apache.commons.lang3.StringUtils; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.springframework.stereotype.Component; @@ -28,6 +29,11 @@ import io.cloudevents.CloudEvent; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.util.List; + +import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_CREATE; +import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_MERGE; + @Slf4j @AllArgsConstructor @Component @@ -35,10 +41,25 @@ public class IngestionAuditLogger { private final LoggerHandler loggerHandler; - public void auditLog(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey, + public void logError(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey, String errorMsg) { - loggerHandler.logAuditBase(log, IngestionAuditInfo.builder().status(status).operation(operationType).messageKey( - messageKey).cloudEvent(CloudEventUtil.cloudEventToPrettyString(cloudEvent)).exceptionMessage(errorMsg) - .build().toString(), String.valueOf(cloudEvent.getSource())); + final String message = String.format("%s. Exception = %s", getMessage(status, operationType, cloudEvent, + messageKey), errorMsg); + loggerHandler.logAuditBase(log, message, cloudEvent.getSource().toString()); + } + + public void logSuccess(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey, + List inferred) { + final String message = String.format("%s. Implicitly %sd items = %s", getMessage(status, operationType, cloudEvent, + messageKey), operationType.equals(CLOUD_EVENT_WITH_TYPE_MERGE) ? + CLOUD_EVENT_WITH_TYPE_CREATE : + operationType, inferred); + loggerHandler.logAuditBase(log, message, cloudEvent.getSource().toString()); + } + + private String getMessage(final ExecutionStatus status, final String operation, final CloudEvent cloudEvent, + final String messageKey) { + return String.format("%s - %s topology. Message key: %s, CloudEvent: %s", status, StringUtils.capitalize(operation), + messageKey, CloudEventUtil.cloudEventToPrettyString(cloudEvent)); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java index 840bbde..6569ca6 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java @@ -20,10 +20,15 @@ */ package org.oran.smo.teiv.schema; +import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_ENTITY_NAME_IN_DOMAIN; +import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_ENTITY_NAME_IN_TEIV_DOMAIN; +import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_RELATION_NAME_IN_DOMAIN; +import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_RELATION_NAME_IN_TEIV_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_MODULE; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_MODULE; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DOMAIN; import java.util.ArrayList; import java.util.Collections; @@ -156,29 +161,44 @@ public class SchemaRegistry { } /** - * Gets the {@link EntityType} by the given module name and the entity type name. + * Gets the {@link EntityType} by the given domain name and the entity type name. * Since TEIV supports TEIV as top level domain on the exposure side, there is possibility to return more than one - * EntityType for a given name - * with domain as TIEV. + * EntityType for a given name with domain as TEIV. In this instance, an error will be thrown because this is not yet + * implemented in TEIV. * * @param domain * - name of the domain * @param entityTypeName * - name of the entityType - * @return the list of {@link EntityType} + * @return the {@link EntityType} * @throws SchemaRegistryException * if entity type is not found in the domain */ - public static List getEntityTypeByDomainAndName(final String domain, final String entityTypeName) + @Cacheable("entityTypeByDomainAndName") + public static EntityType getEntityTypeByDomainAndName(final String domain, final String entityTypeName) throws SchemaRegistryException { - final List matchedEntityTypes = entityTypes.stream().filter(entityType -> entityType.getModule() - .getDomain().equals(domain) && entityType.getName().equals(entityTypeName)).toList(); - if (matchedEntityTypes.isEmpty()) { + final List matchedEntityTypes = getEntityTypesByDomain(domain).stream().filter(entityType -> entityType + .getName().equals(entityTypeName)).toList(); + if (matchedEntityTypes.size() == 1) { + return matchedEntityTypes.get(0); + } else if (matchedEntityTypes.isEmpty()) { log.warn("Domain: {} does not contain the entity type: {}", domain, entityTypeName); throw new SchemaRegistryException(ENTITY_NOT_FOUND_IN_DOMAIN, String.format( "Entity type: %s not found in domain: %s", entityTypeName, domain)); + } else { + if (domain.equals(TEIV_DOMAIN)) { + log.warn("Domain: {} contains duplicate entity type: {}. This is yet to be implemented in TEIV.", domain, + entityTypeName); + throw new SchemaRegistryException(DUPLICATE_ENTITY_NAME_IN_TEIV_DOMAIN, String.format( + "Duplicate entity type: %s found in domain: %s. This is yet to be implemented in TEIV.", + entityTypeName, domain)); + } + log.warn("Domain: {} contains duplicate entity type: {}. This is not supported in TEIV.", domain, + entityTypeName); + throw new SchemaRegistryException(DUPLICATE_ENTITY_NAME_IN_DOMAIN, String.format( + "Duplicate entity type: %s found in domain: %s. This is not supported in TEIV.", entityTypeName, + domain)); } - return matchedEntityTypes; } /** @@ -290,28 +310,44 @@ public class SchemaRegistry { } /** - * Gets the {@link RelationType} (could be more than one when domain is TEIV) by the given module name and the relation - * type - * name. + * Gets the {@link RelationType} by the given domain name and the relation type name. + * Since TEIV supports TEIV as top level domain on the exposure side, there is possibility to return more than one + * RelationType for a given name with domain as TEIV. In this instance, an error will be thrown because this is not yet + * implemented in TEIV. * * @param domain * - name of the domain * @param relationTypeName * - name of the relation type - * @return the list of {@link RelationType} + * @return the {@link RelationType} * @throws SchemaRegistryException * if relation type is not found in the domain */ - public static List getRelationTypeByDomainAndName(final String domain, final String relationTypeName) + @Cacheable("relationTypeByDomainAndName") + public static RelationType getRelationTypeByDomainAndName(final String domain, final String relationTypeName) throws SchemaRegistryException { - final List matchedRelationTypes = relationTypes.stream().filter(relationType -> relationType - .getModule().getDomain().equals(domain) && relationType.getName().equals(relationTypeName)).toList(); - if (matchedRelationTypes.isEmpty()) { + final List matchedRelationTypes = getRelationTypesByDomain(domain).stream().filter( + relationType -> relationType.getName().equals(relationTypeName)).toList(); + if (matchedRelationTypes.size() == 1) { + return matchedRelationTypes.get(0); + } else if (matchedRelationTypes.isEmpty()) { log.warn("Domain: {} does not contain the relation type: {}", domain, relationTypeName); throw new SchemaRegistryException(RELATIONSHIP_NOT_FOUND_IN_DOMAIN, String.format( "Relation type: %s not found in domain: %s", relationTypeName, domain)); + } else { + if (domain.equals(TEIV_DOMAIN)) { + log.warn("Domain: {} contains duplicate relation type: {}. This is yet to be implemented in TEIV.", domain, + relationTypeName); + throw new SchemaRegistryException(DUPLICATE_RELATION_NAME_IN_TEIV_DOMAIN, String.format( + "Duplicate relation type: %s found in domain: %s. This is yet to be implemented in TEIV.", + relationTypeName, domain)); + } + log.warn("Domain: {} contains duplicate relation type: {}. This is not supported in TEIV.", domain, + relationTypeName); + throw new SchemaRegistryException(DUPLICATE_RELATION_NAME_IN_DOMAIN, String.format( + "Duplicate relation type: %s found in domain: %s. This is not supported in TEIV.", relationTypeName, + domain)); } - return matchedRelationTypes; } /** diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java index 7b48051..a3e3d4f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java @@ -26,6 +26,10 @@ package org.oran.smo.teiv.schema; public enum SchemaRegistryErrorCode { ENTITY_NOT_FOUND_IN_DOMAIN, ENTITY_NOT_FOUND_IN_MODULE, + DUPLICATE_ENTITY_NAME_IN_TEIV_DOMAIN, + DUPLICATE_ENTITY_NAME_IN_DOMAIN, RELATIONSHIP_NOT_FOUND_IN_DOMAIN, - RELATIONSHIP_NOT_FOUND_IN_MODULE + RELATIONSHIP_NOT_FOUND_IN_MODULE, + DUPLICATE_RELATION_NAME_IN_TEIV_DOMAIN, + DUPLICATE_RELATION_NAME_IN_DOMAIN } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java b/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java index 3acb2bd..89ed799 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java @@ -153,7 +153,8 @@ public class TeivDbOperations { int affectedRows = context.delete(table(entityType.getTableName())).where(field(ID_COLUMN_NAME).eq(entityId)) .execute(); if (affectedRows > 0) { - result.add(OperationResult.builder().id(entityId).type(entityType.getName()).category(ENTITY_CATEGORY).build()); + result.add(OperationResult.builder().id(entityId).type(entityType.getName()).category(ENTITY_CATEGORY).module( + entityType.getModule().getName()).build()); } return result; } @@ -168,15 +169,14 @@ public class TeivDbOperations { .getIdColumnName()), String.class)).from(table(relationType.getTableName())).where(field(String.format( QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).forUpdate().fetchInto(String.class) .stream().filter(Objects::nonNull).map(id -> OperationResult.builder().id(id).type(relationType.getName()) - .category(RELATIONSHIP_CATEGORY).build()).collect(Collectors.toList()); + .category(RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()).collect( + Collectors.toList()); + int updateResult; if (relationshipList.isEmpty()) { return relationshipList; } else { - int updateResult = context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING, - relationType.getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))) - .set(field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())) - .setNull(field(String.format(QUOTED_STRING, relationType.getMetadataColumnName()))).where(field(String - .format(QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).execute(); + updateResult = executeRelationshipDelete(context, manySideEntityIdColumn, manySideEntityId, relationType, + oneSideEntityIdColumn); return updateResult > 0 ? relationshipList : List.of(); } @@ -187,17 +187,28 @@ public class TeivDbOperations { String oneSideEntityIdColumn = relationType.getRelationshipStorageLocation().equals(B_SIDE) ? relationType.aSideColumnName() : relationType.bSideColumnName(); - int affectedRows = context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING, - relationType.getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))).set( - field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())) - .setNull(field(String.format(QUOTED_STRING, relationType.getMetadataColumnName()))).where(field(String - .format(QUOTED_STRING, relationType.getIdColumnName())).eq(relationshipId)).execute(); + + int affectedRows; + affectedRows = executeRelationshipDelete(context, relationType.getIdColumnName(), relationshipId, relationType, + oneSideEntityIdColumn); return affectedRows > 0 ? Optional.of(OperationResult.builder().id(relationshipId).type(relationType.getName()).category( - RELATIONSHIP_CATEGORY).build()) : + RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()) : Optional.empty(); } + private static int executeRelationshipDelete(DSLContext context, String whereClauseColumnName, + String whereClauseColumnId, RelationType relationType, String oneSideEntityIdColumn) { + return context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING, relationType + .getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))).set(field(String + .format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())).set(field(String + .format(QUOTED_STRING, relationType.getClassifiersColumnName())), toJsonb(List.of())).set( + field(String.format(QUOTED_STRING, relationType.getDecoratorsColumnName())), + toJsonb("{}")).setNull(field(String.format(QUOTED_STRING, relationType + .getMetadataColumnName()))).where(field(String.format(QUOTED_STRING, + whereClauseColumnName)).eq(whereClauseColumnId)).execute(); + } + public List deleteManyToManyRelationByEntityId(DSLContext context, RelationType relationType, String entityId, String aSideColumnName, String bSideColumnName) { List deletedIds = context.delete(table((relationType.getTableName()))).where(field(String.format( @@ -206,7 +217,7 @@ public class TeivDbOperations { TeivConstants.ID_COLUMN_NAME), String.class); return deletedIds.stream().map(id -> OperationResult.builder().id(id).type(relationType.getName()).category( - RELATIONSHIP_CATEGORY).build()).collect(Collectors.toList()); + RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()).collect(Collectors.toList()); } public Optional deleteManyToManyRelationByRelationId(DSLContext context, RelationType relationType, @@ -215,7 +226,7 @@ public class TeivDbOperations { relationshipId)).execute(); return affectedRows > 0 ? Optional.of(OperationResult.builder().id(relationshipId).type(relationType.getName()).category( - RELATIONSHIP_CATEGORY).build()) : + RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()) : Optional.empty(); } @@ -348,7 +359,8 @@ public class TeivDbOperations { createMissingStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray, metadataMissingEntity); addEntityToOperationResults(results, relationship.getStoringSideEntityId(), - metadataMissingEntity, relationType.getStoringSideEntityType().getName()); + metadataMissingEntity, relationType.getStoringSideEntityType().getName(), relationType + .getStoringSideEntityType().getModule().getName()); updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse( results::add, () -> { throw new IllegalOneToManyRelationshipUpdateException(relationship, true); @@ -365,12 +377,14 @@ public class TeivDbOperations { createMissingStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray, metadataMissingEntity); addEntityToOperationResults(results, relationship.getStoringSideEntityId(), metadataMissingEntity, - relationType.getStoringSideEntityType().getName()); + relationType.getStoringSideEntityType().getName(), relationType.getStoringSideEntityType() + .getModule().getName()); } createMissingNotStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray, metadataMissingEntity); addEntityToOperationResults(results, relationship.getNotStoringSideEntityId(), metadataMissingEntity, - relationType.getNotStoringSideEntityType().getName()); + relationType.getNotStoringSideEntityType().getName(), relationType.getNotStoringSideEntityType() + .getModule().getName()); updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse(results::add, () -> { throw new IllegalOneToManyRelationshipUpdateException(relationship, false); @@ -446,20 +460,24 @@ public class TeivDbOperations { List results, byte[] respAdapterByteArray) { String aSideTableName = relationType.getASide().getTableName(); String aSideId = relationship.getASide(); + String aSideModuleName = relationType.getASide().getModule().getName(); String bSideTableName = relationType.getBSide().getTableName(); String bSideId = relationship.getBSide(); + String bSideModuleName = relationType.getASide().getModule().getName(); String relationshipId = relationship.getId(); final Map metadata = TeivMetadataResolver.getMetadataForInferredEntity(); if (createMissingEntity(aSideTableName, aSideId, relationshipId, dslContext, relationType.getASide(), respAdapterByteArray, metadata) == 1) { results.add(OperationResult.builder().id(aSideId).type(relationType.getASide().getName()).category( - ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).build()); + ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).module(aSideModuleName) + .isInferred(true).build()); } if (createMissingEntity(bSideTableName, bSideId, relationshipId, dslContext, relationType.getBSide(), respAdapterByteArray, metadata) == 1) { results.add(OperationResult.builder().id(bSideId).type(relationType.getBSide().getName()).category( - ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).build()); + ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).module(bSideModuleName) + .isInferred(true).build()); } } @@ -513,9 +531,9 @@ public class TeivDbOperations { } private void addEntityToOperationResults(List results, String entityId, Map metadata, - String entityType) { + String entityType, String entityModule) { OperationResult result = OperationResult.builder().id(entityId).type(entityType).category(ENTITY_CATEGORY).metadata( - metadata).build(); + metadata).module(entityModule).isInferred(true).build(); if (!results.contains(result)) { results.add(result); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java b/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java index ae7d7c4..846a464 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; -import io.cloudevents.CloudEvent; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -36,11 +35,9 @@ import org.apache.kafka.common.config.TopicConfig; import org.oran.smo.teiv.config.KafkaAdminConfig; import org.oran.smo.teiv.config.KafkaConfig; import org.oran.smo.teiv.utils.RetryOperationUtils; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Profile; import org.springframework.kafka.config.TopicBuilder; import org.springframework.kafka.core.KafkaAdmin; -import org.springframework.kafka.core.KafkaTemplate; import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component; @@ -58,9 +55,6 @@ public class KafkaTopicService { @Getter private final KafkaConfig kafkaConfig; - @Qualifier("topologyAuditKafkaTemplate") - private final KafkaTemplate topologyAuditkafkaTemplate; - public boolean checkTopologyIngestionTopic() { return checkTopicCreated(kafkaConfig.getTopologyIngestion().getTopicName()); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java b/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java index 8d7e516..9340ff8 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java @@ -26,6 +26,7 @@ import java.util.Map; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; import lombok.Builder; import lombok.AllArgsConstructor; import lombok.Data; @@ -34,13 +35,16 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) +// Include.NON_NULL was chosen over NON_EMPTY, since empty classifiers/decorators means those field in DB are empty, +// while null classifiers/decorators means they were irrelevant in terms of the executed operation. +@JsonInclude(Include.NON_NULL) @Builder public class OperationResult { private String id; private String type; // e.g.: NRCellDU, Site, CloudNativeApplication private String category; // "entity" or "relationship" private Map attributes; + private String module; private String aSide; private String bSide; private List classifiers; @@ -48,6 +52,7 @@ public class OperationResult { private Map metadata; private List sourceIds; private boolean isUpdatedInDb; + private boolean isInferred; public static final String ENTITY_CATEGORY = "entity"; public static final String RELATIONSHIP_CATEGORY = "relationship"; diff --git a/teiv/src/main/java/org/oran/smo/teiv/startup/AppInit.java b/teiv/src/main/java/org/oran/smo/teiv/startup/AppInit.java index 22f249c..4b32016 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/startup/AppInit.java +++ b/teiv/src/main/java/org/oran/smo/teiv/startup/AppInit.java @@ -52,7 +52,7 @@ public class AppInit { * unaffected by retries. */ @Async - @Order(value = 20) + @Order(value = 25) @EventListener(value = ApplicationReadyEvent.class) public void startUpHandler() { if (dependentServiceAvailabilityKafka.checkService()) { diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java new file mode 100644 index 0000000..eb88364 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java @@ -0,0 +1,35 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 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.utils; + +import lombok.experimental.UtilityClass; +import org.oran.smo.teiv.service.models.OperationResult; + +import java.util.List; + +@UtilityClass +public class OperationResultParser { + + public static List fromOperationResults(List operationResults) { + return operationResults.stream().filter(op -> !op.isInferred()).map(op -> String.format( + "{\"%s:%s\":[{\"id\":\"%s\"}]}", op.getModule(), op.getType(), op.getId())).toList(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java b/teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java new file mode 100644 index 0000000..dca9fe0 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java @@ -0,0 +1,34 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 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.utils; + +import lombok.experimental.UtilityClass; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +@UtilityClass +public class ResponseUtil { + public static HttpHeaders getHeadersContentTypeAppProblemJson() { + final HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.valueOf(MediaType.APPLICATION_PROBLEM_JSON_VALUE)); + return httpHeaders; + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java index ec121f5..f0f6c32 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java @@ -266,6 +266,7 @@ public class YangParser { case "string" -> "TEXT"; case "boolean" -> "BOOLEAN"; case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT"; + case "decimal64" -> "DEC"; default -> throw TeivException.invalidFileInput("Invalid data type"); })); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java index dea6d90..a46ff9f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java @@ -31,6 +31,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import org.oran.smo.teiv.exception.YangException; import org.springframework.web.multipart.MultipartFile; import org.oran.smo.yangtools.parser.ParserExecutionContext; @@ -43,7 +44,6 @@ import org.oran.smo.yangtools.parser.model.YangModel; import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement; import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exception.YangParsingException; -import org.oran.smo.teiv.exception.YangSchemaException; public class ExposureYangParser extends YangModelLoader { private static final List yangModelInputs = new CopyOnWriteArrayList<>(); @@ -52,7 +52,7 @@ public class ExposureYangParser extends YangModelLoader { ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("ietf-*;*;*"), ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("_3gpp*;*;*")); - public static void loadAndValidateModels() throws YangSchemaException { + public static void loadAndValidateModels() throws YangException { ParserExecutionContext context = createParserExecutionContext(List.of(), List.of(), FILTER_PREDICATES); context.setFailFast(false); final List yangModels = YangModelLoader.loadModulesFromSchemaRegistry(); @@ -127,6 +127,7 @@ public class ExposureYangParser extends YangModelLoader { case "string" -> "TEXT"; case "boolean" -> "BOOLEAN"; case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT"; + case "decimal64" -> "DEC"; default -> throw TeivException.invalidFileInput("Invalid data type"); }; if (resultMap.putIfAbsent(key, value) != null) { diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java index 76ba229..71ec05e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import org.oran.smo.teiv.exception.YangException; import org.oran.smo.yangtools.parser.ParserExecutionContext; import org.oran.smo.yangtools.parser.YangDeviceModel; import org.oran.smo.yangtools.parser.data.YangData; @@ -45,7 +46,6 @@ import org.oran.smo.yangtools.parser.model.statements.ietf.IetfExtensionsClassSu import org.oran.smo.yangtools.parser.model.statements.threegpp.ThreeGppExtensionsClassSupplier; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.exception.YangParsingException; -import org.oran.smo.teiv.exception.YangSchemaException; import org.oran.smo.teiv.exception.YangValidationException; public class IngestionYangParser extends YangModelLoader { @@ -58,7 +58,7 @@ public class IngestionYangParser extends YangModelLoader { private static final List EXTENSION_CREATORS = List.of(new IetfExtensionsClassSupplier(), new ThreeGppExtensionsClassSupplier()); - public static void loadModels() throws YangSchemaException, YangValidationException { + public static void loadModels() throws YangException { ParserExecutionContext context = createParserExecutionContext(EXTENSION_CREATORS, List.of(), FILTER_PREDICATES); final List yangModels = YangModelLoader.loadModulesFromSchemaRegistry(); List models = YangModelLoader.parseModelsIntoContext(context, yangModels); diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java index e8ee177..37d6303 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java @@ -23,8 +23,10 @@ package org.oran.smo.teiv.utils.yangparser; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Base64; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -43,15 +45,14 @@ import org.oran.smo.teiv.exception.YangParsingException; import org.oran.smo.teiv.exception.YangSchemaException; import org.oran.smo.teiv.exposure.spi.Module; import org.oran.smo.teiv.schema.SchemaRegistry; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.util.StringUtils; public abstract class YangModelLoader { - private static final Set MODULES_TO_IMPORT = Set.of("_3gpp-common-yang-extensions", "_3gpp-common-yang-types", - "ietf-geo-location", "ietf-inet-types", "ietf-yang-types"); - private static final Set MODULES_TO_IMPLEMENT = Set.of("o-ran-smo-teiv-common-yang-extensions", - "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran", - "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-rel-oam-ran", "o-ran-smo-teiv-cloud", - "o-ran-smo-teiv-rel-cloud-ran"); + private static final String IMPORT_MODELS_PATH = "classpath:models/import/*.yang"; + private static final String IMPLEMENT_MODELS_PATH = "classpath:models/*.yang"; public static ParserExecutionContext createParserExecutionContext(List extensions, List customProcessors, Set filterPredicates) { @@ -62,24 +63,37 @@ public abstract class YangModelLoader { return context; } - public static List loadModulesFromSchemaRegistry() throws YangSchemaException { + public static List loadModulesFromSchemaRegistry() throws YangSchemaException, YangParsingException { Map modules = SchemaRegistry.getModuleRegistry(); if (modules == null) { throw YangSchemaException.failedToLoadSchema(); } + List importModels = readYangModelsFromPath(IMPORT_MODELS_PATH); + List implementModels = readYangModelsFromPath(IMPLEMENT_MODELS_PATH); List implementList = new ArrayList<>(); List importList = new ArrayList<>(); modules.values().stream().filter(module -> module.getContent() != null).forEach(module -> { String content = new String(Base64.getDecoder().decode(module.getContent()), StandardCharsets.UTF_8); - if (MODULES_TO_IMPORT.contains(module.getName())) { + if (importModels.contains(module.getName())) { importList.add(content); - } else if (MODULES_TO_IMPLEMENT.contains(module.getName())) { + } else if (implementModels.contains(module.getName())) { implementList.add(content); } }); return createYangModels(importList, implementList); } + public static List readYangModelsFromPath(String modelsPath) throws YangParsingException { + try { + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(YangModelLoader.class + .getClassLoader()); + return Arrays.stream(resolver.getResources(modelsPath)).map(f -> StringUtils.stripFilenameExtension(Objects + .requireNonNull(f.getFilename()).toLowerCase(Locale.ROOT))).toList(); + } catch (IOException e) { + throw YangParsingException.modelDirectoryDoesNotExists(); + } + } + public static List parseModelsIntoContext(ParserExecutionContext context, List yangModelInputs) throws YangSchemaException { if (yangModelInputs.isEmpty()) { diff --git a/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml b/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml index 9fe392e..7295227 100644 --- a/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml +++ b/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml @@ -82,32 +82,32 @@ components: payload: entities: - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" attributes: cellLocalId: 4589 nRPCI: 12 nRTAC: 310 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" attributes: cellLocalId: 4590 nRPCI: 32 nRTAC: 510 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" relationships: - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1" + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2" + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" headers: ce_specversion: '1.0' ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd233 @@ -132,32 +132,32 @@ components: payload: entities: - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" attributes: cellLocalId: 4579 nRPCI: 12 nRTAC: 310 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" attributes: cellLocalId: 4580 nRPCI: 32 nRTAC: 510 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" relationships: - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1" + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2" + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" headers: ce_specversion: '1.0' ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd234 @@ -182,9 +182,9 @@ components: payload: entities: - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationships: - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" @@ -212,15 +212,13 @@ components: items: type: object description: Entities schema will adhere to the entity types and - attributes mentioned in the yang modules. Refer to EIC Developer - Portal for Yang Modules. + attributes mentioned in the yang modules. relationships: type: array items: type: object description: Relationship schema will adhere to the relationship - types mentioned in the yang modules. Refer to EIC Developer Portal - for Yang Modules. + types mentioned in the yang modules. messageTraits: commonHeaders: headers: diff --git a/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java b/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java index 7e1be03..a827293 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java +++ b/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java @@ -57,6 +57,10 @@ public class TestPostgresqlContainer extends PostgreSQLContainer pair1 = new ImmutablePair<>("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"", field( "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_provided-by-oduFunction\"" + "=" + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"")); Assertions.assertEquals(new HashSet(Arrays.asList(pair1)), innerFilterCriteria1.builder().scope(slb1).build() - .getJoinCondition()); + .getWhereExistsCondition()); LogicalBlock slb2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability/serving-antennaModule") .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()) .build()); @@ -1253,6 +1355,6 @@ class DtoToJooqTest { Pair pair2 = new ImmutablePair<>("teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", field( "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\"" + "=" + "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"id\"")); Assertions.assertEquals(new HashSet(Arrays.asList(pair2)), innerFilterCriteria2.builder().scope(slb2).build() - .getJoinCondition()); + .getWhereExistsCondition()); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java index fd6731d..06cd680 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java @@ -20,6 +20,7 @@ */ package org.oran.smo.teiv.exposure.teivpath.refiner; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; import static org.oran.smo.teiv.utils.TeivConstants.ITEM; import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD; @@ -100,7 +101,7 @@ class BasePathRefinementTest { expectedScopeObject.setDataType(DataType.PRIMITIVE); expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY); expectedTargets.get(0).setAllParamQueried(true); - Assertions.assertEquals(expectedFilterCriteria, filterCriteria); + assertEquals(expectedFilterCriteria, filterCriteria); } @Test @@ -126,7 +127,7 @@ class BasePathRefinementTest { expectedScopeObject.setDataType(DataType.PRIMITIVE); expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY); expectedTargets.get(0).setAllParamQueried(false); - Assertions.assertEquals(expectedFilterCriteria, filterCriteria); + assertEquals(expectedFilterCriteria, filterCriteria); } @Test @@ -138,7 +139,7 @@ class BasePathRefinementTest { ScopeObject scopeObjectResult1 = ScopeObject.builder(WILDCARD + "/managed-by-managedElement").container( ContainerType.ID).innerContainer(List.of()).resolverDataType(ResolverDataType.STRING).queryFunction( QueryFunction.EQ).leaf(null).parameter("me1").build(); - Assertions.assertEquals(scopeObjectResult1, ((ScopeLogicalBlock) logicalBlock1).getScopeObject()); + assertEquals(scopeObjectResult1, ((ScopeLogicalBlock) logicalBlock1).getScopeObject()); LogicalBlock logicalBlock2 = scopeResolver.process(ODU_FUNCTION, "/managed-by-managedElement"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock2).build())); basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) logicalBlock2, "RAN"); @@ -146,7 +147,7 @@ class BasePathRefinementTest { ScopeObject scopeObjectResult2 = ScopeObject.builder(ODU_FUNCTION + "/managed-by-managedElement") .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).resolverDataType( ResolverDataType.NOT_NULL).queryFunction(QueryFunction.NOT_NULL).build(); - Assertions.assertEquals(scopeObjectResult2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + assertEquals(scopeObjectResult2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); LogicalBlock logicalBlock3 = scopeResolver.process(null, "/ODUFUNCTION_PROVIDES_NRCELLDU"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock3).build())); Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement @@ -156,7 +157,7 @@ class BasePathRefinementTest { basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria); ScopeObject scopeObjectResult4 = ScopeObject.builder(WILDCARD + "/" + ODU_FUNCTION).container(ContainerType.ID) .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.EQ).parameter("odu1").build(); - Assertions.assertEquals(scopeObjectResult4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject()); + assertEquals(scopeObjectResult4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject()); try (MockedStatic utilities = Mockito.mockStatic(SchemaRegistry.class)) { utilities.when(() -> SchemaRegistry.getEntityNamesByDomain("RAN")).thenReturn(Arrays.asList( "RelationAndEntity")); @@ -181,7 +182,7 @@ class BasePathRefinementTest { ScopeObject scopeObjectResult9 = ScopeObject.builder("*/NRCellDU").container(ContainerType.ATTRIBUTES) .resolverDataType(ResolverDataType.INTEGER).queryFunction(QueryFunction.EQ).leaf("nCI").parameter("12") .build(); - Assertions.assertEquals(scopeObjectResult9, ((ScopeLogicalBlock) logicalBlock9).getScopeObject()); + assertEquals(scopeObjectResult9, ((ScopeLogicalBlock) logicalBlock9).getScopeObject()); LogicalBlock logicalBlock10 = scopeResolver.process(null, "/NRCellDU[@nCI=12]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock10).build())); Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement @@ -215,8 +216,8 @@ class BasePathRefinementTest { resultTargetObjects.add(targetObjectResult); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects, filterCriteria.getTargets()); - Assertions.assertEquals(scopeResult1, filterCriteria.getScope()); + assertEquals(resultTargetObjects, filterCriteria.getTargets()); + assertEquals(scopeResult1, filterCriteria.getScope()); } @Test @@ -234,7 +235,7 @@ class BasePathRefinementTest { basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria.getScope(), "RAN"); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects3_1, filterCriteria.getTargets()); + assertEquals(resultTargetObjects3_1, filterCriteria.getTargets()); } @Test @@ -254,7 +255,7 @@ class BasePathRefinementTest { resultTargetObjects4_1.add(targetObjectResult4_2); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects4_1, filterCriteria.getTargets()); + assertEquals(resultTargetObjects4_1, filterCriteria.getTargets()); } @Test @@ -307,8 +308,8 @@ class BasePathRefinementTest { resultTargetObjects5_1.add(targetObjectResult5_2); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects5_1, filterCriteria.getTargets()); - Assertions.assertEquals(or1, filterCriteria.getScope()); + assertEquals(resultTargetObjects5_1, filterCriteria.getTargets()); + assertEquals(or1, filterCriteria.getScope()); } @Test @@ -328,8 +329,8 @@ class BasePathRefinementTest { "cellLocalId").queryFunction(QueryFunction.EQ).parameter("156").resolverDataType(ResolverDataType.INTEGER) .build(); LogicalBlock logicalBlockResult6_1 = new ScopeLogicalBlock(scopeObjectResult6_1); - Assertions.assertEquals(resultTargetObjects6_1, filterCriteria.getTargets()); - Assertions.assertEquals(logicalBlockResult6_1, filterCriteria.getScope()); + assertEquals(resultTargetObjects6_1, filterCriteria.getTargets()); + assertEquals(logicalBlockResult6_1, filterCriteria.getScope()); } @Test @@ -396,8 +397,8 @@ class BasePathRefinementTest { resultTargetObjects9_1.add(targetObjectResult9_2); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets()); - Assertions.assertEquals(or, filterCriteria.getScope()); + assertEquals(resultTargetObjects9_1, filterCriteria.getTargets()); + assertEquals(or, filterCriteria.getScope()); } @Test @@ -472,8 +473,8 @@ class BasePathRefinementTest { resultTargetObjects11_1.add(targetObjectResult11_2); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects11_1, filterCriteria.getTargets()); - Assertions.assertEquals(or1, filterCriteria.getScope()); + assertEquals(resultTargetObjects11_1, filterCriteria.getTargets()); + assertEquals(or1, filterCriteria.getScope()); } @Test @@ -557,8 +558,8 @@ class BasePathRefinementTest { basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets()); - Assertions.assertEquals(or1, filterCriteria2.getScope()); + assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets()); + assertEquals(or1, filterCriteria2.getScope()); } @Test @@ -575,7 +576,7 @@ class BasePathRefinementTest { .of(filterCriteria)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets()); + assertEquals(resultTargetObjects9_1, filterCriteria.getTargets()); } @Test @@ -589,7 +590,7 @@ class BasePathRefinementTest { .of(filterCriteria)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP); - Assertions.assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope()); + assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope()); } @Test @@ -630,8 +631,8 @@ class BasePathRefinementTest { basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "RAN", FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP); - Assertions.assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets()); - Assertions.assertEquals(or1, filterCriteria2.getScope()); + assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets()); + assertEquals(or1, filterCriteria2.getScope()); } @Test @@ -701,8 +702,8 @@ class BasePathRefinementTest { basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "REL_OAM_RAN", FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP); - Assertions.assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets()); - Assertions.assertEquals(or1, filterCriteria2.getScope()); + assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets()); + assertEquals(or1, filterCriteria2.getScope()); } @Test @@ -720,15 +721,15 @@ class BasePathRefinementTest { utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "ODUFUNCTION_PROVIDES_NRCELLDU")); basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria); - Assertions.assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets() - .get(0).getTopologyObjectType()); - Assertions.assertEquals(TopologyObjectType.ENTITY, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList() - .get(0).getScope()).getScopeObject().getTopologyObjectType()); + assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets().get(0) + .getTopologyObjectType()); + assertEquals(TopologyObjectType.ENTITY, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList().get(0) + .getScope()).getScopeObject().getTopologyObjectType()); filterCriteria.getFilterCriteriaList().get(0).setScope(EmptyLogicalBlock.getInstance()); targetObject.setTopologyObjectType(TopologyObjectType.UNDEFINED); basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria); - Assertions.assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets() - .get(0).getTopologyObjectType()); + assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets().get(0) + .getTopologyObjectType()); } } @@ -747,10 +748,10 @@ class BasePathRefinementTest { utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "ODUFUNCTION_PROVIDES_NRCELLDU")); basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria); - Assertions.assertEquals(TopologyObjectType.RELATION, filterCriteria.getFilterCriteriaList().get(0).getTargets() - .get(0).getTopologyObjectType()); - Assertions.assertEquals(TopologyObjectType.RELATION, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList() - .get(0).getScope()).getScopeObject().getTopologyObjectType()); + assertEquals(TopologyObjectType.RELATION, filterCriteria.getFilterCriteriaList().get(0).getTargets().get(0) + .getTopologyObjectType()); + assertEquals(TopologyObjectType.RELATION, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList().get(0) + .getScope()).getScopeObject().getTopologyObjectType()); } } @@ -891,7 +892,7 @@ class BasePathRefinementTest { LogicalBlock logicalBlock1 = scopeResolver.process(ODU_FUNCTION, "/attributes[@gNBId=21]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock1).build())); basePathRefinement.validateScopeParametersDataType(filterCriteria); - Assertions.assertEquals(DataType.BIGINT, ((ScopeLogicalBlock) logicalBlock1).getScopeObject().getDataType()); + assertEquals(DataType.BIGINT, ((ScopeLogicalBlock) logicalBlock1).getScopeObject().getDataType()); // error reason: for gNBId attribute string value is not accepted LogicalBlock logicalBlock2 = scopeResolver.process(ODU_FUNCTION, "/attributes[@gNBId='abc']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock2).build())); @@ -909,7 +910,7 @@ class BasePathRefinementTest { .resolverDataType(ResolverDataType.STRING).build()); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(scopeLogicalBlock1).build())); basePathRefinement.validateScopeParametersDataType(filterCriteria); - Assertions.assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType()); + assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType()); // error reason: scopeFilter: /managed-by-managedElement[@id=1] -> ResolverDataType is INTEGER, but in case of id it should be STRING ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).innerContainer( new ArrayList<>(Arrays.asList("managed-by-managedElement"))).container(ContainerType.ID).topologyObjectType( @@ -930,7 +931,7 @@ class BasePathRefinementTest { LogicalBlock logicalBlock4 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id='odu1']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock4).build())); basePathRefinement.validateScopeParametersDataType(filterCriteria); - Assertions.assertEquals(DataType.PRIMITIVE, ((ScopeLogicalBlock) logicalBlock4).getScopeObject().getDataType()); + assertEquals(DataType.PRIMITIVE, ((ScopeLogicalBlock) logicalBlock4).getScopeObject().getDataType()); // error reason: for id INTEGER ResolverDataType is not accepted LogicalBlock logicalBlock5 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id=1]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock5).build())); @@ -945,7 +946,7 @@ class BasePathRefinementTest { LogicalBlock logicalBlock7 = scopeResolver.process(ODU_FUNCTION, "/sourceIds[@items = 'someSourceId']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock7).build())); basePathRefinement.validateScopeParametersDataType(filterCriteria); - Assertions.assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType()); + assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType()); // error reason: for sourceIds container INTEGER dataType is not accepted LogicalBlock logicalBlock8 = scopeResolver.process(ODU_FUNCTION, "/sourceIds[@items = 1]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock8).build())); @@ -1079,8 +1080,8 @@ class BasePathRefinementTest { targetObject3)).scope(fc2or1).build(); InnerFilterCriteria innerFilterCriteria3 = InnerFilterCriteria.builder().targets(List.of(targetObject4)).scope( fc3and1).build(); - Assertions.assertEquals(Set.of(innerFilterCriteria1, innerFilterCriteria2, innerFilterCriteria3), new HashSet<>( - filterCriteria.getFilterCriteriaList())); + assertEquals(Set.of(innerFilterCriteria1, innerFilterCriteria2, innerFilterCriteria3), new HashSet<>(filterCriteria + .getFilterCriteriaList())); } @Test @@ -1107,7 +1108,7 @@ class BasePathRefinementTest { scopeLogicalBlock6.setValid(false); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(orLogicalBlock1).build())); basePathRefinement.validateQuery(filterCriteria); - Assertions.assertEquals(andLogicalBlock2, filterCriteria.getFilterCriteriaList().get(0).getScope()); + assertEquals(andLogicalBlock2, filterCriteria.getFilterCriteriaList().get(0).getScope()); ScopeLogicalBlock scopeLogicalBlock2_1 = new ScopeLogicalBlock(null); ScopeLogicalBlock scopeLogicalBlock2_2 = new ScopeLogicalBlock(null); AndOrLogicalBlock andLogicalBlock2_1 = new AndLogicalBlock(); @@ -1149,10 +1150,10 @@ class BasePathRefinementTest { orLogicalBlock.setChildren(Arrays.asList(orLogicalBlockChild1, orLogicalBlockChild2)); basePathRefinement.runOnTree(orLogicalBlock, filterCriteria.getDomain(), (ScopeLogicalBlock lb, String domain) -> lb .getScopeObject().setParameter("0")); - Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock1).getScopeObject().getParameter()); - Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock2).getScopeObject().getParameter()); - Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock3).getScopeObject().getParameter()); - Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock4).getScopeObject().getParameter()); + assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock1).getScopeObject().getParameter()); + assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock2).getScopeObject().getParameter()); + assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock3).getScopeObject().getParameter()); + assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock4).getScopeObject().getParameter()); } @Test @@ -1165,8 +1166,8 @@ class BasePathRefinementTest { TeivPathException thrown = Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.refine( filterCriteria)); - Assertions.assertEquals("Querying any thing other than id is not supported in case of association of relation", - thrown.getDetails()); + assertEquals("Querying any thing other than id is not supported in case of association of relation", thrown + .getDetails()); } @@ -1199,7 +1200,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria); - Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU", "/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]"); @@ -1221,7 +1222,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria2); - Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); LogicalBlock logicalBlock3 = scopeResolver.resolve("NRCellDU", "/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]"); @@ -1243,7 +1244,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria3); - Assertions.assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject()); + assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject()); LogicalBlock logicalBlock4 = scopeResolver.resolve("NRCellDU", "/serving-antennaModule/attributes[@antennaModelNumber='5']"); @@ -1265,7 +1266,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria4); - Assertions.assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject()); + assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject()); LogicalBlock logicalBlock5 = scopeResolver.resolve(null, "/serving-antennaModule/attributes[@antennaModelNumber='5']"); @@ -1286,7 +1287,7 @@ class BasePathRefinementTest { expectedScopeObject5.setDataType(DataType.PRIMITIVE); basePathRefinement.refine(filterCriteria5); - Assertions.assertEquals(new ScopeLogicalBlock(expectedScopeObject5), filterCriteria5.getFilterCriteriaList().get(0) + assertEquals(new ScopeLogicalBlock(expectedScopeObject5), filterCriteria5.getFilterCriteriaList().get(0) .getScope()); } @@ -1314,7 +1315,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria); - Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU", "/serving-antennaModule/sourceIds[contains(@item,'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1')]"); @@ -1337,7 +1338,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria2); - Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); } @@ -1371,7 +1372,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria); - Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU", "/serving-antennaModule/classifiers[contains(@item,'app-module:Rural')]"); @@ -1393,7 +1394,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria2); - Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); } @Test @@ -1418,7 +1419,7 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria); - Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); } @@ -1444,6 +1445,6 @@ class BasePathRefinementTest { basePathRefinement.refine(filterCriteria); - Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java b/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java index d29dd26..46838e9 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java +++ b/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java @@ -36,12 +36,11 @@ import org.jooq.impl.DSL; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.oran.smo.teiv.exposure.audit.LoggerHandler; -import org.oran.smo.teiv.groups.utils.GroupCreationRequestFilter; +import org.oran.smo.teiv.groups.rest.controller.GroupCreationRequestFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; import com.fasterxml.jackson.databind.ObjectMapper; @@ -64,7 +63,9 @@ public abstract class TopologyGroupsApiBase extends TopologyApiBase { private ApplicationContext context; @Autowired private MockMvc mockMvc; - @MockBean + @Autowired + private ObjectMapper objectMapper; + @Autowired private LoggerHandler loggerHandler; @BeforeAll @@ -82,7 +83,7 @@ public abstract class TopologyGroupsApiBase extends TopologyApiBase { @BeforeEach public void setup() { - GroupCreationRequestFilter groupCreationRequestFilter = new GroupCreationRequestFilter(loggerHandler); + GroupCreationRequestFilter groupCreationRequestFilter = new GroupCreationRequestFilter(loggerHandler, objectMapper); mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) context).addFilter(groupCreationRequestFilter, "/topology-inventory/v1alpha11/groups").build(); diff --git a/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java index 5c4c40e..d265c55 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java @@ -43,6 +43,7 @@ import org.jooq.Result; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.mockito.MockedStatic; @@ -75,6 +76,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; @Configuration +@TestInstance(TestInstance.Lifecycle.PER_METHOD) @SpringBootTest @ActiveProfiles({ "test", "ingestion" }) class IngestionOperationValidatorTest { diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java index cf39d3e..74ff01a 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java @@ -111,7 +111,7 @@ class CreateTopologyProcessorTest { verify(teivDbService, times(1)).execute(anyList()); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), anyString()); } @@ -134,7 +134,7 @@ class CreateTopologyProcessorTest { verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), anyString()); } @@ -157,7 +157,7 @@ class CreateTopologyProcessorTest { verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), anyString()); } @@ -172,7 +172,7 @@ class CreateTopologyProcessorTest { verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), anyString()); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java index ce781a4..6001302 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java @@ -111,7 +111,7 @@ class DeleteTopologyProcessorTest { verify(teivDbService, times(1)).execute(anyList()); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), anyString()); } @@ -126,7 +126,7 @@ class DeleteTopologyProcessorTest { verify(metrics, times(1)).incrementNumUnsuccessfullyParsedDeleteCloudEvents(); verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), anyString()); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java index 3b7e322..5340ec6 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java @@ -111,7 +111,7 @@ class MergeTopologyProcessorTest { verify(teivDbService, times(1)).execute(anyList()); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), anyString()); } @@ -134,7 +134,7 @@ class MergeTopologyProcessorTest { verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), anyString()); } @@ -157,7 +157,7 @@ class MergeTopologyProcessorTest { verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), anyString()); } @@ -171,7 +171,7 @@ class MergeTopologyProcessorTest { verify(metrics, times(1)).incrementNumUnsuccessfullyParsedMergeCloudEvents(); verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), anyString()); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java index 92ea516..aede674 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java @@ -109,7 +109,7 @@ class SourceEntityDeleteTopologyProcessorTest { verify(metrics, times(1)).incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents(); verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), anyString(), anyString()); } } @@ -128,7 +128,7 @@ class SourceEntityDeleteTopologyProcessorTest { verify(metrics, times(1)).incrementNumReceivedCloudEventNotSupported(); verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), anyString(), anyString()); } } @@ -153,7 +153,7 @@ class SourceEntityDeleteTopologyProcessorTest { verify(metrics, times(1)).recordCloudEventSourceEntityDeleteParseTime(anyLong()); verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), + verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), anyString(), any()); } } @@ -203,7 +203,7 @@ class SourceEntityDeleteTopologyProcessorTest { verifyNoMoreInteractions(metrics); - verify(auditLogger).auditLog(eq(ExecutionStatus.SUCCESS), eq("source-entity-delete"), any(CloudEvent.class), + verify(auditLogger).logSuccess(eq(ExecutionStatus.SUCCESS), eq("source-entity-delete"), any(CloudEvent.class), anyString(), any()); verifyNoMoreInteractions(metrics); } catch (IllegalAccessException e) { diff --git a/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java b/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java index 8f7e30f..4cad968 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java @@ -25,6 +25,7 @@ import static org.oran.smo.teiv.schema.RelationshipDataLocation.A_SIDE; import static org.oran.smo.teiv.schema.RelationshipDataLocation.B_SIDE; import static org.oran.smo.teiv.schema.RelationshipDataLocation.RELATION; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_DOMAIN; +import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_MODULE; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_MODULE; import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @@ -124,10 +125,20 @@ class SchemaRegistryTest { @Test void testGetEntityTypeByDomainAndName() throws SchemaRegistryException { //when - List entityTypes = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "ODUFunction"); + EntityType entityType = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "ODUFunction"); + //then + assertEquals("ODUFunction", entityType.getName()); + assertEquals("RAN", entityType.getModule().getDomain()); + + //when + entityType = SchemaRegistry.getEntityTypeByDomainAndName("TEIV", "ODUFunction"); + //then + assertEquals("ODUFunction", entityType.getName()); + assertEquals("RAN", entityType.getModule().getDomain()); + + //when + entityType = SchemaRegistry.getEntityTypeByDomainAndName("REL_OAM_RAN", "ODUFunction"); //then - assertEquals(1, entityTypes.size()); - EntityType entityType = entityTypes.get(0); assertEquals("ODUFunction", entityType.getName()); assertEquals("RAN", entityType.getModule().getDomain()); @@ -145,8 +156,8 @@ class SchemaRegistryTest { assertEquals("RAN", entityType.getModule().getDomain()); final SchemaRegistryException exception = assertThrows(SchemaRegistryException.class, () -> SchemaRegistry - .getEntityTypeByDomainAndName("o-ran-smo-teiv-oam", "ODUFunction")); - assertEquals(ENTITY_NOT_FOUND_IN_DOMAIN, exception.getErrorCode()); + .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ODUFunction")); + assertEquals(ENTITY_NOT_FOUND_IN_MODULE, exception.getErrorCode()); } @Test @@ -280,15 +291,38 @@ class SchemaRegistryTest { Association expectedASideAssociation = new Association("managed-ocucpFunction", 1, 1); Association expectedBSideAssociation = new Association("managed-by-managedElement", 0, 9223372036854775807L); //when - List relationTypes = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", + RelationType relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); //then - assertEquals(1, relationTypes.size()); - RelationType managedElementManagesOcucpfunction = relationTypes.get(0); - assertEquals(expectedASideAssociation.toString(), managedElementManagesOcucpfunction.getASideAssociation() - .toString()); - assertEquals(expectedBSideAssociation.toString(), managedElementManagesOcucpfunction.getBSideAssociation() - .toString()); + assertEquals(expectedASideAssociation.toString(), relationType.getASideAssociation().toString()); + assertEquals(expectedBSideAssociation.toString(), relationType.getBSideAssociation().toString()); + + //when + relationType = SchemaRegistry.getRelationTypeByDomainAndName("TEIV", "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); + //then + assertEquals(expectedASideAssociation.toString(), relationType.getASideAssociation().toString()); + assertEquals(expectedBSideAssociation.toString(), relationType.getBSideAssociation().toString()); + + //given + Association expectedASideAssociation1 = new Association("provided-nrCellDu", 1, 1); + Association expectedBSideAssociation1 = new Association("provided-by-oduFunction", 0, 9223372036854775807L); + //when + RelationType relationType1 = SchemaRegistry.getRelationTypeByDomainAndName("RAN", "ODUFUNCTION_PROVIDES_NRCELLDU"); + //then + assertEquals(expectedASideAssociation1.toString(), relationType1.getASideAssociation().toString()); + assertEquals(expectedBSideAssociation1.toString(), relationType1.getBSideAssociation().toString()); + + //when + relationType1 = SchemaRegistry.getRelationTypeByDomainAndName("TEIV", "ODUFUNCTION_PROVIDES_NRCELLDU"); + //then + assertEquals(expectedASideAssociation1.toString(), relationType1.getASideAssociation().toString()); + assertEquals(expectedBSideAssociation1.toString(), relationType1.getBSideAssociation().toString()); + + //when + relationType1 = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", "ODUFUNCTION_PROVIDES_NRCELLDU"); + //then + assertEquals(expectedASideAssociation1.toString(), relationType1.getASideAssociation().toString()); + assertEquals(expectedBSideAssociation1.toString(), relationType1.getBSideAssociation().toString()); final SchemaRegistryException exception = assertThrows(SchemaRegistryException.class, () -> SchemaRegistry .getRelationTypeByDomainAndName("OAM", "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION")); diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java index 7431b90..efcb35a 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java @@ -24,13 +24,18 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.nullable; import static org.oran.smo.teiv.utils.JooqTypeConverter.jsonbToMap; +import static org.oran.smo.teiv.utils.OperationResultParser.fromOperationResults; import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; import static org.oran.smo.teiv.utils.TeivTestConstants.KAFKA_RETRY_INTERVAL_10_MS; import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_HOST; import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_PORT; import java.io.File; +import java.io.IOException; import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZoneOffset; @@ -64,16 +69,26 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; import org.oran.smo.teiv.config.KafkaConfig; import org.oran.smo.teiv.db.TestPostgresqlContainer; +import org.oran.smo.teiv.exception.YangException; import org.oran.smo.teiv.listener.ListenerStarter; +import org.oran.smo.teiv.listener.audit.ExecutionStatus; +import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; +import org.oran.smo.teiv.schema.MockSchemaLoader; +import org.oran.smo.teiv.schema.SchemaLoader; +import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.service.kafka.KafkaTopicService; +import org.oran.smo.teiv.service.models.OperationResult; import org.oran.smo.teiv.startup.AppInit; import org.oran.smo.teiv.utils.CloudEventTestUtil; import org.oran.smo.teiv.utils.EndToEndExpectedResults; import org.oran.smo.teiv.utils.KafkaTestExecutionListener; +import org.oran.smo.teiv.utils.YangModelValidationTestUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.kafka.config.KafkaListenerEndpointRegistry; @@ -87,6 +102,7 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.testcontainers.shaded.org.checkerframework.checker.nullness.qual.Nullable; @EmbeddedKafka @@ -134,6 +150,9 @@ public class EndToEndDbTest { @Autowired private DSLContext writeDataDslContext; + @MockitoSpyBean + IngestionAuditLogger auditLogger; + @DynamicPropertySource static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.datasource.read.jdbc-url", () -> postgresqlContainer.getJdbcUrl()); @@ -151,13 +170,16 @@ public class EndToEndDbTest { private OffsetDateTime testStartTime; @BeforeAll - static void beforeAll() { + static void beforeAll() throws SchemaLoaderException { TestPostgresqlContainer.loadData(); TestPostgresqlContainer.loadIngestionTestData(); + TestPostgresqlContainer.loadEndToEndTestData(); + SchemaLoader mockSchemaLoader = new MockSchemaLoader(); + mockSchemaLoader.loadSchemaRegistry(); } @BeforeEach - void setupEach() { + void setupEach() throws IOException, YangException { TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA), writeDataDslContext); appInit = new AppInit(dependentServiceAvailabilityKafka, kafkaTopicService, listenerStarter); appInit.startUpHandler(); @@ -165,6 +187,7 @@ public class EndToEndDbTest { new StringSerializer(), new CloudEventSerializer()); producer = factory.createProducer(); testStartTime = OffsetDateTime.now(ZoneOffset.UTC); + YangModelValidationTestUtil.mockLoadAndValidateModels(); } @AfterEach @@ -268,8 +291,7 @@ public class EndToEndDbTest { testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(CREATE_INFERRED_ENTITIES); - - validateWithTimeout(25, () -> { + validateWithTimeout(30, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_INFERRED_ENTITIES); assertDbContainsExpectedValues(expected); validateReceivedCloudEventMetrics(5, 3, 0, 0); @@ -299,6 +321,23 @@ public class EndToEndDbTest { EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_ONE_TO_ONE_PATH); assertDbNotContainsExpectedValues(notExpected); validateReceivedCloudEventMetrics(6, 3, 2, 0); + List>> expectedItems = List.of(Map.of( + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", List.of( + "relation_11", "relation_12")), Map.of( + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt", + List.of("ManagedElement_21"))); + List operationResults = List.of(OperationResult.builder().id("relation_11").type( + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU").module("o-ran-smo-teiv-rel-oam-ran-test") + .build(), OperationResult.builder().id("ManagedElement_21").type( + "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt").module( + "o-ran-smo-teiv-oam-test").build(), OperationResult.builder().id("relation_12").type( + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU").module( + "o-ran-smo-teiv-rel-oam-ran-test").build()); + ArgumentCaptor> auditLogCaptor = ArgumentCaptor.forClass(List.class); + Mockito.verify(auditLogger, Mockito.atLeastOnce()).logSuccess(eq(ExecutionStatus.SUCCESS), eq("delete"), any( + CloudEvent.class), nullable(String.class), auditLogCaptor.capture()); + List actualResponse = auditLogCaptor.getValue(); + assertEquals(fromOperationResults(operationResults), actualResponse); }); testStartTime = OffsetDateTime.now(ZoneOffset.UTC); @@ -557,7 +596,7 @@ public class EndToEndDbTest { } private void validateWithTimeout(int timeout, Runnable runnable) { - Awaitility.await().atMost(timeout, TimeUnit.SECONDS).pollDelay(Duration.ofSeconds(5)).untilAsserted(() -> { + Awaitility.await().atMost(timeout, TimeUnit.SECONDS).pollDelay(Duration.ofSeconds(10)).untilAsserted(() -> { try { runnable.run(); } catch (AssertionError e) { diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java index a5f7cbb..6307714 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java @@ -38,6 +38,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; import javax.sql.DataSource; @@ -57,7 +58,6 @@ import org.oran.smo.teiv.service.models.OperationResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ActiveProfiles; @@ -83,6 +83,7 @@ import org.oran.smo.teiv.service.cloudevent.data.Relationship; import org.oran.smo.teiv.startup.SchemaHandler; import org.oran.smo.teiv.utils.CloudEventTestUtil; import org.oran.smo.teiv.utils.JooqTypeConverter; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @Configuration @SpringBootTest @@ -106,7 +107,7 @@ class TeivDbOperationResultsTest { @Autowired CloudEventParser cloudEventParser; - @MockBean + @MockitoBean private SchemaHandler schemaHandler; @BeforeAll @@ -119,6 +120,7 @@ class TeivDbOperationResultsTest { teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(), new RelationshipMergeValidator(), new TeivMetadataResolver()); TestPostgresqlContainer.loadIngestionTestData(); + TestPostgresqlContainer.loadEndToEndTestData(); PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); } @@ -130,7 +132,7 @@ class TeivDbOperationResultsTest { entityTypeMe = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"); entityTypeORU = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ORUFunction"); entityTypeAntennMod = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModule"); - entityTypeAntennModLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + entityTypeAntennModLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); entityTypeAntennCap = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapability"); relTypeMeManagesORU = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", @@ -138,7 +140,7 @@ class TeivDbOperationResultsTest { relTypeantennServesAntennCap = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); relTypeAntennModRealisedByAntennaModLongName = SchemaRegistry.getRelationTypeByModuleAndName( - "o-ran-smo-teiv-equipment", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); + "o-ran-smo-teiv-equipment-test", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); } catch (SchemaRegistryException e) { throw new RuntimeException(e); } @@ -179,8 +181,8 @@ class TeivDbOperationResultsTest { .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "managed_element_entity_id1"); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("managed_element_entity_id1").type( - "ManagedElement").category(ENTITY_CATEGORY).build()), + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("managed_element_entity_id1") + .type("ManagedElement").category(ENTITY_CATEGORY).build()), "The list should contain the delete operation result with id: 'managed_element_entity_id1'"); // Delete operation with the same EIID - expected to fail @@ -194,14 +196,14 @@ class TeivDbOperationResultsTest { void testDeleteOneToOneByRelationId() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - EntityType entityTypeMeLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + EntityType entityTypeMeLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam-test", "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt"); teivDbOperations.merge(dslContext, entityTypeMeLongName, managedElementEntity); Map nrCellDuEntity = new HashMap<>(); nrCellDuEntity.put("id", "nrcelldu-id1"); nrCellDuEntity.put("020335B0F627C169E24167748C38FE756FB34AE2", 1); - EntityType entityTypeNrCellDuLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + EntityType entityTypeNrCellDuLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"); teivDbOperations.merge(dslContext, entityTypeNrCellDuLongName, nrCellDuEntity); @@ -215,25 +217,25 @@ class TeivDbOperationResultsTest { // Delete operation for aSide - expected to succeed Optional deleteASideResultMatch = teivDbOperations.deleteRelationFromEntityTableByRelationId( - dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran-test", "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")); assertTrue(deleteASideResultMatch.isPresent(), "Delete operation should return a present Optional"); - assertEquals(OperationResult.builder().id("eiid1").type("ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU") - .category(RELATIONSHIP_CATEGORY).build(), deleteASideResultMatch.get(), - "The delete operation result should be present for: 'eiid1'"); + assertTrue(containsWithPartialMatch(deleteASideResultMatch.stream().collect(Collectors.toList()), OperationResult + .builder().id("eiid1").type("ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU").category( + RELATIONSHIP_CATEGORY).build()), "The delete operation result should be present for: 'eiid1'"); // Delete operation with the same EIID - expected to fail Optional deleteResultNoMatch = teivDbOperations.deleteRelationFromEntityTableByRelationId( - dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran-test", "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); Result nrcellduRows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "teiv_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\""); + "teiv_data.\"F93C2CA075353668A76B4718E07B741ACCD83641\""); Result managedElementRows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "teiv_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\""); + "teiv_data.\"C9475FE40C02BEB41F720B4284A856F2CF49E1F3\""); assertEquals("me-id1", managedElementRows.get(0).get("id")); assertEquals("nrcelldu-id1", nrcellduRows.get(0).get("id")); assertNull(managedElementRows.get(0).get("REL_FK_used-nrCellDu")); @@ -267,9 +269,9 @@ class TeivDbOperationResultsTest { "MANAGEDELEMENT_MANAGES_ORUFUNCTION")); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid1").type( - "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()), - "The list should contain the delete operation result with id: 'eiid1'"); + assertTrue(containsWithPartialMatch(deleteResultMatch, (OperationResult.builder().id("eiid1").type( + "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).module("o-ran-smo-teiv-rel-oam-ran") + .build())), "The list should contain the delete operation result with id: 'eiid1'"); // Delete operation with the same entity ID - expected to return an empty list List deleteResultNoMatch = teivDbOperations.deleteRelationshipByManySideEntityId(dslContext, @@ -315,16 +317,17 @@ class TeivDbOperationResultsTest { // Check if all expected IDs are present in the deletion result assertEquals(4, deleteResultMatch.size(), "Delete operation should match expected size"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("me-id1").type("ManagedElement").category( - ENTITY_CATEGORY).build()), "The list should contain the delete operation result with id: 'me-id1'"); + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("me-id1").type("ManagedElement") + .category(ENTITY_CATEGORY).build()), + "The list should contain the delete operation result with id: 'me-id1'"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid1").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("eiid1").type( "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()), "The list should contain the delete operation result with id: 'eiid1'"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid2").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("eiid2").type( "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()), "The list should contain the delete operation result with id: 'eiid2'"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid3").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("eiid3").type( "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()), "The list should contain the delete operation result with id: 'eiid3'"); @@ -387,8 +390,9 @@ class TeivDbOperationResultsTest { Optional deleteResultMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, relType, "rel_id1"); assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional"); - assertEquals(OperationResult.builder().id("rel_id1").type("ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category( - RELATIONSHIP_CATEGORY).build(), deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'"); + assertTrue(containsWithPartialMatch(deleteResultMatch.stream().collect(Collectors.toList()), OperationResult + .builder().id("rel_id1").type("ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(RELATIONSHIP_CATEGORY) + .build()), "Deleted relationship ID should match 'rel_id1'"); // Test deletion of the same relationship ID again (expected failure) Optional deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, @@ -441,11 +445,11 @@ class TeivDbOperationResultsTest { List deleteResultMatch = teivDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, "antennamodule_id1", "aSide_AntennaModule", "bSide_AntennaCapability"); assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id1").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id1").type( "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(RELATIONSHIP_CATEGORY).build()), "The list should contain the delete operation result with id: 'rel_id1'"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id2").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id2").type( "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(RELATIONSHIP_CATEGORY).build()), "The list should contain the delete operation result with id: 'rel_id2'"); @@ -493,13 +497,13 @@ class TeivDbOperationResultsTest { teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel2); Result row1 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "teiv_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\""); + "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\""); assertEquals(2, row1.size()); Result row2 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "teiv_data.\"53089669D370B15C78B7E8376D434921D1C94240\""); + "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\""); assertEquals(2, row2.size()); - RelationType antennaRelType1 = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment", + RelationType antennaRelType1 = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); // Test deletion of a relationship by ID (expected success) @@ -507,9 +511,9 @@ class TeivDbOperationResultsTest { antennaRelType1, "rel_id1"); assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional"); - assertEquals(OperationResult.builder().id("rel_id1").type( - "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(RELATIONSHIP_CATEGORY).build(), - deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'"); + assertTrue(containsWithPartialMatch(deleteResultMatch.stream().collect(Collectors.toList()), OperationResult + .builder().id("rel_id1").type("ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category( + RELATIONSHIP_CATEGORY).build()), "Deleted relationship ID should match 'rel_id1'"); // Test deletion of the same relationship ID again (expected failure) Optional deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, @@ -554,12 +558,12 @@ class TeivDbOperationResultsTest { teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel2); assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "teiv_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"").size(), "Expected two AntennaModule records"); + "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\"").size(), "Expected two AntennaModule records"); assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "teiv_data.\"53089669D370B15C78B7E8376D434921D1C94240\"").size(), + "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\"").size(), "Expected two ANTENNAMODULE_REALISED_BY_ANTENNAMODULE relations"); - RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment", + RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); // Test deletion of relations by entity ID (expected to delete two relations) @@ -567,11 +571,11 @@ class TeivDbOperationResultsTest { "module_id1", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"); assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id1").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id1").type( "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(RELATIONSHIP_CATEGORY) .build()), "The list should contain the delete operation result with id: 'rel_id1'"); - assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id2").type( + assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id2").type( "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(RELATIONSHIP_CATEGORY) .build()), "The list should contain the delete operation result with id: 'rel_id2'"); @@ -610,37 +614,37 @@ class TeivDbOperationResultsTest { // Entity with One_To_One relationship List deleteEntityResult1 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam-test", "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt"), "ManagedElement_3"); assertEquals(2, deleteEntityResult1.size()); // Entity with One_To_Many relationship List deleteEntityResult2 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), "ODUFunction_1"); assertEquals(2, deleteEntityResult2.size()); // Entity and Many_To_One relationship List deleteEntityResult3 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"), "LTESectorCarrier_id1"); assertEquals(2, deleteEntityResult3.size()); // Entity with Many_To_Many relationship List deleteEntityResult4 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_7"); assertEquals(2, deleteEntityResult4.size()); // Entity with One_To_Many relationship ConnectingSameEntity List deleteEntityResult5 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_5"); assertEquals(2, deleteEntityResult5.size()); // Entity with One_To_One relationship ConnectingSameEntity List deleteEntityResult6 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_1"); assertEquals(2, deleteEntityResult6.size()); } @@ -658,44 +662,44 @@ class TeivDbOperationResultsTest { // Entity with One_To_One relationship List deleteEntityResult1 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_2"); assertEquals(2, deleteEntityResult1.size()); // Entity with One_To_Many relationship List deleteEntityResult2 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_1"); assertEquals(2, deleteEntityResult2.size()); // Entity with Many_To_One relationship List deleteEntityResult3 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id2"); assertEquals(2, deleteEntityResult3.size()); // Entity with Many_To_Many relationship List deleteEntityResult4 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1"); assertEquals(2, deleteEntityResult4.size()); // Entity with One_To_Many relationship ConnectingSameEntity List deleteEntityResult5 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_6"); assertEquals(2, deleteEntityResult5.size()); // Entity with One_To_One relationship ConnectingSameEntity List deleteEntityResult6 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_2"); assertEquals(2, deleteEntityResult6.size()); // Again delete AntennaCapability(id=AntennaCapability_id1) should // return empty result list List deleteEntityResult7 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test", "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1"); assertTrue(deleteEntityResult7.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); @@ -713,7 +717,7 @@ class TeivDbOperationResultsTest { assertEquals(25, mergeResult.size()); // One_To_One Relationship - Relationship oneToOneRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran", + Relationship oneToOneRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran-test", "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", "ManagedElement_USES_NRCELLDU_relation_1", "ManagedElement_3", "NRCellDU_2", List.of()); RelationType oneToOneRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToOneRelationship.getModule(), @@ -723,7 +727,7 @@ class TeivDbOperationResultsTest { assertTrue(deleteOneToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // One_To_Many Relationship - Relationship oneToManyRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran", + Relationship oneToManyRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran-test", "MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN", "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1", "ManagedElement_1", "ODUFunction_1", List.of()); RelationType oneToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToManyRelationship @@ -734,7 +738,7 @@ class TeivDbOperationResultsTest { assertTrue(deleteOneToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // Many_To_One Relationship - Relationship manyToOneRelationship = new Relationship("o-ran-smo-teiv-ran", + Relationship manyToOneRelationship = new Relationship("o-ran-smo-teiv-ran-test", "LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY", "LTESECTORCARRIER_USES_ANTENNACAPABILITY_relation_1", "LTESectorCarrier_id1", "AntennaCapability_id2", List .of()); @@ -746,7 +750,7 @@ class TeivDbOperationResultsTest { assertTrue(deleteManyToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // Many_To_Many Relationship - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran-test", "ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1", "AntennaModule_7", "AntennaCapability_id1", List.of()); RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToManyRelationship @@ -756,7 +760,7 @@ class TeivDbOperationResultsTest { assertTrue(deleteManyToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // One_To_One Relationship ConnectingSameEntity - Relationship connectingSameEntityOneToOneRelationship = new Relationship("o-ran-smo-teiv-equipment", + Relationship connectingSameEntityOneToOneRelationship = new Relationship("o-ran-smo-teiv-equipment-test", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE", "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "AntennaModule_1", "AntennaModule_2", List.of()); RelationType connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName( @@ -768,7 +772,7 @@ class TeivDbOperationResultsTest { "Delete operation should return a present Optional"); // One_To_Many Relationship ConnectingSameEntity - Relationship connectingSameEntityOneToManyRelationship = new Relationship("o-ran-smo-teiv-equipment", + Relationship connectingSameEntityOneToManyRelationship = new Relationship("o-ran-smo-teiv-equipment-test", "ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE", "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "AntennaModule_5", "AntennaModule_6", List.of()); connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName(connectingSameEntityOneToManyRelationship @@ -1193,4 +1197,10 @@ class TeivDbOperationResultsTest { Object::toString).anyMatch(result.getId()::equals); assertTrue(contains); } + + private boolean containsWithPartialMatch(List list, OperationResult op) { + return list.stream().anyMatch(obj -> Objects.equals(obj.getId(), op.getId()) && Objects.equals(obj.getType(), op + .getType()) && Objects.equals(obj.getCategory(), op.getCategory()) && (op.getModule() == null || Objects + .equals(obj.getModule(), op.getModule()))); + } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java b/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java index 69749e7..f9e9730 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java @@ -31,7 +31,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.cloudevents.CloudEvent; import io.cloudevents.SpecVersion; import io.cloudevents.core.builder.CloudEventBuilder; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class CloudEventTestUtil { private CloudEventTestUtil() { @@ -62,6 +64,7 @@ public class CloudEventTestUtil { cloudEventBuilder.withDataSchema(URI.create(rootNode.get("dataschema").asText())); cloudEventBuilder.withData(rootNode.get("data").toString().getBytes()); CloudEvent event = cloudEventBuilder.build(); + log.info("CloudEvent data: {}", rootNode.get("data").toString()); return event; } catch (Exception e) { throw new RuntimeException(e); diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/EndToEndTestUtil.java b/teiv/src/test/java/org/oran/smo/teiv/utils/EndToEndTestUtil.java index c1b6203..c47b699 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/EndToEndTestUtil.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/EndToEndTestUtil.java @@ -1,76 +1,77 @@ -/* - * ============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========================================================= - */ +///* +// * ============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.utils; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.serialization.StringSerializer; -import org.springframework.kafka.core.DefaultKafkaProducerFactory; -import org.springframework.kafka.test.EmbeddedKafkaBroker; -import org.springframework.kafka.test.utils.KafkaTestUtils; -import org.springframework.web.client.RestTemplate; - -import org.oran.smo.teiv.config.KafkaConfig; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.cloudevents.CloudEvent; -import io.cloudevents.kafka.CloudEventSerializer; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class EndToEndTestUtil { - public static void sendEventList(final List events, EmbeddedKafkaBroker embeddedKafkaBroker, - KafkaConfig kafkaConfig) { - Map configs = new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker)); - Producer producer = new DefaultKafkaProducerFactory<>(configs, new StringSerializer(), - new CloudEventSerializer()).createProducer(); - for (CloudEvent event : events) { - ProducerRecord producerRecord = new ProducerRecord(kafkaConfig - .getTopologyIngestion().getTopicName(), null, event); - producer.send(producerRecord); - } - } - - public static String getResponseFromApi(final String uri) { - RestTemplate restTemplate = new RestTemplate(); - return restTemplate.getForObject(uri, String.class); - } - - public static String processApiCall(final String uri) { - log.info("(processApiCall) Sending request for: {}", uri); - String responseBody = getResponseFromApi(uri); - log.info("(processApiCall) Response: {}", responseBody); - return responseBody; - } - - public static Map processNode(JsonNode node) { - ObjectMapper mapper = new ObjectMapper(); - return mapper.convertValue(node, new TypeReference<>() { - }); - } - -} +// +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +//import org.apache.kafka.clients.producer.Producer; +//import org.apache.kafka.clients.producer.ProducerRecord; +//import org.apache.kafka.common.serialization.StringSerializer; +//import org.springframework.kafka.core.DefaultKafkaProducerFactory; +//import org.springframework.kafka.test.EmbeddedKafkaBroker; +//import org.springframework.kafka.test.utils.KafkaTestUtils; +//import org.springframework.web.client.RestTemplate; +// +//import org.oran.smo.teiv.config.KafkaConfig; +//import com.fasterxml.jackson.core.type.TypeReference; +//import com.fasterxml.jackson.databind.JsonNode; +//import com.fasterxml.jackson.databind.ObjectMapper; +// +//import io.cloudevents.CloudEvent; +//import io.cloudevents.kafka.CloudEventSerializer; +//import lombok.extern.slf4j.Slf4j; +// +//@Slf4j +//public class EndToEndTestUtil { +// public static void sendEventList(final List events, EmbeddedKafkaBroker embeddedKafkaBroker, +// KafkaConfig kafkaConfig) { +// Map configs = new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker)); +// Producer producer = new DefaultKafkaProducerFactory<>(configs, new StringSerializer(), +// new CloudEventSerializer()).createProducer(); +// for (CloudEvent event : events) { +// ProducerRecord producerRecord = new ProducerRecord(kafkaConfig +// .getTopologyIngestion().getTopicName(), null, event); +// producer.send(producerRecord); +// } +// } +// +// public static String getResponseFromApi(final String uri) { +// RestTemplate restTemplate = new RestTemplate(); +// return restTemplate.getForObject(uri, String.class); +// } +// +// public static String processApiCall(final String uri) { +// log.info("(processApiCall) Sending request for: {}", uri); +// String responseBody = getResponseFromApi(uri); +// log.info("(processApiCall) Response: {}", responseBody); +// return responseBody; +// } +// +// public static Map processNode(JsonNode node) { +// ObjectMapper mapper = new ObjectMapper(); +// return mapper.convertValue(node, new TypeReference<>() { +// }); +// } +// +//} diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java index 5ca0097..f485008 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java @@ -64,13 +64,13 @@ class ExposureYangParserTest { @Test void testValidateCorrectSchema() throws YangException { MultipartFile correctFile = new MockMultipartFile("file", "file.yang", MediaType.MULTIPART_FORM_DATA_VALUE, - ("module module-rapp-module1 {\n" + " \n" + "\tyang-version 1.1;\n" + "\tnamespace \"urn:module-rapp-model\";\n" + "\tprefix testModule;\n" + "\t\n" + " import o-ran-smo-teiv-common-yang-types { prefix model; }\n" + "\timport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\n" + "\t\n" + "\trevision \"2024-05-08\" {\n" + "\t\tdescription\n" + "\t\t\"Initial revision.\";\n" + "\t\tor-teiv-yext:label 0.3.0;\n" + "\t}\n" + "\t\n" + "\taugment /model:decorators {\n" + " leaf test1 {\n" + " type string;\n" + " }\n" + "\t\tleaf test2 {\n" + " type boolean;\n" + " }\n" + "\t\tleaf test3 {\n" + " type uint32;\n" + " }\n" + " }\n" + "\t\n" + "\tidentity geo-classifier {\n" + "\t\tbase model:classifiers;\n" + "\t}\n" + " \n" + " identity urban {\n" + " base geo-classifier;\n" + " }\n" + "\t\n" + "\tidentity rural {\n" + " base geo-classifier;\n" + " }\n" + "\n" + "}") + ("module module-rapp-module1 {\n" + " \n" + "\tyang-version 1.1;\n" + "\tnamespace \"urn:module-rapp-model\";\n" + "\tprefix testModule;\n" + "\t\n" + " import o-ran-smo-teiv-common-yang-types { prefix model; }\n" + "\timport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\n" + "\t\n" + "\trevision \"2024-05-08\" {\n" + "\t\tdescription\n" + "\t\t\"Initial revision.\";\n" + "\t\tor-teiv-yext:label 0.3.0;\n" + "\t}\n" + "\t\n" + "\taugment /model:decorators {\n" + " leaf test1 {\n" + " type string;\n" + " }\n" + "\t\tleaf test2 {\n" + " type boolean;\n" + " }\n" + "\t\tleaf test3 {\n" + " type uint32;\n" + " }\n" + "\t\tleaf test4 {\n" + " type decimal64;\n" + " }\n" + " }\n" + "\t\n" + "\tidentity geo-classifier {\n" + "\t\tbase model:classifiers;\n" + "\t}\n" + " \n" + " identity urban {\n" + " base geo-classifier;\n" + " }\n" + "\t\n" + "\tidentity rural {\n" + " base geo-classifier;\n" + " }\n" + "\n" + "}") .getBytes()); Map expected = new HashMap<>(); expected.put("moduleName", "module-rapp-module1"); expected.put("revision", "2024-05-08"); expected.put(CLASSIFIERS, List.of("geo-classifier", "urban", "rural")); - expected.put(DECORATORS, Map.of("test1", "TEXT", "test2", "BOOLEAN", "test3", "INT")); + expected.put(DECORATORS, Map.of("test1", "TEXT", "test2", "BOOLEAN", "test3", "INT", "test4", "DEC")); Map actual = ExposureYangParser.validateSchemasYang(correctFile); assertEquals(expected, actual); diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java index 5b8e951..5fc1af7 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java @@ -30,7 +30,9 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -73,6 +75,27 @@ class IngestionYangParserTest { IngestionYangParser.loadModels(); } + @Test + void testLoadAndValuateModels_Successful() { + final Set modulesToImport = Set.of("_3gpp-common-yang-extensions", "_3gpp-common-yang-types", + "ietf-geo-location", "ietf-inet-types", "ietf-yang-types"); + + final Set modulesToImplement = Set.of("o-ran-smo-teiv-common-yang-extensions", + "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran", + "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-rel-oam-ran"); + + List importModelList = assertDoesNotThrow(() -> YangModelLoader.readYangModelsFromPath( + "classpath:models/import/*.yang")); + List implementModelList = assertDoesNotThrow(() -> YangModelLoader.readYangModelsFromPath( + "classpath:models/*.yang")); + + Set importModulesSet = new HashSet<>(importModelList); + Set implementModulesSet = new HashSet<>(implementModelList); + + assertTrue(importModulesSet.containsAll(modulesToImport)); + assertTrue(implementModulesSet.containsAll(modulesToImplement)); + } + @Test void parseMultipleTypesOfEntities() throws YangException { RootInstance rootInstance = parseAndValidateFromFile("src/test/resources/yang/parser/multiple-entity.json", diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java b/teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java new file mode 100644 index 0000000..3bdfe27 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java @@ -0,0 +1,108 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 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.utils; + +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.oran.smo.teiv.exception.YangException; +import org.oran.smo.teiv.exception.YangSchemaException; +import org.oran.smo.teiv.exposure.spi.Module; +import org.oran.smo.teiv.schema.SchemaRegistry; +import org.oran.smo.teiv.utils.yangparser.IngestionYangParser; +import org.oran.smo.teiv.utils.yangparser.YangModelLoader; +import org.oran.smo.yangtools.parser.input.StringYangInput; +import org.oran.smo.yangtools.parser.model.ConformanceType; +import org.oran.smo.yangtools.parser.model.YangModel; +import org.springframework.util.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import static org.mockito.ArgumentMatchers.any; + +public class YangModelValidationTestUtil { + public static void mockLoadAndValidateModels() throws YangException, IOException { + try (MockedStatic mockedLoader = Mockito.mockStatic(YangModelLoader.class)) { + List modulesImport = collectYangFilesNameFromPath("src/main/resources/models/import"); + List modulesImplement = collectYangFilesNameFromPath("src/main/resources/models"); + modulesImplement.addAll(collectYangFilesNameFromPath("src/test/resources/yang/models")); + + Map modules = SchemaRegistry.getModuleRegistry(); + if (modules == null) { + throw YangSchemaException.failedToLoadSchema(); + } + + List implementList = new ArrayList<>(); + List importList = new ArrayList<>(); + + modules.values().stream().filter(module -> module.getContent() != null).forEach(module -> { + String content = new String(Base64.getDecoder().decode(module.getContent()), StandardCharsets.UTF_8); + if (modulesImport.contains(module.getName())) { + importList.add(content); + } + if (modulesImplement.contains(module.getName())) { + implementList.add(content); + } + }); + + List models = createYangModels(importList, implementList); + mockedLoader.when(() -> YangModelLoader.loadModulesFromSchemaRegistry()).thenReturn(models); + mockedLoader.when(() -> YangModelLoader.createParserExecutionContext(any(), any(), any())).thenCallRealMethod(); + mockedLoader.when(() -> YangModelLoader.parseModelsIntoContext(any(), any())).thenReturn(models); + IngestionYangParser.loadModels(); + } + } + + private static List collectYangFilesNameFromPath(String resourcePath) throws IOException { + File directory = new File(resourcePath); + if (directory.isFile()) { + return List.of(StringUtils.stripFilenameExtension(directory.getName().toLowerCase(Locale.ROOT))); + } + File[] files = directory.listFiles(); + if (files == null) { + throw new IOException(); + } + return Arrays.stream(files).filter(File::isFile).filter(file -> file.getName().endsWith(".yang")).map( + file -> StringUtils.stripFilenameExtension(file.getName().toLowerCase(Locale.ROOT))).collect(Collectors + .toList()); + } + + public static List createYangModels(List importList, List implementList) { + List yangModelInputs = new ArrayList<>(); + yangModelInputs.addAll(createYangModels(importList, ConformanceType.IMPORT)); + yangModelInputs.addAll(createYangModels(implementList, ConformanceType.IMPLEMENT)); + return yangModelInputs; + } + + private static List createYangModels(List resources, ConformanceType conformanceType) { + return resources.stream().map(resource -> new YangModel(new StringYangInput(resource, resource, + "application/yang-data+json"), conformanceType)).filter(Objects::nonNull).toList(); + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json b/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json index ef4d22e..dfed6ed 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json @@ -13,7 +13,7 @@ { "id": "id1", "attributes": { - "gNBId": -1.0 + "gNBId": "abba" }, "sourceIds": [ "source1", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json index 8dc4da7..cb0bd55 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json @@ -27,10 +27,10 @@ { "id": "AntennaCapability_3", "attributes": { - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - } + "geranFqBands": [ + "1", + "2" + ] }, "sourceIds": [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", @@ -45,7 +45,7 @@ "id": "ODU_2", "attributes": { "dUpLMNId": { - "mcc": "111", + "mcc": "251", "mnc": "211" }, "gNBDUId": 13, @@ -74,12 +74,9 @@ ] }, { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_61", - "attributes": { - - }, "sourceIds": [ "source1", "source2" @@ -88,12 +85,9 @@ ] }, { - "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { "id": "NRCellDU_41", - "attributes": { - - }, "sourceIds": [ "source1", "source2" @@ -104,7 +98,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "relation_one_to_one_missing_bSide", "aSide": "ManagedElement_61", @@ -122,6 +116,15 @@ "source1", "source2" ] + }, + { + "id": "relation_one_to_one_both_sides_missing", + "aSide": "ManagedElement_X", + "bSide": "NRCellDU_X", + "sourceIds": [ + "source1", + "source2" + ] } ] }, @@ -144,6 +147,15 @@ "source1", "source2" ] + }, + { + "id": "relation_one_to_many_both_sides_missing", + "aSide": "ODU_X", + "bSide": "NRCellDU_X", + "sourceIds": [ + "source1", + "source2" + ] } ] }, diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json index 8610767..dbb6008 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json @@ -37,10 +37,10 @@ { "id": "AntennaCapability_1", "attributes": { - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - } + "geranFqBands": [ + "1", + "2" + ] }, "sourceIds": [ "source1", @@ -50,10 +50,10 @@ { "id": "AntennaCapability_2", "attributes": { - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - } + "geranFqBands": [ + "1", + "2" + ] }, "sourceIds": [ "source1", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json index b954484..6e3cef2 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json @@ -12,9 +12,6 @@ "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1", - "attributes": { - - }, "sourceIds": [ "urn:3gpp:dn:fdn1", "urn:cmHandle:1234" diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json index 1869e10..8bc8370 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json @@ -12,9 +12,6 @@ "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1", - "attributes": { - - }, "sourceIds": [ "urn:3gpp:dn:fdn1", "urn:cmHandle:12345" @@ -22,9 +19,6 @@ }, { "id": "ManagedElement_2", - "attributes": { - - }, "sourceIds": [ "urn:3gpp:dn:fdn1", "urn:cmHandle:12345" @@ -52,8 +46,8 @@ "id": "ODU_1", "attributes": { "dUpLMNId": { - "mcc": 110, - "mnc": 210 + "mcc": "250", + "mnc": "210" }, "gNBDUId": 111, "gNBId": 123, diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json index 40b6d97..1d58268 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json @@ -9,12 +9,9 @@ "data": { "entities": [ { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_21", - "attributes": { - - }, "sourceIds": [ "source1", "source2" @@ -22,9 +19,6 @@ }, { "id": "ManagedElement_41", - "attributes": { - - }, "sourceIds": [ "source1", "source2" @@ -33,7 +27,7 @@ ] }, { - "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { "id": "NRCellDU_21", "attributes": { @@ -62,7 +56,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "relation_11", "aSide": "ManagedElement_21", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json index 1f61d05..a9e2735 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json @@ -33,7 +33,7 @@ ] }, { - "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ + "o-ran-smo-teiv-equipment-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ { "id": "AntennaModule_3", "attributes": { @@ -79,7 +79,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_many_relation_1", "aSide": "AntennaModule_3", @@ -92,7 +92,7 @@ ] }, { - "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_one_relation_1", "aSide": "AntennaModule_51", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json index a8ff2d0..f27419d 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json @@ -41,10 +41,10 @@ "urn:cmHandle:395221E080CCF0FD1929103B15999999" ], "attributes": { - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - } + "geranFqBands": [ + "1", + "2" + ] } }, { @@ -54,10 +54,10 @@ "urn:cmHandle:395221E080CCF0FD1929103B15999999" ], "attributes": { - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - } + "geranFqBands": [ + "1", + "2" + ] } } ] diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json index dc1b118..9438902 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_21" } @@ -18,7 +18,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "relation_12" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json index 74985ee..6b64195 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json @@ -21,14 +21,14 @@ ], "relationships": [ { - "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_many_relation_1" } ] }, { - "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_one_relation_1" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json index c454317..597c3ef 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_1", "attributes": { @@ -43,7 +43,7 @@ ] }, { - "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { "id": "NRCellDU_1", "attributes": { @@ -73,12 +73,12 @@ ] }, { - "o-ran-smo-teiv-ran:ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [ + "o-ran-smo-teiv-ran-test:ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [ { "id": "ODUFunction_1", "attributes": { "dUpLMNId": { - "mcc": "110", + "mcc": "250", "mnc": "210" }, "gNBDUId": 12, @@ -94,7 +94,7 @@ "id": "ODUFunction_2", "attributes": { "dUpLMNId": { - "mcc": "110", + "mcc": "250", "mnc": "210" }, "gNBDUId": 12, @@ -109,7 +109,7 @@ ] }, { - "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ + "o-ran-smo-teiv-equipment-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ { "id": "AntennaModule_1", "attributes": { @@ -183,7 +183,7 @@ ] }, { - "o-ran-smo-teiv-ran:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy": [ + "o-ran-smo-teiv-ran-test:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy": [ { "id": "AntennaCapability_id1", "attributes": { @@ -207,7 +207,7 @@ ] }, { - "o-ran-smo-teiv-ran:LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr": [ + "o-ran-smo-teiv-ran-test:LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr": [ { "id": "LTESectorCarrier_id1", "attributes": { @@ -223,7 +223,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN": [ + "o-ran-smo-teiv-rel-oam-ran-test:MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN": [ { "id": "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1", "aSide": "ManagedElement_1", @@ -236,7 +236,7 @@ ] }, { - "o-ran-smo-teiv-ran:ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU": [ { "id": "ODUFUNCTION_PROVIDES_NRCELLDU_relation_1", "aSide": "ODUFunction_2", @@ -249,7 +249,7 @@ ] }, { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "ManagedElement_USES_NRCELLDU_relation_1", "aSide": "ManagedElement_3", @@ -262,7 +262,7 @@ ] }, { - "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "aSide": "AntennaModule_1", @@ -284,7 +284,7 @@ ] }, { - "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "aSide": "AntennaModule_5", @@ -297,7 +297,7 @@ ] }, { - "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY": [ + "o-ran-smo-teiv-rel-equipment-ran-test:ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY": [ { "id": "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1", "aSide": "AntennaModule_7", @@ -310,7 +310,7 @@ ] }, { - "o-ran-smo-teiv-ran:LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY": [ + "o-ran-smo-teiv-ran-test:LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY": [ { "id": "LTESECTORCARRIER_USES_ANTENNACAPABILITY_relation_1", "aSide": "LTESectorCarrier_id1", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json index 5d3399a..efb1988 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json @@ -37,10 +37,10 @@ { "id": "AntennaCapability_1", "attributes": { - "geranFqBands": { - "attribute_1": "2", - "attribute_2": "3" - } + "geranFqBands": [ + "2", + "3" + ] }, "sourceIds": [ "source1", @@ -50,10 +50,10 @@ { "id": "AntennaCapability_2", "attributes": { - "geranFqBands": { - "attribute_1": "23", - "attribute_2": "23" - } + "geranFqBands": [ + "23", + "34" + ] }, "sourceIds": [ "source1", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json index 71dbe0c..0771248 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json @@ -14,7 +14,7 @@ "id": "ODU_1", "attributes": { "dUpLMNId": { - "mcc": "110", + "mcc": "250", "mnc": "210" }, "gNBDUId": 12, diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json index 54608bf..cf4394d 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json @@ -12,9 +12,6 @@ "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1", - "attributes": { - - }, "sourceIds": [ "urn:3gpp:dn:fdn1", "urn:cmHandle:1234" @@ -22,9 +19,6 @@ }, { "id": "ManagedElement_2", - "attributes": { - - }, "sourceIds": [ "urn:3gpp:dn:fdn1", "urn:cmHandle:1234" @@ -52,8 +46,8 @@ "id": "ODU_1", "attributes": { "dUpLMNId": { - "mcc": 110, - "mnc": 210 + "mcc": "250", + "mnc": "210" }, "gNBDUId": 111, "gNBId": 123, diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json index 01547b7..04cc9cf 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json @@ -1,5 +1,5 @@ { - "84E676149362F50C55FE1E004B98D4891916BBF3": [ + "F93C2CA075353668A76B4718E07B741ACCD83641": [ { "id": "NRCellDU_41" }, @@ -13,9 +13,15 @@ "firstDiscovered": "", "lastModified": "" } + }, + { + "id": "NRCellDU_X", + "CD_sourceIds": [ + "relation_one_to_one_both_sides_missing" + ] } ], - "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ + "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [ { "id": "ManagedElement_61", "REL_FK_used-nrCellDu": "NRCellDU_51", @@ -41,6 +47,18 @@ "source1", "source2" ] + }, + { + "id": "ManagedElement_X", + "REL_FK_used-nrCellDu": "NRCellDU_X", + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_one_to_one_both_sides_missing", + "CD_sourceIds": [ + "relation_one_to_one_both_sides_missing" + ], + "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran_NRCellDU": [ @@ -75,13 +93,30 @@ "source1", "source2" ] + }, + { + "id": "NRCellDU_X", + "REL_FK_provided-by-oduFunction": "ODU_X", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_one_to_many_both_sides_missing", + "CD_sourceIds": [ + "relation_one_to_many_both_sides_missing" + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + }, + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran_ODUFunction": [ { "id": "ODU_2", "dUpLMNId": { - "mcc": "111", + "mcc": "251", "mnc": "211" }, "gNBDUId": 13, @@ -103,6 +138,17 @@ "firstDiscovered": "", "lastModified": "" } + }, + { + "id": "ODU_X", + "CD_sourceIds": [ + "relation_one_to_many_both_sides_missing" + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } } ], "o-ran-smo-teiv-equipment_AntennaModule": [ @@ -136,10 +182,10 @@ "o-ran-smo-teiv-ran_AntennaCapability": [ { "id": "AntennaCapability_3", - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - } + "geranFqBands": [ + 1, + 2 + ] }, { "id": "AntennaCapability_123", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json index eabcc96..d27de8d 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json @@ -22,10 +22,10 @@ "o-ran-smo-teiv-ran_AntennaCapability": [ { "id": "AntennaCapability_1", - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - }, + "geranFqBands": [ + 1, + 2 + ], "metadata": { "reliabilityIndicator": "OK", "firstDiscovered": "", @@ -34,10 +34,10 @@ }, { "id": "AntennaCapability_2", - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - }, + "geranFqBands": [ + 1, + 2 + ], "metadata": { "reliabilityIndicator": "OK", "firstDiscovered": "", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json index 0307ab0..7c90d26 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json @@ -1,5 +1,5 @@ { - "84E676149362F50C55FE1E004B98D4891916BBF3": [ + "F93C2CA075353668A76B4718E07B741ACCD83641": [ { "id": "NRCellDU_21" }, @@ -7,7 +7,7 @@ "id": "NRCellDU_31" } ], - "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ + "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [ { "id": "ManagedElement_21", "REL_FK_used-nrCellDu": "NRCellDU_21", diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json index 62df5f4..c22ff47 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json @@ -26,10 +26,10 @@ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", "urn:cmHandle:395221E080CCF0FD1929103B15999999" ], - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - }, + "geranFqBands": [ + 1, + 2 + ], "eUtranFqBands": null, "nRFqBands": null, "metadata": { @@ -44,10 +44,10 @@ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", "urn:cmHandle:395221E080CCF0FD1929103B15999999" ], - "geranFqBands": { - "attribute_1": "1", - "attribute_2": "2" - }, + "geranFqBands": [ + 1, + 2 + ], "eUtranFqBands": null, "nRFqBands": null, "metadata": { diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json index 67de539..4922325 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json @@ -1,5 +1,5 @@ { - "84E676149362F50C55FE1E004B98D4891916BBF3": [ + "F93C2CA075353668A76B4718E07B741ACCD83641": [ { "id": "NRCellDU_21" }, @@ -7,12 +7,16 @@ "id": "NRCellDU_31" } ], - "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ + "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [ { "id": "ManagedElement_41", "REL_FK_used-nrCellDu": null, "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": null, - "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": null + "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": null, + "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD": [], + "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92": { + + } } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json index eef53b8..e623b99 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json @@ -22,10 +22,10 @@ "o-ran-smo-teiv-ran_AntennaCapability": [ { "id": "AntennaCapability_1", - "geranFqBands": { - "attribute_1": "2", - "attribute_2": "3" - }, + "geranFqBands": [ + 2, + 3 + ], "metadata": { "reliabilityIndicator": "OK", "firstDiscovered": "", @@ -34,10 +34,10 @@ }, { "id": "AntennaCapability_2", - "geranFqBands": { - "attribute_1": "23", - "attribute_2": "23" - } + "geranFqBands": [ + 23, + 34 + ] } ], "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json index b695a6c..25ec29b 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json @@ -56,7 +56,7 @@ { "id": "ODU_1", "dUpLMNId": { - "mcc": "110", + "mcc": "250", "mnc": "210" }, "gNBDUId": 12, diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json index dcfc153..4043b85 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json @@ -1,5 +1,5 @@ { - "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ + "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [ "ManagedElement_21", "relation_11", "relation_12" diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json index 049e2aa..1592270 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_1", "attributes": { @@ -23,7 +23,7 @@ ] }, { - "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { "id": "NRCellDU_1", "attributes": { @@ -42,7 +42,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_1", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json index b4173e8..dc09192 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json @@ -42,7 +42,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_2", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json index e1d2134..c4048eb 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_2", "attributes": { @@ -25,7 +25,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_2", "aSide": "ManagedElement_2", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json index fc00d41..7e62f34 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json @@ -9,7 +9,7 @@ "data": { "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_2", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json index ea4fe25..d719b33 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { "id": "NRCellDU_1", "attributes": { @@ -28,7 +28,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_1", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json index 126787f..9601a26 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_1", "attributes": { @@ -25,7 +25,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_1", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json index 3bd21b3..9295aec 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json @@ -9,7 +9,7 @@ "data": { "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_1", diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json index c71198c..bfa289e 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json @@ -9,7 +9,7 @@ "data": { "entities": [ { - "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { "id": "NRCellDU_2", "attributes": { @@ -28,7 +28,7 @@ ], "relationships": [ { - "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_2", diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy index 90d7662..bbe0ecb 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy @@ -225,7 +225,7 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 200: Get classifiers using getRelationshipsByType - CONTAINS" + description "NOT FOUND - 404: Get classifiers using getRelationshipsByType - CONTAINS" request { method GET() url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'NOT_EXISTING')]" @@ -233,7 +233,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy index 7fe40aa..449740c 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy @@ -233,5 +233,81 @@ import org.springframework.cloud.contract.spec.Contract response { status NO_CONTENT() } + }, + Contract.make { + description "BAD REQUEST - 400: Invalid operation type in the classifiers request." + request { + method POST() + url "/topology-inventory/v1alpha11/classifiers" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "classifiers": [ + "test-app-module-wrong:Rural", + "test-app-module:Weekend" + ], + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "unknown" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Failed to process the request to merge/remove classifiers", + "details": "Unexpected value 'unknown'. Invalid value for OperationEnum, allowed values: [merge, delete]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "BAD REQUEST - 400: Using object type for the classifiers parameter in the payload." + request { + method POST() + url "/topology-inventory/v1alpha11/classifiers" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "classifiers": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "delete" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Failed to process the request to merge/remove classifiers", + "details": "Cannot deserialize value of type `java.util.ArrayList` from Object value (token `JsonToken.START_OBJECT`)" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy b/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy index 3ea0fd8..6005524 100644 --- a/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy @@ -264,7 +264,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy b/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy index f3cacab..3edbcd8 100644 --- a/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy @@ -520,7 +520,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -538,7 +538,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy b/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy index e1dd959..a2daa0b 100644 --- a/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy @@ -1520,7 +1520,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1538,7 +1538,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1547,6 +1547,24 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + Contract.make { + description 'ERROR - 400: Get entities of type AntennaModule with scopeFilter inside MULTIPOLYGON - Invalid format: missing parentheses in the second list of points.' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),(60 70, 50 68, 50 69, 48 69, 60 70)))')]" + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "Invalid parameter for covered by condition" + }''') + } + }, Contract.make { description 'ERROR - 400: Get entities of type AntennaModule with scopeFilter on geographic attribute with height - 1 coordinate' request { @@ -1556,7 +1574,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1574,7 +1592,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1592,7 +1610,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1610,7 +1628,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1629,7 +1647,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1647,7 +1665,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1835,7 +1853,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1858,7 +1876,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1881,7 +1899,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1904,7 +1922,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -2009,6 +2027,51 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description 'SUCCESS - 200: Get entities of type AntennaModule inside MultiPolygon' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + }, Contract.make { description "SUCCESS - 200: Get entities of type AntennaCapability by AntennaModule id" request { @@ -2755,7 +2818,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -2773,7 +2836,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3318,7 +3381,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3341,7 +3404,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3472,7 +3535,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3495,7 +3558,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3513,7 +3576,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3625,7 +3688,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -3643,7 +3706,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy b/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy index 968ca74..5c587c5 100644 --- a/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy @@ -94,7 +94,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", @@ -112,7 +112,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy b/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy index 8a51d32..dcf0617 100644 --- a/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy @@ -737,7 +737,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -755,7 +755,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", diff --git a/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy b/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy index 9bb9c60..6a2ea2a 100644 --- a/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy @@ -533,7 +533,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy b/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy index f6a5b76..0214d0c 100644 --- a/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy @@ -677,7 +677,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -695,7 +695,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy b/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy index 3a5241b..665ecb9 100644 --- a/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy @@ -70,7 +70,7 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "ERROR - 400: Get relationship with non existing id 'urn:non-existing-id'" + description "ERROR - 404: Get relationship with non existing id 'urn:non-existing-id'" request { method GET() url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships/urn:non-existing-id" @@ -78,7 +78,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", diff --git a/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy b/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy index 1789f43..32ad53f 100644 --- a/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy @@ -1099,7 +1099,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1117,7 +1117,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1433,12 +1433,100 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items', byType { occurrence(2) }) - jsonPath('$.items[*].o-ran-smo-teiv-ran:NRCellDU[0].id', byType { - minOccurrence(1) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN with complex filter here many to many relationship(ANTENNAMODULE_SERVES_NRCELLDU) , one to many(NRCELLDU_USES_NRSECTORCARRIER) where relationship information is stored in NRSECTORCARRIER , and NRCELLDU Attribute. So 3 Logical blocks and 3 joins from NRCELLDU connects to NRSectorCarrier,ANTENNAMODULE_SERVES_NRCELLDU and AntennaModule' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) }) - jsonPath('$.items[*].o-ran-smo-teiv-ran:AntennaCapability[0].id', byType { - minOccurrence(1) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities with filter on attributes and associations. Based on local dataset ODUFunction with gNBId=9 is connected to three instances of NRCellDU but result should contain just one ODUFunction' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } }, @@ -1491,12 +1579,8 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items', byType { occurrence(2) }) - jsonPath('$.items[*].o-ran-smo-teiv-ran:NRCellDU[0].id', byType { - minOccurrence(1) - }) - jsonPath('$.items[*].o-ran-smo-teiv-ran:AntennaCapability[0].id', byType { - minOccurrence(1) - }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) } } }, diff --git a/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy b/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy index 00dd9d6..50da626 100644 --- a/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy +++ b/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy @@ -297,5 +297,80 @@ import org.springframework.cloud.contract.spec.Contract response { status NO_CONTENT() } + }, + Contract.make { + description "BAD REQUEST - 400: Invalid operation type in the decorators request." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "unknown" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Failed to process the request to merge/remove decorators", + "details": "Unexpected value 'unknown'. Invalid value for OperationEnum, allowed values: [merge, delete]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "BAD REQUEST - 400: Using list type for the decorators parameter in the payload." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": [ + "test-app-module:textdata" + ], + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "delete" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Failed to process the request to merge/remove decorators", + "details": "Cannot deserialize value of type `java.util.LinkedHashMap` from Array value (token `JsonToken.START_ARRAY`)" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy index 13b1258..50e9f29 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy @@ -566,7 +566,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy b/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy index 62c21d8..949df7f 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy @@ -244,7 +244,7 @@ import org.springframework.cloud.contract.spec.Contract "details": "Invalid schema name: invalid" }''') headers { - contentType('application/json') + contentType('application/problem+json') } } } diff --git a/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy index 42c0abe..60b7225 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy @@ -61,6 +61,9 @@ import org.springframework.cloud.contract.spec.Contract ' leaf weekend { ' + ' type uint32; ' + ' } ' + + ' leaf decimal { ' + + ' type decimal64; ' + + ' } ' + ' } ' + ' ' + ' identity geo-classifier { ' + @@ -225,6 +228,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid schema name", @@ -288,6 +294,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid schema name", @@ -363,6 +372,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -429,6 +441,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -496,6 +511,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -552,6 +570,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid schema name", @@ -619,6 +640,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -686,6 +710,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -711,6 +738,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -734,6 +764,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -794,6 +827,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -854,6 +890,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -902,6 +941,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -942,6 +984,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1009,6 +1054,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1076,6 +1124,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1116,6 +1167,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1177,6 +1231,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1240,6 +1297,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1303,6 +1363,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid file input", @@ -1361,11 +1424,84 @@ import org.springframework.cloud.contract.spec.Contract } response { status CONFLICT() + headers { + contentType('application/problem+json') + } body('''{ "status": "CONFLICT", "message": "Schema in deleting state", "details": "Schema test-app-in-deleting-status already exists and is in the process of being deleted. This may take some time, please try again later." }''') } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with not supported decorator type" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model15 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model15"; ' + + ' prefix model15; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' leaf decimal { ' + + ' type decimal32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Cannot resolve typedef 'decimal32'." + }''') + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy index 28d6615..9300388 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy @@ -41,6 +41,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid schema name", @@ -56,6 +59,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid schema name", diff --git a/teiv/src/test/resources/contracts/groups/00_createGroup.groovy b/teiv/src/test/resources/contracts/groups/00_createGroup.groovy index fd35df1..7c99158 100644 --- a/teiv/src/test/resources/contracts/groups/00_createGroup.groovy +++ b/teiv/src/test/resources/contracts/groups/00_createGroup.groovy @@ -333,7 +333,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -364,7 +364,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -395,7 +395,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -458,7 +458,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -493,7 +493,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -525,7 +525,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -612,7 +612,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -646,7 +646,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -684,7 +684,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -722,7 +722,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -760,7 +760,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -789,7 +789,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -823,7 +823,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -858,7 +858,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -893,7 +893,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -928,7 +928,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -964,7 +964,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1004,7 +1004,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1085,7 +1085,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1119,7 +1119,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1153,7 +1153,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1185,7 +1185,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/contracts/groups/01_getGroups.groovy b/teiv/src/test/resources/contracts/groups/01_getGroups.groovy index 498177c..0bebf61 100644 --- a/teiv/src/test/resources/contracts/groups/01_getGroups.groovy +++ b/teiv/src/test/resources/contracts/groups/01_getGroups.groovy @@ -268,6 +268,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "getAllGroups.limit: must be less than or equal to 500" diff --git a/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy b/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy index 1bd72e2..83d0297 100644 --- a/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy +++ b/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy @@ -204,6 +204,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status INTERNAL_SERVER_ERROR() + headers { + contentType('application/problem+json') + } body('''{ "status": "INTERNAL_SERVER_ERROR", "message": "Criteria deserialization exception", @@ -225,7 +228,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -242,6 +245,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status NOT_FOUND() + headers { + contentType('application/problem+json') + } body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", diff --git a/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy b/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy index c29bdcf..849adb7 100644 --- a/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy +++ b/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy @@ -66,6 +66,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } } } ] diff --git a/teiv/src/test/resources/contracts/groups/04_putGroup.groovy b/teiv/src/test/resources/contracts/groups/04_putGroup.groovy index 3242238..7972c5f 100644 --- a/teiv/src/test/resources/contracts/groups/04_putGroup.groovy +++ b/teiv/src/test/resources/contracts/groups/04_putGroup.groovy @@ -70,7 +70,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", diff --git a/teiv/src/test/resources/contracts/groups/05_getMembers.groovy b/teiv/src/test/resources/contracts/groups/05_getMembers.groovy index 7cbec9e..87a4160 100644 --- a/teiv/src/test/resources/contracts/groups/05_getMembers.groovy +++ b/teiv/src/test/resources/contracts/groups/05_getMembers.groovy @@ -597,6 +597,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status NOT_FOUND() + headers { + contentType('application/problem+json') + } body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", @@ -613,7 +616,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body ('''{ "status": "NOT_FOUND", @@ -630,6 +633,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Grammar error", @@ -645,6 +651,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status NOT_FOUND() + headers { + contentType('application/problem+json') + } body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", @@ -660,6 +669,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Filter Error", @@ -675,6 +687,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid target filter, only relationship conditions can be provided", diff --git a/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy b/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy index f6fc5e9..bcec9a1 100644 --- a/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy +++ b/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy @@ -410,6 +410,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status BAD_REQUEST() + headers { + contentType('application/problem+json') + } body('''{ "status": "BAD_REQUEST", "message": "Invalid status", @@ -425,6 +428,9 @@ import org.springframework.cloud.contract.spec.Contract } response { status NOT_FOUND() + headers { + contentType('application/problem+json') + } body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", diff --git a/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy b/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy index 72463a3..0bf6068 100644 --- a/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy +++ b/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy @@ -263,7 +263,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -343,7 +343,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -399,7 +399,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -454,7 +454,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -496,7 +496,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -532,7 +532,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", @@ -573,7 +573,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -614,7 +614,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -679,7 +679,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -815,7 +815,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -847,7 +847,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -874,7 +874,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -905,7 +905,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -938,7 +938,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -971,7 +971,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1004,7 +1004,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1038,7 +1038,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1076,7 +1076,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", @@ -1112,7 +1112,7 @@ import org.springframework.cloud.contract.spec.Contract response { status NOT_FOUND() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "NOT_FOUND", @@ -1153,7 +1153,7 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/json') + contentType('application/problem+json') } body('''{ "status": "BAD_REQUEST", diff --git a/teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql b/teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql new file mode 100644 index 0000000..52447f0 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql @@ -0,0 +1,2898 @@ +-- ============LICENSE_START======================================================= +-- Modifications Copyright (C) 2025 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 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; +GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; + +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; +SET default_tablespace = ''; +SET default_table_access_method = heap; + +SET ROLE :'pguser'; + +-- Function to create CONSTRAINT only if it does not exists +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( + t_name TEXT, c_name TEXT, constraint_sql TEXT +) +RETURNS void AS +$$ +BEGIN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_AntennaCapability" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ( + "id" TEXT, + "antennaBeamWidth" jsonb, + "antennaModelNumber" TEXT, + "electricalAntennaTilt" INTEGER, + "geo-location" geography, + "mechanicalAntennaBearing" INTEGER, + "mechanicalAntennaTilt" INTEGER, + "positionWithinSector" TEXT, + "totalTilt" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_installed-at-site" TEXT, + "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" TEXT, + "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_FK_grouped-by-sector" TEXT, + "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" TEXT, + "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_Site" ( + "id" TEXT, + "geo-location" geography, + "name" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-oam_ManagedElement" ( + "id" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_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 teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ( + "id" TEXT, + "eNBId" INTEGER, + "eNodeBPlmnId" jsonb, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_EUtranCell" ( + "id" TEXT, + "cellId" INTEGER, + "channelBandwidth" INTEGER, + "dlChannelBandwidth" INTEGER, + "duplexType" TEXT, + "earfcn" INTEGER, + "earfcndl" INTEGER, + "earfcnul" INTEGER, + "tac" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-enodebFunction" TEXT, + "REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL" TEXT, + "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb, + "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb, + "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb, + "REL_FK_grouped-by-sector" TEXT, + "REL_ID_SECTOR_GROUPS_EUTRANCELL" TEXT, + "REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL" jsonb, + "REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL" jsonb, + "REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ( + "id" TEXT, + "gNBCUName" TEXT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "pLMNId" jsonb, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ( + "id" TEXT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" ( + "id" TEXT, + "dUpLMNId" jsonb, + "gNBDUId" BIGINT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( + "id" TEXT, + "sectorCarrierType" TEXT, + "CD_sourceIds" 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, + "REL_FK_used-by-euTranCell" TEXT, + "REL_ID_EUTRANCELL_USES_LTESECTORCARRIER" TEXT, + "REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER" jsonb, + "REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER" jsonb, + "REL_CD_decorators_EUTRANCELL_USES_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 teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellCU" ( + "id" TEXT, + "cellLocalId" INTEGER, + "nCI" BIGINT, + "nRTAC" INTEGER, + "plmnId" jsonb, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-ocucpFunction" TEXT, + "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" TEXT, + "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellDU" ( + "id" TEXT, + "cellLocalId" INTEGER, + "nCI" BIGINT, + "nRPCI" INTEGER, + "nRTAC" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" TEXT, + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_FK_grouped-by-sector" TEXT, + "REL_ID_SECTOR_GROUPS_NRCELLDU" TEXT, + "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" jsonb, + "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" jsonb, + "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( + "id" TEXT, + "arfcnDL" INTEGER, + "arfcnUL" INTEGER, + "bSChannelBwDL" INTEGER, + "frequencyDL" INTEGER, + "frequencyUL" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" TEXT, + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_FK_used-by-nrCellDu" TEXT, + "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" TEXT, + "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_FK_used-antennaCapability" TEXT, + "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" TEXT, + "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_Sector" ( + "id" TEXT, + "azimuth" DECIMAL, + "geo-location" geography, + "sectorId" BIGINT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +SELECT teiv_data.create_constraint_if_not_exists( + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_Site', + 'PK_o-ran-smo-teiv-equipment_Site_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-oam_ManagedElement', + 'PK_o-ran-smo-teiv-oam_ManagedElement_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_AntennaCapability', + 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'PK_o-ran-smo-teiv-ran_EUtranCell_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_EUtranCell_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'PK_o-ran-smo-teiv-ran_OCUCPFunction_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'PK_o-ran-smo-teiv-ran_OCUUPFunction_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'PK_o-ran-smo-teiv-ran_ODUFunction_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'PK_o-ran-smo-teiv-ran_NRCellCU_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'PK_o-ran-smo-teiv-ran_NRCellDU_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'PK_o-ran-smo-teiv-ran_NRSectorCarrier_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_Sector', + 'PK_o-ran-smo-teiv-ran_Sector_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960', + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06', + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES teiv_data."o-ran-smo-teiv-equipment_Site" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_078764B2F3D613D44CC6E3586F564C83164D2481', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'FK_6C99B14BF3C9BC6DE2D69AD55DF323ADCB174167', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_6C99B14BF3C9BC6DE2D69AD55DF323ADCB174167" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'UNIQUE_A30444B7D036FA579730F0D2853E52FD08DEDCF0', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "UNIQUE_A30444B7D036FA579730F0D2853E52FD08DEDCF0" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_2D1FA89480BF856AB865D58FAFB6AC0B476015EB', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_2D1FA89480BF856AB865D58FAFB6AC0B476015EB" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'UNIQUE_CA88C7E60C1A332FA7561FC965ED41DD4125CDED', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "UNIQUE_CA88C7E60C1A332FA7561FC965ED41DD4125CDED" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_REL_FK_grouped-by-sector', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'UNIQUE_0513FE4A675A02C31E5EDD6BCB3728911FBDA2FA', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "UNIQUE_0513FE4A675A02C31E5EDD6BCB3728911FBDA2FA" UNIQUE ("REL_ID_SECTOR_GROUPS_EUTRANCELL");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_F1FB8F88851067901B66D53EE1420D2ECCEC98A3', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_F1FB8F88851067901B66D53EE1420D2ECCEC98A3" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'UNIQUE_50E9E4A87D93AC833B1D1AC05E3B58805909E20E', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_50E9E4A87D93AC833B1D1AC05E3B58805909E20E" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'FK_34D6E2537E8EE1D395CAF5BF9B2182A4696A1EAA', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_34D6E2537E8EE1D395CAF5BF9B2182A4696A1EAA" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'UNIQUE_0CA05800AC7D277BDCB5CF0097DC35978E9311F4', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_0CA05800AC7D277BDCB5CF0097DC35978E9311F4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_F67FAF9D3E82B97104E2392DA0AC8A86DF2407CC', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_F67FAF9D3E82B97104E2392DA0AC8A86DF2407CC" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'UNIQUE_5BD09ED226520A0BE27904AEAF0557416808E7E2', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_5BD09ED226520A0BE27904AEAF0557416808E7E2" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_96E6D4983CFFDF30FCA20423B5913DEE486E42D0', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_96E6D4983CFFDF30FCA20423B5913DEE486E42D0" FOREIGN KEY ("REL_FK_used-by-euTranCell") REFERENCES teiv_data."o-ran-smo-teiv-ran_EUtranCell" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'UNIQUE_0A76398FBBC8E01A2D3BA602AB47835794E997E5', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_0A76398FBBC8E01A2D3BA602AB47835794E997E5" UNIQUE ("REL_ID_EUTRANCELL_USES_LTESECTORCARRIER");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_F2CDD1E84C7F07BF8065F99A5F3488E91E3BB7B2', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_F2CDD1E84C7F07BF8065F99A5F3488E91E3BB7B2" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'UNIQUE_EA2A6F5BA36ABB0DA357542E05AA2D07415E127A', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_EA2A6F5BA36ABB0DA357542E05AA2D07415E127A" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'UNIQUE_C3D8E5331EC71D46D4B8CED29FE5F6CEB1D8E67A', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_C3D8E5331EC71D46D4B8CED29FE5F6CEB1D8E67A" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_F7978366174C82E41F0A6ABF29005FF01603858F', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_F7978366174C82E41F0A6ABF29005FF01603858F" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'UNIQUE_0AC16A840F6ACDC50136E71EC6D4F3D4E04B8198', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_0AC16A840F6ACDC50136E71EC6D4F3D4E04B8198" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_65D538D54EB33081C808540235FEB28823428E64', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' +); + +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON teiv_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 teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); + +CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); + +CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON teiv_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 teiv_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 teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("eNodeBPlmnId"); + +CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON teiv_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 teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_252AF4814C67384A7B05EA116316E83AFF9EB6AE" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_61CDCD3F69CF67EE740358D2C76FA796CFDA19BF" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_35C17C8A9BA3EF3AEADA72C21F8090C38F575BAF" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_84E36DC53519D3E334C60B5B02C1AB27130CFA24" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_C9C19F8F83F50C130F2EB6502ABB7B2833F1F783" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_EUtranCell_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_976F6A0F8991F64592B6F9E716EFEECBD5400FDA" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_4C77E3A51BFAB2FCD30425E4EB21CC7636438299" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_FC7D79187227E0BFA69149048CC10E39AE540B8A" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL"); + +CREATE INDEX IF NOT EXISTS "IDX_173887418DD4FD6FD592F6404EA784150B1822C0" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_8A15E61498725DA9D8C78FC4B99053C06E88DCEC" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E4EF3C904939ED4C0996EAB7CDFE1895CDF34BFB" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); + +CREATE INDEX IF NOT EXISTS "IDX_BE4B476041D559760931630000D3F4A6DFF42707" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_588840BAE32C7FF8CF0553F631DAAF8BB6E8E7C1" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_E01081465B87F46E1CC7A22FE406C7B41C817E8C" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_1324070754C1EBF8EA78EF40743AFC1713733BA8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_13E734DE57346378DA4F21FC4EA030290A7E532F" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_C6D2419F8DC299FBC98342AA00BE92308C7566A7" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_4C2B68358221A7FF0E68012DEDD3CBA2C4ED669F" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_883506CAA3E742D82EEFCEE8C8F29927983B73B1" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_EB07ADD66F6CF51B9330403DE4500D05CA067647" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_C3141DD7D2695EF74B13981AB378A58390D203D6" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); + +CREATE INDEX IF NOT EXISTS "IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_601A4514FFACA8985471531013AFC8F760361F09" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_3065F7FB78C5AA9FF17972F825F89AED127A6324" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_04C614FDE6A4AE2AA106A1233D1DF95803FC122D" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_298FCD184347DEC995B06FED2B1AE61F12BF766A" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON teiv_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 teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON teiv_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 teiv_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 teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_F2D46817C2D618D8C33945F282299BF9EB49465E" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_B291D7EFCAD3BF06A2C11F8C0429ABABEEF8308B" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_EAE482189F45D63CD1A88B0DD5F76EEE163D9E53" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE" ON teiv_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 teiv_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 teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); + +CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_36A671754CD510FFBDC2713FD142303DCA75DD65" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_04BE1EB39848069422B97C28EE3C8ED18BCC6D33" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_229957181BBC9D7B4535807BB397E8AA1378ED85" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); + +CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_1F6708B1E34FC908473DD7A7E5641E650B359BEF" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_2F4C43ED084968FDAF9943DB96741885C145FE1D" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_0E63D6B76B229961CD45D998C63175B569DDECD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); + +CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); + +CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_CD293AD1111E344D150340A13BD299924D29A9DA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_273D43FDDD1C4643ECF8BBE51B6B369C657F0861" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_EDE8B88F488F9380DB49CB2C141318FB33C2CCEC" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); + +CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "azimuth" DECIMAL; + +CREATE TABLE IF NOT EXISTS teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_EUtranCell" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_NRCellDU" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +SELECT teiv_data.create_constraint_if_not_exists( + '1D71FC3BAE50E72552EAAC17B3B0C959B403E822', + 'PK_F3CAF5F2DDEBEEBA48316C708AD6E37BA12A6632', + 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "PK_F3CAF5F2DDEBEEBA48316C708AD6E37BA12A6632" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', + 'PK_F41873285F3BD831F63C6041B4356A063403406D', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '1D71FC3BAE50E72552EAAC17B3B0C959B403E822', + 'FK_6AF9FA81BF3F1D3374C021E5554012492FA32B72', + 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "FK_6AF9FA81BF3F1D3374C021E5554012492FA32B72" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '1D71FC3BAE50E72552EAAC17B3B0C959B403E822', + 'FK_D71E365C050B4B749155D43A16DCC01C12BFA055', + 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "FK_D71E365C050B4B749155D43A16DCC01C12BFA055" FOREIGN KEY ("bSide_EUtranCell") REFERENCES teiv_data."o-ran-smo-teiv-ran_EUtranCell" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', + 'FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', + 'FK_8605800A4923C52258A8CE3989E18A7C93D22E8C', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" (id) ON DELETE CASCADE;' +); + +CREATE INDEX IF NOT EXISTS "IDX_570AAD5BDC2B6A7DCCB840639DE232EE08D72534" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_6657C8783456D4F7FDD411B3B7FD1764E580AB80" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_0B76D3F42FB84D2D1E6B28774B52150174780BE4" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "horizontalBeamWidth" DECIMAL; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "verticalBeamWidth" DECIMAL; + +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); + +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'responsible_adapter', + 'PK_responsible_adapter_id', + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'responsible_adapter', + 'UNIQUE_responsible_adapter_hashed_id', + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' +); + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_metadata_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_metadata_SECTOR_GROUPS_EUTRANCELL" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_EUTRANCELL_USES_LTESECTORCARRIER" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_ODUFUNCTION" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ANTENNAMODULE_INSTALLED_AT_SITE" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_RESP_id_SECTOR_GROUPS_ANTENNAMODULE" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ENODEBFUNCTION_PROVIDES_EUTRANCELL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_RESP_id_SECTOR_GROUPS_EUTRANCELL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_EUTRANCELL_USES_LTESECTORCARRIER" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_LTESECTORCARRIER_USES_ANTENNACAPABILITY" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "REL_RESP_id_OCUCPFUNCTION_PROVIDES_NRCELLCU" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ODUFUNCTION_PROVIDES_NRCELLDU" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_RESP_id_SECTOR_GROUPS_NRCELLDU" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_NRCELLDU_USES_NRSECTORCARRIER" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_NRSECTORCARRIER_USES_ANTENNACAPABILITY" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA; + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_7B930D529570AED19AABDFA950EED794D4EB53CE', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_7B930D529570AED19AABDFA950EED794D4EB53CE" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_ODUFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_2A809BABCCE0A947D420653EF4EBD4707DA73B9F', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_2A809BABCCE0A947D420653EF4EBD4707DA73B9F" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_Site', + 'FK_o-ran-smo-teiv-equipment_Site_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_Site_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_AntennaCapability', + 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_F4EE618C98A1EB18212D9607E870E87B59690448', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_F4EE618C98A1EB18212D9607E870E87B59690448" FOREIGN KEY ("REL_RESP_id_ANTENNAMODULE_INSTALLED_AT_SITE") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_E2C830AB84CE31F71BBD0F91BBEFF66069A7E6B8', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E2C830AB84CE31F71BBD0F91BBEFF66069A7E6B8" FOREIGN KEY ("REL_RESP_id_SECTOR_GROUPS_ANTENNAMODULE") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_A7A12166DB3EC34E10F93FDD942A5DA916CBCFA0', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_A7A12166DB3EC34E10F93FDD942A5DA916CBCFA0" FOREIGN KEY ("REL_RESP_id_ENODEBFUNCTION_PROVIDES_EUTRANCELL") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_6F467D3CDA985248AEB010A0EDB1343A9173593E', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_6F467D3CDA985248AEB010A0EDB1343A9173593E" FOREIGN KEY ("REL_RESP_id_SECTOR_GROUPS_EUTRANCELL") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_2C1B8D1ECA6B4E645EF162522E6A5169CE7D7E9C', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_2C1B8D1ECA6B4E645EF162522E6A5169CE7D7E9C" FOREIGN KEY ("REL_RESP_id_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_B1CBA7F54C85E77DC96CD6531DB073B0EDCFF6BC', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_B1CBA7F54C85E77DC96CD6531DB073B0EDCFF6BC" FOREIGN KEY ("REL_RESP_id_EUTRANCELL_USES_LTESECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_B8F9FB1ADEBB9B35B6245684DE64775DE98442B4', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_B8F9FB1ADEBB9B35B6245684DE64775DE98442B4" FOREIGN KEY ("REL_RESP_id_LTESECTORCARRIER_USES_ANTENNACAPABILITY") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_323384A3617DC94F73FB225A3562EB93A05E976D', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_323384A3617DC94F73FB225A3562EB93A05E976D" FOREIGN KEY ("REL_RESP_id_OCUCPFUNCTION_PROVIDES_NRCELLCU") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-oam_ManagedElement', + 'FK_o-ran-smo-teiv-oam_ManagedElement_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_o-ran-smo-teiv-oam_ManagedElement_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_3F79604542DA97B9338CF6A5610ABC05E17153B4', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_3F79604542DA97B9338CF6A5610ABC05E17153B4" FOREIGN KEY ("REL_RESP_id_ODUFUNCTION_PROVIDES_NRCELLDU") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_01FDDC88AFC28623B49266BFA3FE0D2078988E88', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_01FDDC88AFC28623B49266BFA3FE0D2078988E88" FOREIGN KEY ("REL_RESP_id_SECTOR_GROUPS_NRCELLDU") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'FK_1D23F428960B9279D29AC35A946D0C60CAFE638E', + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_1D23F428960B9279D29AC35A946D0C60CAFE638E" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'FK_2356BAEED80FD88699DCCD85993162818C9BD0A1', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_2356BAEED80FD88699DCCD85993162818C9BD0A1" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', + 'FK_09C96C0397884B6E28EEBE17565CE2DF7535E380', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_09C96C0397884B6E28EEBE17565CE2DF7535E380" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_229725A1E5A342C3E7579273F54AD9B209CE0770', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_229725A1E5A342C3E7579273F54AD9B209CE0770" FOREIGN KEY ("REL_RESP_id_ODUFUNCTION_PROVIDES_NRSECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_CD383C61EDAA5A8E84DCB423E1378E3173D585E7', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_CD383C61EDAA5A8E84DCB423E1378E3173D585E7" FOREIGN KEY ("REL_RESP_id_NRCELLDU_USES_NRSECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_EEF72E2F5B0421B04A5129F44B6740CE35EB7D7B', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_EEF72E2F5B0421B04A5129F44B6740CE35EB7D7B" FOREIGN KEY ("REL_RESP_id_NRSECTORCARRIER_USES_ANTENNACAPABILITY") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'FK_8B083C6C2AF2BA35E20AE16A4D0702373C5B5D4D', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_8B083C6C2AF2BA35E20AE16A4D0702373C5B5D4D" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_Sector', + 'FK_o-ran-smo-teiv-ran_Sector_RESP_id', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '1D71FC3BAE50E72552EAAC17B3B0C959B403E822', + 'FK_3EB2B0A0A4405454550AED663948D4DD77AD3B77', + 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "FK_3EB2B0A0A4405454550AED663948D4DD77AD3B77" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);' +); + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_dUpLMNId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBDUId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBIdLength" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_dUpLMNId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_gNBDUId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_gNBId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_gNBIdLength" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBCUName" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBIdLength" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_pLMNId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBCUName" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBIdLength" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_pLMNId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RESP_geo-location" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RESP_name" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RI_geo-location" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RI_name" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_eUtranFqBands" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_geranFqBands" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_nRFqBands" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RI_eUtranFqBands" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RI_geranFqBands" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RI_nRFqBands" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_antennaBeamWidth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_antennaModelNumber" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_azimuth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_electricalAntennaTilt" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_geo-location" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_horizontalBeamWidth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_mechanicalAntennaBearing" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_mechanicalAntennaTilt" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_positionWithinSector" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_totalTilt" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_verticalBeamWidth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_antennaBeamWidth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_antennaModelNumber" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_azimuth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_electricalAntennaTilt" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_geo-location" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_horizontalBeamWidth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_mechanicalAntennaBearing" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_mechanicalAntennaTilt" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_positionWithinSector" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_totalTilt" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_verticalBeamWidth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_cellId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_channelBandwidth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_dlChannelBandwidth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_duplexType" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_earfcn" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_earfcndl" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_earfcnul" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_tac" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_cellId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_channelBandwidth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_dlChannelBandwidth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_duplexType" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_earfcn" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_earfcndl" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_earfcnul" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_tac" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_sectorCarrierType" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "RI_sectorCarrierType" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_cellLocalId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_nCI" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_nRTAC" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_plmnId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_cellLocalId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_nCI" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_nRTAC" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_plmnId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_cellLocalId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_nCI" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_nRPCI" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_nRTAC" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_cellLocalId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_nCI" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_nRPCI" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_nRTAC" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBIdLength" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBIdLength" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_arfcnDL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_arfcnUL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_bSChannelBwDL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_frequencyDL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_frequencyUL" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_arfcnDL" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_arfcnUL" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_bSChannelBwDL" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_frequencyDL" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_frequencyUL" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RESP_eNBId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RESP_eNodeBPlmnId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RI_eNBId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RI_eNodeBPlmnId" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_azimuth" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_geo-location" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_sectorId" BYTEA; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RI_azimuth" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RI_geo-location" teiv_data."Reliability"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RI_sectorId" teiv_data."Reliability"; + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_dUpLMNId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_dUpLMNId" FOREIGN KEY ("RESP_dUpLMNId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBDUId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBDUId" FOREIGN KEY ("RESP_gNBDUId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBId" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ODUFunction', + 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBIdLength', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBIdLength" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBCUName', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBCUName" FOREIGN KEY ("RESP_gNBCUName") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBId" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBIdLength', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBIdLength" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_pLMNId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_pLMNId" FOREIGN KEY ("RESP_pLMNId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_Site', + 'FK_o-ran-smo-teiv-equipment_Site_RESP_geo-location', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_Site_RESP_geo-location" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_Site', + 'FK_o-ran-smo-teiv-equipment_Site_RESP_name', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_Site_RESP_name" FOREIGN KEY ("RESP_name") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_AntennaCapability', + 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_eUtranFqBands', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_eUtranFqBands" FOREIGN KEY ("RESP_eUtranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_AntennaCapability', + 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_geranFqBands', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_geranFqBands" FOREIGN KEY ("RESP_geranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_AntennaCapability', + 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_nRFqBands', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_nRFqBands" FOREIGN KEY ("RESP_nRFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_antennaBeamWidth', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_antennaBeamWidth" FOREIGN KEY ("RESP_antennaBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_9F8C83A98E46570C846E83D0F220A05357E2007B', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_9F8C83A98E46570C846E83D0F220A05357E2007B" FOREIGN KEY ("RESP_antennaModelNumber") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_azimuth', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_azimuth" FOREIGN KEY ("RESP_azimuth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_4A737D290E8E8B656C1794065E9B16D0E536E1C8', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_4A737D290E8E8B656C1794065E9B16D0E536E1C8" FOREIGN KEY ("RESP_electricalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_geo-location', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_geo-location" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_C4A0358503DD39D9CB99E3632B2E1E1C337A37CB', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_C4A0358503DD39D9CB99E3632B2E1E1C337A37CB" FOREIGN KEY ("RESP_horizontalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_1DC2D3CF0DE253BABBF39A6E95711C96AA6EF1DC', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_1DC2D3CF0DE253BABBF39A6E95711C96AA6EF1DC" FOREIGN KEY ("RESP_mechanicalAntennaBearing") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_2B6558634445CBA8724FFE8D3E651761E260C91A', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_2B6558634445CBA8724FFE8D3E651761E260C91A" FOREIGN KEY ("RESP_mechanicalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_9E7F6B8B5829210351BD81048A305F97BF3E71E6', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_9E7F6B8B5829210351BD81048A305F97BF3E71E6" FOREIGN KEY ("RESP_positionWithinSector") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_totalTilt', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_totalTilt" FOREIGN KEY ("RESP_totalTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-equipment_AntennaModule', + 'FK_DF761BBEA829AC0658C2D49D290E500CB71546B7', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_DF761BBEA829AC0658C2D49D290E500CB71546B7" FOREIGN KEY ("RESP_verticalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_cellId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_cellId" FOREIGN KEY ("RESP_cellId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_channelBandwidth', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_channelBandwidth" FOREIGN KEY ("RESP_channelBandwidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_dlChannelBandwidth', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_dlChannelBandwidth" FOREIGN KEY ("RESP_dlChannelBandwidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_duplexType', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_duplexType" FOREIGN KEY ("RESP_duplexType") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcn', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcn" FOREIGN KEY ("RESP_earfcn") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcndl', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcndl" FOREIGN KEY ("RESP_earfcndl") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcnul', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcnul" FOREIGN KEY ("RESP_earfcnul") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_EUtranCell', + 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_tac', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_tac" FOREIGN KEY ("RESP_tac") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_LTESectorCarrier', + 'FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_sectorCarrierType', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_sectorCarrierType" FOREIGN KEY ("RESP_sectorCarrierType") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_cellLocalId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_cellLocalId" FOREIGN KEY ("RESP_cellLocalId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nCI', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nCI" FOREIGN KEY ("RESP_nCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nRTAC', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nRTAC" FOREIGN KEY ("RESP_nRTAC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellCU', + 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_plmnId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_plmnId" FOREIGN KEY ("RESP_plmnId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_cellLocalId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_cellLocalId" FOREIGN KEY ("RESP_cellLocalId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nCI', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nCI" FOREIGN KEY ("RESP_nCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRPCI', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRPCI" FOREIGN KEY ("RESP_nRPCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRCellDU', + 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRTAC', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRTAC" FOREIGN KEY ("RESP_nRTAC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBId" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBIdLength', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBIdLength" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnDL', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnDL" FOREIGN KEY ("RESP_arfcnDL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnUL', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnUL" FOREIGN KEY ("RESP_arfcnUL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_bSChannelBwDL', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_bSChannelBwDL" FOREIGN KEY ("RESP_bSChannelBwDL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyDL', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyDL" FOREIGN KEY ("RESP_frequencyDL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_NRSectorCarrier', + 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyUL', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyUL" FOREIGN KEY ("RESP_frequencyUL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNBId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNBId" FOREIGN KEY ("RESP_eNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_ENodeBFunction', + 'FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNodeBPlmnId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNodeBPlmnId" FOREIGN KEY ("RESP_eNodeBPlmnId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_Sector', + 'FK_o-ran-smo-teiv-ran_Sector_RESP_azimuth', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_azimuth" FOREIGN KEY ("RESP_azimuth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_Sector', + 'FK_o-ran-smo-teiv-ran_Sector_RESP_geo-location', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_geo-location" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'o-ran-smo-teiv-ran_Sector', + 'FK_o-ran-smo-teiv-ran_Sector_RESP_sectorId', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_sectorId" FOREIGN KEY ("RESP_sectorId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +CREATE INDEX IF NOT EXISTS "IDX_A5A6D0F976F10334CBD2DEDBDB6894BF8720157B" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_E4D4598CF15FD8AF9AE91F3647A8D943E1A51E8C" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_metadata" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_metadata" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_B309F56A2389CE1A1CD82B4982F98F7F3B50570E" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE"); + +CREATE INDEX IF NOT EXISTS "IDX_0B4648D289B22EAA16B21BE4505F49850AC018C9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_metadata_SECTOR_GROUPS_ANTENNAMODULE"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_metadata" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_82B09F9D6370B2F07855F70042BA1B0ED782167D" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_metadata_ENODEBFUNCTION_PROVIDES_EUTRANCELL"); + +CREATE INDEX IF NOT EXISTS "IDX_C4728AE1A440E5C3670B4B691213C163D805CD84" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_metadata_SECTOR_GROUPS_EUTRANCELL"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_EUtranCell_metadata" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_9966F4C45B258EBA701CE9C1564152885FE3251A" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_19ABF252C4E09016A6FA24AA27724311226C554D" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_metadata_EUTRANCELL_USES_LTESECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_5D51C73E247073756AE9185C219303E004250431" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_metadata" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_9F6548916831A3F9771008367D58936D21C30423" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_metadata" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_metadata" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_C731749DB013DA392D5010E566ACA0961D9A6535" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU"); + +CREATE INDEX IF NOT EXISTS "IDX_BE5B953B9861DD77A9096198E375074251030653" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_metadata_SECTOR_GROUPS_NRCELLDU"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_metadata" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_FE8D81BC4BD1C54D860A934A4484326AAFF02726" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_4E84A0C18434550C0096F1EE2695DF5952826EA4" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_E1F96D2B0519812654B5A3D95B8F0E90C0FBDA55" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_5B3F8D2AA421A4F7084B428387F4BFABE236A936" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_21B2E5B5220DC3FDF12D6E481F0E672B5B034BCA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_metadata_NRCELLDU_USES_NRSECTORCARRIER"); + +CREATE INDEX IF NOT EXISTS "IDX_20C83B7E7A4AFBA974AFBF99A0ED1A398F5C11D3" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_metadata" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_943E4F35504A6F925ADA7C609CE639875C09C949" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_metadata" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_24F125BEB2D7C718FA6F2634178AA92F7F71D95A" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN ("metadata"); + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_ODUFUNCTION"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" DROP COLUMN IF EXISTS "REL_updated_time_ANTENNAMODULE_INSTALLED_AT_SITE"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" DROP COLUMN IF EXISTS "REL_updated_time_SECTOR_GROUPS_ANTENNAMODULE"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" DROP COLUMN IF EXISTS "REL_updated_time_ENODEBFUNCTION_PROVIDES_EUTRANCELL"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" DROP COLUMN IF EXISTS "REL_updated_time_SECTOR_GROUPS_EUTRANCELL"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_EUTRANCELL_USES_LTESECTORCARRIER"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_LTESECTORCARRIER_USES_ANTENNACAPABILITY"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" DROP COLUMN IF EXISTS "REL_updated_time_OCUCPFUNCTION_PROVIDES_NRCELLCU"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" DROP COLUMN IF EXISTS "REL_updated_time_ODUFUNCTION_PROVIDES_NRCELLDU"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" DROP COLUMN IF EXISTS "REL_updated_time_SECTOR_GROUPS_NRCELLDU"; + +ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_NRCELLDU_USES_NRSECTORCARRIER"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_NRSECTORCARRIER_USES_ANTENNACAPABILITY"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"; + +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" DROP COLUMN IF EXISTS "updated_time"; + +ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" DROP COLUMN IF EXISTS "updated_time"; + +CREATE TABLE IF NOT EXISTS teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ( + "id" TEXT, + "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, + "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA +); + +ALTER TABLE ONLY teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ( + "id" TEXT, + "sectorCarrierType" TEXT, + "RI_sectorCarrierType" teiv_data."Reliability", + "RESP_sectorCarrierType" BYTEA, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA, + "REL_FK_used-antennaCapability" TEXT, + "REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64" TEXT, + "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" jsonb, + "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5" jsonb, + "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" jsonb, + "REL_metadata_F723867781098568079DD82E5D5E529374F97E98" jsonb, + "REL_RESP_id_927D105F3F1EA229D51FB9D2C90C6D5727FB3F7B" BYTEA +); + +ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ( + "id" TEXT, + "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, + "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA +); + +ALTER TABLE ONLY teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ( + "id" TEXT, + "antennaBeamWidth" jsonb, + "antennaModelNumber" TEXT, + "azimuth" DECIMAL, + "electricalAntennaTilt" INTEGER, + "geo-location" geography, + "horizontalBeamWidth" DECIMAL, + "mechanicalAntennaBearing" INTEGER, + "mechanicalAntennaTilt" INTEGER, + "positionWithinSector" TEXT, + "totalTilt" INTEGER, + "verticalBeamWidth" DECIMAL, + "RI_antennaBeamWidth" teiv_data."Reliability", + "RESP_antennaBeamWidth" BYTEA, + "RI_antennaModelNumber" teiv_data."Reliability", + "RESP_antennaModelNumber" BYTEA, + "RI_azimuth" teiv_data."Reliability", + "RESP_azimuth" BYTEA, + "RI_electricalAntennaTilt" teiv_data."Reliability", + "RESP_electricalAntennaTilt" BYTEA, + "RI_geo-location" teiv_data."Reliability", + "RESP_geo-location" BYTEA, + "RI_horizontalBeamWidth" teiv_data."Reliability", + "RESP_horizontalBeamWidth" BYTEA, + "RI_mechanicalAntennaBearing" teiv_data."Reliability", + "RESP_mechanicalAntennaBearing" BYTEA, + "RI_mechanicalAntennaTilt" teiv_data."Reliability", + "RESP_mechanicalAntennaTilt" BYTEA, + "RI_positionWithinSector" teiv_data."Reliability", + "RESP_positionWithinSector" BYTEA, + "RI_totalTilt" teiv_data."Reliability", + "RESP_totalTilt" BYTEA, + "RI_verticalBeamWidth" teiv_data."Reliability", + "RESP_verticalBeamWidth" BYTEA, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA +); + +ALTER TABLE ONLY teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ( + "id" TEXT, + "eUtranFqBands" jsonb, + "geranFqBands" jsonb, + "nRFqBands" jsonb, + "RI_eUtranFqBands" teiv_data."Reliability", + "RESP_eUtranFqBands" BYTEA, + "RI_geranFqBands" teiv_data."Reliability", + "RESP_geranFqBands" BYTEA, + "RI_nRFqBands" teiv_data."Reliability", + "RESP_nRFqBands" BYTEA, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA +); + +ALTER TABLE ONLY teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ( + "id" TEXT, + "dUpLMNId" jsonb, + "gNBDUId" BIGINT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "RI_dUpLMNId" teiv_data."Reliability", + "RESP_dUpLMNId" BYTEA, + "RI_gNBDUId" teiv_data."Reliability", + "RESP_gNBDUId" BYTEA, + "RI_gNBId" teiv_data."Reliability", + "RESP_gNBId" BYTEA, + "RI_gNBIdLength" teiv_data."Reliability", + "RESP_gNBIdLength" BYTEA, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B" TEXT, + "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" jsonb, + "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" jsonb, + "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" jsonb, + "REL_metadata_72494257260B57223C09828D7C3B31D203B050B4" jsonb, + "REL_RESP_id_B327AD97E459B9904E24439FF4F9A442165DD1C0" BYTEA +); + +ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ( + "id" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA, + "REL_FK_used-nrCellDu" TEXT, + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU" TEXT, + "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4" jsonb, + "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD" jsonb, + "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" jsonb, + "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB" jsonb, + "REL_RESP_id_16BDFF7861A21C39988A1CE8BF89B1816C8754FC" BYTEA +); + +ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ( + "id" TEXT, + "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, + "bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA +); + +ALTER TABLE ONLY teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ( + "id" TEXT, + "020335B0F627C169E24167748C38FE756FB34AE2" INTEGER, + "nCI" BIGINT, + "nRPCI" INTEGER, + "nRTAC" INTEGER, + "RI_6022A4C8771F6FCB03972F8966C1AD11DB9AD215" teiv_data."Reliability", + "RESP_958686CF1CBC168C2ED063F6645F06556C76DC3B" BYTEA, + "RI_nCI" teiv_data."Reliability", + "RESP_nCI" BYTEA, + "RI_nRPCI" teiv_data."Reliability", + "RESP_nRPCI" BYTEA, + "RI_nRTAC" teiv_data."Reliability", + "RESP_nRTAC" BYTEA, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb, + "RESP_id" BYTEA, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F" TEXT, + "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" jsonb, + "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052" jsonb, + "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" jsonb, + "REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A" jsonb, + "REL_RESP_id_3E560656C6590F0E2C4BAD9653CE371CF29D2D08" BYTEA +); + +ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" SET DEFAULT '{}'; + +SELECT teiv_data.create_constraint_if_not_exists( + '09D47DF128202AB535BC2056D7C0952F6EE7AF2D', + 'PK_8123C74A8D9A873F330C37E370DB951212243844', + 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "PK_8123C74A8D9A873F330C37E370DB951212243844" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B', + 'PK_61C7969B1B7C806E01CE3D9471CFF52FA37864C3', + 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "PK_61C7969B1B7C806E01CE3D9471CFF52FA37864C3" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '98D95275440120DC7A5FEF7E870FB6649F275AEC', + 'PK_48BAB21388EA2B1BE83EF5D3FC143807776A882D', + 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "PK_48BAB21388EA2B1BE83EF5D3FC143807776A882D" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'PK_8EB1724D91D554E7771C8C5AE5AA752A604E025C', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "PK_8EB1724D91D554E7771C8C5AE5AA752A604E025C" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AA68071F5A253FC68706DC4244B2EEEDCFA4F477', + 'PK_AE71D2F6E7DABC3C066CEB9E1F30286DE8AF12D0', + 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "PK_AE71D2F6E7DABC3C066CEB9E1F30286DE8AF12D0" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'PK_BEBBD904815CB84D3D7D326B13A71BC786E8C2B6', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "PK_BEBBD904815CB84D3D7D326B13A71BC786E8C2B6" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'C9475FE40C02BEB41F720B4284A856F2CF49E1F3', + 'PK_AD1799D4203C08DE10524497B4997C2DCB4F6A92', + 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "PK_AD1799D4203C08DE10524497B4997C2DCB4F6A92" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'E2D2B450D65F1FF241A983CBB43B54C040969908', + 'PK_E078962EDFAEDBC93784222B0B7BDFC3929D4D79', + 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "PK_E078962EDFAEDBC93784222B0B7BDFC3929D4D79" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'PK_94DB80CFD01964A5D56BC22F433BBAF282F5AB0E', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "PK_94DB80CFD01964A5D56BC22F433BBAF282F5AB0E" PRIMARY KEY ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '09D47DF128202AB535BC2056D7C0952F6EE7AF2D', + 'FK_1A5303EF43A4407B0A47C80B9EF3DCA81FEA484A', + 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "FK_1A5303EF43A4407B0A47C80B9EF3DCA81FEA484A" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '09D47DF128202AB535BC2056D7C0952F6EE7AF2D', + 'FK_AAB4A7CE5DD41A0CAEFA20B7538F2B851529E327', + 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "FK_AAB4A7CE5DD41A0CAEFA20B7538F2B851529E327" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '09D47DF128202AB535BC2056D7C0952F6EE7AF2D', + 'FK_A5E880C59CF224776E30855EBDF62B6E98C5D127', + 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "FK_A5E880C59CF224776E30855EBDF62B6E98C5D127" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B', + 'FK_53502FA0D6ADEA6C33D6DB99A53D6F3100E9E288', + 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_53502FA0D6ADEA6C33D6DB99A53D6F3100E9E288" FOREIGN KEY ("RESP_sectorCarrierType") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B', + 'FK_100298449AA5ACC1F08DB20BC65868C337E9C333', + 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_100298449AA5ACC1F08DB20BC65868C337E9C333" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B', + 'FK_778741F2AA29B57611EB06A903D58099245BB537', + 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_778741F2AA29B57611EB06A903D58099245BB537" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B', + 'UNIQUE_523F8C2098EA2DE66650F9CCA7713124C14D63DF', + 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "UNIQUE_523F8C2098EA2DE66650F9CCA7713124C14D63DF" UNIQUE ("REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B', + 'FK_CD80909E7C7B2A0958E7D96DD4AE1EEA9B85205C', + 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_CD80909E7C7B2A0958E7D96DD4AE1EEA9B85205C" FOREIGN KEY ("REL_RESP_id_927D105F3F1EA229D51FB9D2C90C6D5727FB3F7B") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '98D95275440120DC7A5FEF7E870FB6649F275AEC', + 'FK_CF5ED6B6F3D98A44BCF9209A20D9C901F5C3C23E', + 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "FK_CF5ED6B6F3D98A44BCF9209A20D9C901F5C3C23E" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '98D95275440120DC7A5FEF7E870FB6649F275AEC', + 'FK_FA290CAE2E1C24893F90877F0EDF7304CD6D4563', + 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "FK_FA290CAE2E1C24893F90877F0EDF7304CD6D4563" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '98D95275440120DC7A5FEF7E870FB6649F275AEC', + 'FK_58D8B5F4AF4FC229F23B545470E43B8E7C69B75F', + 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "FK_58D8B5F4AF4FC229F23B545470E43B8E7C69B75F" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_01962D77F25A6FD76223BE654784268BF60CD712', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_01962D77F25A6FD76223BE654784268BF60CD712" FOREIGN KEY ("RESP_antennaBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_F7844BAF6629C2103757E04A38C12A2F20500A15', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_F7844BAF6629C2103757E04A38C12A2F20500A15" FOREIGN KEY ("RESP_antennaModelNumber") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_5EB4306AB1BB07F1902717B5C845B689F479B0C8', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_5EB4306AB1BB07F1902717B5C845B689F479B0C8" FOREIGN KEY ("RESP_azimuth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_7D30EF0E91E5821108E28C244D8F200A9F6EF171', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_7D30EF0E91E5821108E28C244D8F200A9F6EF171" FOREIGN KEY ("RESP_electricalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_7BB08E9AF9BC6AA4AA3709504D5D9D859446E7EC', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_7BB08E9AF9BC6AA4AA3709504D5D9D859446E7EC" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_AA75893038D9D2DFC5276DD64C5B89545B59A85D', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_AA75893038D9D2DFC5276DD64C5B89545B59A85D" FOREIGN KEY ("RESP_horizontalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_F4A7E5AE0D0197F17A3BF498BFF708E04EA702FE', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_F4A7E5AE0D0197F17A3BF498BFF708E04EA702FE" FOREIGN KEY ("RESP_mechanicalAntennaBearing") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_1BBB2773C56AC17AF4F81E8CE86181C61F4E28D0', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_1BBB2773C56AC17AF4F81E8CE86181C61F4E28D0" FOREIGN KEY ("RESP_mechanicalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_166C6D1792E0FCE19E3F6AA5705219094678406F', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_166C6D1792E0FCE19E3F6AA5705219094678406F" FOREIGN KEY ("RESP_positionWithinSector") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_E891C64DBCC7E495419938DBD17B967635EA9921', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_E891C64DBCC7E495419938DBD17B967635EA9921" FOREIGN KEY ("RESP_totalTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_CC36D660526D1C767F26A3544B6B473417B0EE94', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_CC36D660526D1C767F26A3544B6B473417B0EE94" FOREIGN KEY ("RESP_verticalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974', + 'FK_2B3186DA8B7B260F570B6482C815A75147876AAC', + 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_2B3186DA8B7B260F570B6482C815A75147876AAC" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AA68071F5A253FC68706DC4244B2EEEDCFA4F477', + 'FK_369392B0C4A062C140E858C9400C0E744F0AC68B', + 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_369392B0C4A062C140E858C9400C0E744F0AC68B" FOREIGN KEY ("RESP_eUtranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AA68071F5A253FC68706DC4244B2EEEDCFA4F477', + 'FK_BDB6F82FFAC7E705C7D5D88643B77E36B2B9C4A7', + 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_BDB6F82FFAC7E705C7D5D88643B77E36B2B9C4A7" FOREIGN KEY ("RESP_geranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AA68071F5A253FC68706DC4244B2EEEDCFA4F477', + 'FK_5ED96C3949F44E73C1F4EB9E8808FF79627A4E9D', + 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_5ED96C3949F44E73C1F4EB9E8808FF79627A4E9D" FOREIGN KEY ("RESP_nRFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AA68071F5A253FC68706DC4244B2EEEDCFA4F477', + 'FK_DD48083834253B9A506780AB5EC36078B571553C', + 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_DD48083834253B9A506780AB5EC36078B571553C" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_7186222B8E58F2BA404053317F6B750832B7AEBB', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_7186222B8E58F2BA404053317F6B750832B7AEBB" FOREIGN KEY ("RESP_dUpLMNId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_F52167D7632035FBC133091B80F9DEE9E37ABD69', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_F52167D7632035FBC133091B80F9DEE9E37ABD69" FOREIGN KEY ("RESP_gNBDUId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_970FEC4332A2D5BBA9EB1398FE0F5FAD455D7EE3', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_970FEC4332A2D5BBA9EB1398FE0F5FAD455D7EE3" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_0AB6F974D9D18A47E4FDCEB6C4260AC2A62218BD', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_0AB6F974D9D18A47E4FDCEB6C4260AC2A62218BD" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_71C5B9A055FF4C3CB37CB920A7442FC5411F7BCE', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_71C5B9A055FF4C3CB37CB920A7442FC5411F7BCE" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_4ADA30B48EB5107E0F730EB9684B5545524ADB42', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_4ADA30B48EB5107E0F730EB9684B5545524ADB42" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'UNIQUE_EFB77EDE9661E3C6826E575AB125FD4F8FCD3BE1', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "UNIQUE_EFB77EDE9661E3C6826E575AB125FD4F8FCD3BE1" UNIQUE ("REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'AD6AA1B5E225BBC96B792246D095340747056399', + 'FK_419715A9297507DFE5165617FB4D8827AEBF3A9A', + 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_419715A9297507DFE5165617FB4D8827AEBF3A9A" FOREIGN KEY ("REL_RESP_id_B327AD97E459B9904E24439FF4F9A442165DD1C0") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'C9475FE40C02BEB41F720B4284A856F2CF49E1F3', + 'FK_743B8A7D8779674BDBA042C099462FFE7BFFBDBB', + 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "FK_743B8A7D8779674BDBA042C099462FFE7BFFBDBB" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'C9475FE40C02BEB41F720B4284A856F2CF49E1F3', + 'FK_15CBD840591824744326C05E2FC38C9ABE9A197E', + 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "FK_15CBD840591824744326C05E2FC38C9ABE9A197E" FOREIGN KEY ("REL_FK_used-nrCellDu") REFERENCES teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'C9475FE40C02BEB41F720B4284A856F2CF49E1F3', + 'UNIQUE_C40364D44BC6DFCB468EEE1A8FB42BDB71D94114', + 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "UNIQUE_C40364D44BC6DFCB468EEE1A8FB42BDB71D94114" UNIQUE ("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'C9475FE40C02BEB41F720B4284A856F2CF49E1F3', + 'FK_B2748BFFCFCEE7C9AE54A3BACFF9052A7BE3E626', + 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "FK_B2748BFFCFCEE7C9AE54A3BACFF9052A7BE3E626" FOREIGN KEY ("REL_RESP_id_16BDFF7861A21C39988A1CE8BF89B1816C8754FC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'E2D2B450D65F1FF241A983CBB43B54C040969908', + 'FK_8ABF058C19072591C1000BDDD52FF17F488DCF24', + 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "FK_8ABF058C19072591C1000BDDD52FF17F488DCF24" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'E2D2B450D65F1FF241A983CBB43B54C040969908', + 'FK_37802898775B4197154F9DA54F8B7946A3C735BA', + 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "FK_37802898775B4197154F9DA54F8B7946A3C735BA" FOREIGN KEY ("bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC") REFERENCES teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'E2D2B450D65F1FF241A983CBB43B54C040969908', + 'FK_A52435BCC8CAF93A5852E912203F3A76ACE9FA35', + 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "FK_A52435BCC8CAF93A5852E912203F3A76ACE9FA35" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_E958432C9E761168561ACE1E78B21A7AF92580C6', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_E958432C9E761168561ACE1E78B21A7AF92580C6" FOREIGN KEY ("RESP_958686CF1CBC168C2ED063F6645F06556C76DC3B") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_8CB88A1C0F652B51FD9845C4F564A272A4F58422', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_8CB88A1C0F652B51FD9845C4F564A272A4F58422" FOREIGN KEY ("RESP_nCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_3C034AD8F98A5E741F962CFC406F48EECD096DB8', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_3C034AD8F98A5E741F962CFC406F48EECD096DB8" FOREIGN KEY ("RESP_nRPCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_74E499FB900CBFFBCB389A24AC99CD5CE92A5144', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_74E499FB900CBFFBCB389A24AC99CD5CE92A5144" FOREIGN KEY ("RESP_nRTAC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_FA12E9B91FE138393C518269329D9262104DAD7A', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_FA12E9B91FE138393C518269329D9262104DAD7A" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_500A088A217D3F8B505A8F408076BB5AD265AF63', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_500A088A217D3F8B505A8F408076BB5AD265AF63" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ("id");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'UNIQUE_6C7164EC5E639D7E0D833D3C4E0CAB85062EE418', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "UNIQUE_6C7164EC5E639D7E0D833D3C4E0CAB85062EE418" UNIQUE ("REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F");' +); + +SELECT teiv_data.create_constraint_if_not_exists( + 'F93C2CA075353668A76B4718E07B741ACCD83641', + 'FK_0C3F721FF39EBC5118835710D0C088C8E3328FF1', + 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_0C3F721FF39EBC5118835710D0C088C8E3328FF1" FOREIGN KEY ("REL_RESP_id_3E560656C6590F0E2C4BAD9653CE371CF29D2D08") REFERENCES teiv_data."responsible_adapter" ("hashed_id");' +); + +CREATE INDEX IF NOT EXISTS "IDX_8A2A0ABA5E6ACAA8EF991E5B983551524A679509" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_07C2D9F67E32FD07A927D1DF5F06734D7F89DBA0" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_58D33C1960633F6CAA5F7E0A9880FF85D5923BF7" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_EA883FE1AB208DC033513D76B1414014FE4D1397" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_53A525F2FE3F291B4F2B234FE4EC799C778A8687" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_8F5A022153912D07D92FCE34FA9E754E0163F818" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_83EEB2F630BDBBF7BE7E8BBFA452D7F2AB69EB69" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_77A2303E82E9B9B4A9D61BE7C4F1B6088C40A04E" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_DBBF1D30DCD311E5D9D17524730BBF38DEB8BBF8" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_D8626C46F2134489869EC9F70A2F3960D37BA656" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_97C1311E85CBA88A2048A17CC3A91406A13A162A" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC"); + +CREATE INDEX IF NOT EXISTS "IDX_52840EAF2D41B89AC3CE825BC9B0D9AC35AEFC5C" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("REL_metadata_F723867781098568079DD82E5D5E529374F97E98"); + +CREATE INDEX IF NOT EXISTS "IDX_13E530F00B0D405F58CDA235146715762EF6DF91" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_B6911D7B07CE9E7CF692209760002ABD15DA8CD9" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_4D253E190E8502C2DE0DC0E2A7A758EA8A5E5888" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_A04886514310E5B31E206923891CD213D9A5CEE6" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_452AE5B87383D94C9B188FBA8BBDA09B8A7E73B4" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_52B1FEA89EC725EA6195DBD272ED9983E98B99CB" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_35E57E345ABB0D6A9CD6D8FBDBC620646C046669" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_8B5018C20A65AC6FFF6E9B4C099B8F18058B3533" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_54DC74991A70957B0CEBAA38200F3059ECCABDEC" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_C9652A1BD1F6441ECBDB38922226AD08D7DDD60D" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_41A2CB8C648BE9B006CB04631C440F71DA6A61C3" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_49AB1B81ED859FE4A0F148617CB3E11454E05EAA" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_CD2038615C829FA3EC5520DEF04DEBAD87DB7B57" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_7470F8E4355FEDE440D3CEB831E05AF350B8144B" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_3D44AB1602F5AA87FAF39E6F596888419F723F47" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_9532CB2D7B71297C7279D2E824DBE655331B5220" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_00624177EC65536001DDF0477A8F698B871C142D" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("dUpLMNId"); + +CREATE INDEX IF NOT EXISTS "IDX_241D90708F29A60824E2A63C86D9AB84E611E505" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_98C227150239A7692514F1FDF5E3F49FC4439357" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_F308FB8D16B912769597B9678466ADB19BAA27B2" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_9EC8D13EBFB1E513FD4F18C284AD66FA6751E2BC" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_0B9A243313790591EFA74660F1863924EE8CCB6C" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_3FF5E0D439B273B25E65C4EC6E4682E5F8AE9D79" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_DC5DA06087B85C01A975848202AC386694598D78" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B"); + +CREATE INDEX IF NOT EXISTS "IDX_40D54F003F8A66E82DFC0BE377ADEFF1A8EAE78D" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("REL_metadata_72494257260B57223C09828D7C3B31D203B050B4"); + +CREATE INDEX IF NOT EXISTS "IDX_36D40805D5D41247C46C23AF06A399E7CDC46EDD" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_18D66A31B8B88551ADA98E4BC6362B71A504CE1B" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_245803DDE5BD5AB2780BB277649AE40CA8F4E145" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_CDD068E13765C799B6503561CB0FAC5638B22C70" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_3EEEE6049314C502989CA49A6050FC40898889D1" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_40A0F4A77264E4DD55EBA83EB2270B21E79F48FF" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_4520B8DC811185D63D0E415F4E0AED4DC9967219" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92"); + +CREATE INDEX IF NOT EXISTS "IDX_6E7F02AC7C81800C688BB46D2639CBABFB376239" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB"); + +CREATE INDEX IF NOT EXISTS "IDX_C4B686BC6CAF76EADC031DCCC15CBA7C3F81427C" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_44B101C83E01F881D34B98CFB68E980DF4AF9A96" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_7C35D9F162CB5D2DA8BF96C1F076C9C55EC7CA96" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_2905D52A1A6E49FD9E984F4AD978144B6309C86F" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_E909484E1251C6944EE877CB737E07475884A1AE" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_14454BB7AC41220815C5885AD1B3DB72F8089315" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_3C1344FC931EF89522B673948D541FD73E375C4F" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("CD_decorators"); + +CREATE INDEX IF NOT EXISTS "IDX_BBF662FB069D121A65DCE5A46DAC3185B9A6D9A4" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("metadata"); + +CREATE INDEX IF NOT EXISTS "IDX_1161D2AF3E3B8B7503469AFF6E3DA87B4D66F852" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_4F93EF555F8640ADA220F02F1434AF29A96F85F2" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_17F56568BFFACD4F9F2E6372407CE7F8FA06AF17" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("REL_CD_0AC0D382E4274681870EC7319460192F4F603001"); + +CREATE INDEX IF NOT EXISTS "IDX_6DDF32177944AAEDACB2123D05680F3B3B9BD4C7" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A"); + +ANALYZE teiv_data."o-ran-smo-teiv-ran_ODUFunction"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction"; + +ANALYZE teiv_data."o-ran-smo-teiv-equipment_Site"; + +ANALYZE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3"; + +ANALYZE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC"; + +ANALYZE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974"; + +ANALYZE teiv_data."o-ran-smo-teiv-oam_ManagedElement"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellDU"; + +ANALYZE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction"; + +ANALYZE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; + +ANALYZE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_AntennaCapability"; + +ANALYZE teiv_data."o-ran-smo-teiv-equipment_AntennaModule"; + +ANALYZE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_EUtranCell"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellCU"; + +ANALYZE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641"; + +ANALYZE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; + +ANALYZE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477"; + +ANALYZE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction"; + +ANALYZE teiv_data."o-ran-smo-teiv-ran_Sector"; + +ANALYZE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822"; + +COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql b/teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql new file mode 100644 index 0000000..f633b48 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql @@ -0,0 +1,667 @@ +-- +-- ============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; + +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO :pguser; +SET default_tablespace = ''; +SET default_table_access_method = heap; + +SET ROLE :pguser; + +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( + "name" TEXT PRIMARY KEY, + "hashedValue" VARCHAR(63) NOT NULL, + "type" VARCHAR(511) +); + +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( + "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 teiv_model.entity_info ( + "storedAt" TEXT PRIMARY KEY, + "name" TEXT NOT NULL, + "moduleReferenceName" TEXT NOT NULL, + "attributeNames" jsonb DEFAULT '[]'::jsonb, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( + "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 teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE +); + +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; +CD_classifiers CD_classifiers COLUMN +CD_decorators CD_decorators COLUMN +CD_sourceIds CD_sourceIds COLUMN +FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_1A5303EF43A4407B0A47C80B9EF3DCA81FEA484A CONSTRAINT +FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_AAB4A7CE5DD41A0CAEFA20B7538F2B851529E327 CONSTRAINT +FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_CF5ED6B6F3D98A44BCF9209A20D9C901F5C3C23E CONSTRAINT +FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_FA290CAE2E1C24893F90877F0EDF7304CD6D4563 CONSTRAINT +FK_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_FK_used-nrCellDu FK_15CBD840591824744326C05E2FC38C9ABE9A197E CONSTRAINT +FK_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_FK_managed-by-managedElement FK_4ADA30B48EB5107E0F730EB9684B5545524ADB42 CONSTRAINT +FK_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_FK_used-antennaCapability FK_778741F2AA29B57611EB06A903D58099245BB537 CONSTRAINT +FK_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_FK_provided-by-oduFunction FK_500A088A217D3F8B505A8F408076BB5AD265AF63 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_8ABF058C19072591C1000BDDD52FF17F488DCF24 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_bSide_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy FK_37802898775B4197154F9DA54F8B7946A3C735BA CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_aSide_NFDeployment FK_A08D274894ECB6799E56C2089A494AF0345B9B16 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_bSide_OCloudNamespace FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDeployment_REL_FK_comprised-by-cloudifiedNF FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDeployment_REL_FK_serviced-managedElement FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_aSide_NodeCluster FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_bSide_OCloudSite FK_888BF6FF782916E61B3FE80643A549A1CFDB6117 CONSTRAINT +FK_o-ran-smo-teiv-cloud_OCloudNamespace_REL_FK_deployed-on-nodeCluster FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF CONSTRAINT +FK_o-ran-smo-teiv-equipment_AntennaModule_REL_FK_grouped-by-sector FK_078764B2F3D613D44CC6E3586F564C83164D2481 CONSTRAINT +FK_o-ran-smo-teiv-equipment_AntennaModule_REL_FK_installed-at-site FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC CONSTRAINT +FK_o-ran-smo-teiv-oam_ManagedElement_REL_FK_deployed-as-cloudifiedNF FK_899B8130A861D1450FC49D3159D8B29C0628A717 CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction CONSTRAINT +FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_provided-by-oduFunction FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD CONSTRAINT +FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-antennaCapability FK_65D538D54EB33081C808540235FEB28823428E64 CONSTRAINT +FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu CONSTRAINT +FK_o-ran-smo-teiv-ran_NearRTRICFunction_REL_FK_managed-by-managedElement FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203 CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_managed-by-managedElement FK_122DD9709032528D161177B3624AD7AAF6589005 CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUUPFunction_REL_FK_managed-by-managedElement FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D CONSTRAINT +FK_o-ran-smo-teiv-ran_ODUFunction_REL_FK_managed-by-managedElement FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80 CONSTRAINT +FK_o-ran-smo-teiv-ran_ORUFunction_REL_FK_managed-by-managedElement FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_aSide_NFDeployment FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_bSide_NearRTRICFunction FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_aSide_NFDeployment FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_bSide_OCUCPFunction FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_aSide_NFDeployment FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_bSide_OCUUPFunction FK_8585D545BC37A473A298E0F5F5942F897A7105B1 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_aSide_NFDeployment FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_bSide_ODUFunction FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08 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_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_aSide_AntennaModule FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_bSide_NRCellDU FK_8605800A4923C52258A8CE3989E18A7C93D22E8C CONSTRAINT +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_classifiers IDX_07C2D9F67E32FD07A927D1DF5F06734D7F89DBA0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_sourceIds IDX_8A2A0ABA5E6ACAA8EF991E5B983551524A679509 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_classifiers IDX_B6911D7B07CE9E7CF692209760002ABD15DA8CD9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_sourceIds IDX_13E530F00B0D405F58CDA235146715762EF6DF91 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_classifiers IDX_35E57E345ABB0D6A9CD6D8FBDBC620646C046669 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_sourceIds IDX_52B1FEA89EC725EA6195DBD272ED9983E98B99CB INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_antennaBeamWidth IDX_452AE5B87383D94C9B188FBA8BBDA09B8A7E73B4 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_classifiers IDX_18D66A31B8B88551ADA98E4BC6362B71A504CE1B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_sourceIds IDX_36D40805D5D41247C46C23AF06A399E7CDC46EDD INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_classifiers_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_40A0F4A77264E4DD55EBA83EB2270B21E79F48FF INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_sourceIds_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_3EEEE6049314C502989CA49A6050FC40898889D1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_classifiers IDX_7470F8E4355FEDE440D3CEB831E05AF350B8144B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_sourceIds IDX_CD2038615C829FA3EC5520DEF04DEBAD87DB7B57 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_eUtranFqBands IDX_C9652A1BD1F6441ECBDB38922226AD08D7DDD60D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_geranFqBands IDX_41A2CB8C648BE9B006CB04631C440F71DA6A61C3 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_nRFqBands IDX_49AB1B81ED859FE4A0F148617CB3E11454E05EAA INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_classifiers IDX_98C227150239A7692514F1FDF5E3F49FC4439357 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_sourceIds IDX_241D90708F29A60824E2A63C86D9AB84E611E505 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_3FF5E0D439B273B25E65C4EC6E4682E5F8AE9D79 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_0B9A243313790591EFA74660F1863924EE8CCB6C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_classifiers IDX_8F5A022153912D07D92FCE34FA9E754E0163F818 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_sourceIds IDX_53A525F2FE3F291B4F2B234FE4EC799C778A8687 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_classifiers_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_D8626C46F2134489869EC9F70A2F3960D37BA656 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_sourceIds_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_DBBF1D30DCD311E5D9D17524730BBF38DEB8BBF8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_classifiers IDX_14454BB7AC41220815C5885AD1B3DB72F8089315 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_sourceIds IDX_E909484E1251C6944EE877CB737E07475884A1AE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_classifiers_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_4F93EF555F8640ADA220F02F1434AF29A96F85F2 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_sourceIds_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_1161D2AF3E3B8B7503469AFF6E3DA87B4D66F852 INDEX +IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_decorators IDX_58D33C1960633F6CAA5F7E0A9880FF85D5923BF7 INDEX +IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_metadata IDX_EA883FE1AB208DC033513D76B1414014FE4D1397 INDEX +IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_decorators IDX_4D253E190E8502C2DE0DC0E2A7A758EA8A5E5888 INDEX +IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_metadata IDX_A04886514310E5B31E206923891CD213D9A5CEE6 INDEX +IDX_GIN_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_decorators IDX_8B5018C20A65AC6FFF6E9B4C099B8F18058B3533 INDEX +IDX_GIN_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_metadata IDX_54DC74991A70957B0CEBAA38200F3059ECCABDEC INDEX +IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_decorators IDX_245803DDE5BD5AB2780BB277649AE40CA8F4E145 INDEX +IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_decorators_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_4520B8DC811185D63D0E415F4E0AED4DC9967219 INDEX +IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_metadata_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_6E7F02AC7C81800C688BB46D2639CBABFB376239 INDEX +IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_metadata IDX_CDD068E13765C799B6503561CB0FAC5638B22C70 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_decorators IDX_3D44AB1602F5AA87FAF39E6F596888419F723F47 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_metadata IDX_9532CB2D7B71297C7279D2E824DBE655331B5220 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_decorators IDX_F308FB8D16B912769597B9678466ADB19BAA27B2 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_DC5DA06087B85C01A975848202AC386694598D78 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_metadata_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_40D54F003F8A66E82DFC0BE377ADEFF1A8EAE78D INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_dUpLMNId IDX_00624177EC65536001DDF0477A8F698B871C142D INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_metadata IDX_9EC8D13EBFB1E513FD4F18C284AD66FA6751E2BC INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_decorators IDX_83EEB2F630BDBBF7BE7E8BBFA452D7F2AB69EB69 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_decorators_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_97C1311E85CBA88A2048A17CC3A91406A13A162A INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_metadata_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_52840EAF2D41B89AC3CE825BC9B0D9AC35AEFC5C INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_metadata IDX_77A2303E82E9B9B4A9D61BE7C4F1B6088C40A04E INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_decorators IDX_3C1344FC931EF89522B673948D541FD73E375C4F INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_decorators_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_17F56568BFFACD4F9F2E6372407CE7F8FA06AF17 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_metadata_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_6DDF32177944AAEDACB2123D05680F3B3B9BD4C7 INDEX +IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_metadata IDX_BBF662FB069D121A65DCE5A46DAC3185B9A6D9A4 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_CD_decorators IDX_7C35D9F162CB5D2DA8BF96C1F076C9C55EC7CA96 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_metadata IDX_2905D52A1A6E49FD9E984F4AD978144B6309C86F INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_classifiers IDX_BD96130868B69147B2F87B0D15F5829690DEF454 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_sourceIds IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_classifiers IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_sourceIds IDX_F97E398B17532BCD9923CE0CF98E73227D890037 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_CD_classifiers IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_CD_sourceIds IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_classifiers IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_sourceIds IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NodeCluster_CD_classifiers IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NodeCluster_CD_sourceIds IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_CD_classifiers IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_CD_sourceIds IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudSite_CD_classifiers IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudSite_CD_sourceIds IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B INDEX +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_REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C 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-equipment_Site_CD_classifiers IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_Site_CD_sourceIds IDX_102A50584376DE25B6BBD7157594C607A5C957F2 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_CD_classifiers IDX_98AC4232BC02323E03416954215889CEE874A1E9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_CD_sourceIds IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_634619CF7333EBC0AFDE990900B79220FC626EBA INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E 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_NRCellCU_CD_classifiers IDX_E5930226819982DC0CFC1FA64FB3600647222435 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_CD_sourceIds IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_6891C1BB8EE214340A362906C08955E8ACC1C597 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_CD_classifiers IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_CD_sourceIds IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_CD_classifiers IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_CD_sourceIds IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_B975D24291849007D4AA6686C5D3983885D5C884 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER IDX_986B2223E72FF79237337329F4C3BB9DA9025A34 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_CD_classifiers IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_CD_sourceIds IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION IDX_0ECC814A408874C9F8E73EEE3968984A6345A606 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_CD_classifiers IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_CD_sourceIds IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_CD_classifiers IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_CD_sourceIds IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_50209F1FF59B49F79FF194887B631994F2B5148A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_pLMNIdList IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_classifiers IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_sourceIds IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_CD_classifiers IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_CD_sourceIds IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_Sector_CD_classifiers IDX_19C19556F9714850389595E0A16218FA229205FE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_Sector_CD_sourceIds IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_classifiers IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_sourceIds IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_classifiers IDX_03F9C6A2FA82614A788443AC6044BCED2401C465 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_sourceIds IDX_10BCC6B44663A8D5431668BEE5DF80423420C616 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_classifiers IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_sourceIds IDX_64B7C127C01069009A3FB13592DAE249B0029283 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_classifiers IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_sourceIds IDX_5996D077978D38D0C1A951A262F1F7E1E339F052 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_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_classifiers IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_sourceIds IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E INDEX +IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_decorators IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT IDX_46CDB369134F042EC021F7496DF721B49A9D43C0 INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_decorators IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322 INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B INDEX +IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators 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-equipment_AntennaModule_REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9 INDEX +IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1 INDEX +IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C 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_NRCellCU_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_REL_CD_decorators_SECTOR_GROUPS_NRCELLDU IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F INDEX +IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_ADD3393C27589066C4993A3491436C6FB57A539F INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F INDEX +IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_decorators IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80 INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_decorators IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3 INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_decorators IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_decorators IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators IDX_7BF09D0227840279556AD27ACECB068705893D28 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_decorators IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753 INDEX +PK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_id PK_8123C74A8D9A873F330C37E370DB951212243844 CONSTRAINT +PK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_id PK_48BAB21388EA2B1BE83EF5D3FC143807776A882D CONSTRAINT +PK_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_id PK_8EB1724D91D554E7771C8C5AE5AA752A604E025C CONSTRAINT +PK_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_id PK_AD1799D4203C08DE10524497B4997C2DCB4F6A92 CONSTRAINT +PK_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_id PK_AE71D2F6E7DABC3C066CEB9E1F30286DE8AF12D0 CONSTRAINT +PK_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_id PK_BEBBD904815CB84D3D7D326B13A71BC786E8C2B6 CONSTRAINT +PK_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_id PK_61C7969B1B7C806E01CE3D9471CFF52FA37864C3 CONSTRAINT +PK_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_id PK_94DB80CFD01964A5D56BC22F433BBAF282F5AB0E CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_id PK_E078962EDFAEDBC93784222B0B7BDFC3929D4D79 CONSTRAINT +PK_o-ran-smo-teiv-cloud_CloudifiedNF_id PK_o-ran-smo-teiv-cloud_CloudifiedNF_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_id PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6 CONSTRAINT +PK_o-ran-smo-teiv-cloud_NFDeployment_id PK_o-ran-smo-teiv-cloud_NFDeployment_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_NodeCluster_id PK_o-ran-smo-teiv-cloud_NodeCluster_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_OCloudNamespace_id PK_o-ran-smo-teiv-cloud_OCloudNamespace_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_OCloudSite_id PK_o-ran-smo-teiv-cloud_OCloudSite_id CONSTRAINT +PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT +PK_o-ran-smo-teiv-equipment_Site_id PK_o-ran-smo-teiv-equipment_Site_id CONSTRAINT +PK_o-ran-smo-teiv-oam_ManagedElement_id PK_o-ran-smo-teiv-oam_ManagedElement_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_NRCellCU_id PK_o-ran-smo-teiv-ran_NRCellCU_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NRCellDU_id PK_o-ran-smo-teiv-ran_NRCellDU_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NRSectorCarrier_id PK_o-ran-smo-teiv-ran_NRSectorCarrier_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NearRTRICFunction_id PK_o-ran-smo-teiv-ran_NearRTRICFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_OCUCPFunction_id PK_o-ran-smo-teiv-ran_OCUCPFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_OCUUPFunction_id PK_o-ran-smo-teiv-ran_OCUUPFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ODUFunction_id PK_o-ran-smo-teiv-ran_ODUFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ORUFunction_id PK_o-ran-smo-teiv-ran_ORUFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_Sector_id PK_o-ran-smo-teiv-ran_Sector_id CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_id PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_id PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_id PK_E551D02D14B3C04A565DC73A386BEB29627D3C08 CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_id PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3 CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_id PK_F41873285F3BD831F63C6041B4356A063403406D CONSTRAINT +REL_CD_classifiers_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052 COLUMN +REL_CD_classifiers_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5 COLUMN +REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6 COLUMN +REL_CD_classifiers_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD COLUMN +REL_CD_decorators_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_0AC0D382E4274681870EC7319460192F4F603001 COLUMN +REL_CD_decorators_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC COLUMN +REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B COLUMN +REL_CD_decorators_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92 COLUMN +REL_CD_sourceIds_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054 COLUMN +REL_CD_sourceIds_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5 COLUMN +REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD COLUMN +REL_CD_sourceIds_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4 COLUMN +REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU COLUMN +REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_CD_decorators_SECTOR_GROUPS_NRCELLDU REL_CD_decorators_SECTOR_GROUPS_NRCELLDU COLUMN +REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU COLUMN +REL_FK_used-nrCellDu REL_FK_used-nrCellDu COLUMN +REL_FK_comprised-by-cloudifiedNF REL_FK_comprised-by-cloudifiedNF COLUMN +REL_FK_deployed-as-cloudifiedNF REL_FK_deployed-as-cloudifiedNF COLUMN +REL_FK_deployed-on-nodeCluster REL_FK_deployed-on-nodeCluster COLUMN +REL_FK_grouped-by-sector REL_FK_grouped-by-sector COLUMN +REL_FK_installed-at-site REL_FK_installed-at-site COLUMN +REL_FK_managed-by-managedElement REL_FK_managed-by-managedElement COLUMN +REL_FK_provided-by-ocucpFunction REL_FK_provided-by-ocucpFunction COLUMN +REL_FK_provided-by-oduFunction REL_FK_provided-by-oduFunction COLUMN +REL_FK_serviced-managedElement REL_FK_serviced-managedElement COLUMN +REL_FK_used-antennaCapability REL_FK_used-antennaCapability COLUMN +REL_FK_used-by-nrCellDu REL_FK_used-by-nrCellDu COLUMN +REL_ID_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F COLUMN +REL_ID_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64 COLUMN +REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B COLUMN +REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU COLUMN +REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_ID_NRCELLDU_USES_NRSECTORCARRIER REL_ID_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_ID_SECTOR_GROUPS_ANTENNAMODULE REL_ID_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_ID_SECTOR_GROUPS_NRCELLDU REL_ID_SECTOR_GROUPS_NRCELLDU COLUMN +REL_metadata_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A COLUMN +REL_metadata_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_metadata_F723867781098568079DD82E5D5E529374F97E98 COLUMN +REL_metadata_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_metadata_72494257260B57223C09828D7C3B31D203B050B4 COLUMN +REL_metadata_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB COLUMN +REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_metadata_NRCELLDU_USES_NRSECTORCARRIER REL_metadata_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_metadata_SECTOR_GROUPS_ANTENNAMODULE REL_metadata_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_metadata_SECTOR_GROUPS_NRCELLDU REL_metadata_SECTOR_GROUPS_NRCELLDU COLUMN +UNIQUE_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU UNIQUE_C40364D44BC6DFCB468EEE1A8FB42BDB71D94114 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN UNIQUE_EFB77EDE9661E3C6826E575AB125FD4F8FCD3BE1 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_ID_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY UNIQUE_523F8C2098EA2DE66650F9CCA7713124C14D63DF CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_ID_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU UNIQUE_6C7164EC5E639D7E0D833D3C4E0CAB85062EE418 CONSTRAINT +UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC CONSTRAINT +UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC CONSTRAINT +UNIQUE_o-ran-smo-teiv-cloud_OCloudNamespace_REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0 CONSTRAINT +UNIQUE_o-ran-smo-teiv-equipment_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1 CONSTRAINT +UNIQUE_o-ran-smo-teiv-equipment_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0 CONSTRAINT +UNIQUE_o-ran-smo-teiv-oam_ManagedElement_REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellCU_REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellDU_REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NearRTRICFunction_REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION UNIQUE_E020461673334EB824643649B6B31670FB064EC8 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUUPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_ODUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_ORUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241 CONSTRAINT +aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C COLUMN +aSide_AntennaModule aSide_AntennaModule COLUMN +bSide_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC COLUMN +bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E COLUMN +cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd 020335B0F627C169E24167748C38FE756FB34AE2 COLUMN +aSide_NFDeployment aSide_NFDeployment COLUMN +aSide_NodeCluster aSide_NodeCluster COLUMN +antennaBeamWidth antennaBeamWidth COLUMN +antennaModelNumber antennaModelNumber COLUMN +arfcnDL arfcnDL COLUMN +arfcnUL arfcnUL COLUMN +azimuth azimuth COLUMN +bSChannelBwDL bSChannelBwDL COLUMN +bSide_AntennaCapability bSide_AntennaCapability COLUMN +bSide_NRCellDU bSide_NRCellDU COLUMN +bSide_NearRTRICFunction bSide_NearRTRICFunction COLUMN +bSide_OCUCPFunction bSide_OCUCPFunction COLUMN +bSide_OCUUPFunction bSide_OCUUPFunction COLUMN +bSide_OCloudNamespace bSide_OCloudNamespace COLUMN +bSide_OCloudSite bSide_OCloudSite COLUMN +bSide_ODUFunction bSide_ODUFunction COLUMN +cellLocalId cellLocalId COLUMN +dUpLMNId dUpLMNId COLUMN +eUtranFqBands eUtranFqBands COLUMN +electricalAntennaTilt electricalAntennaTilt COLUMN +frequencyDL frequencyDL COLUMN +frequencyUL frequencyUL COLUMN +gNBCUName gNBCUName COLUMN +gNBDUId gNBDUId COLUMN +gNBId gNBId COLUMN +gNBIdLength gNBIdLength COLUMN +geo-location geo-location COLUMN +geranFqBands geranFqBands COLUMN +horizontalBeamWidth horizontalBeamWidth COLUMN +id id COLUMN +mechanicalAntennaBearing mechanicalAntennaBearing COLUMN +mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +metadata metadata COLUMN +nCI nCI COLUMN +nRFqBands nRFqBands COLUMN +nRPCI nRPCI COLUMN +nRTAC nRTAC COLUMN +name name COLUMN +nearRtRicId nearRtRicId COLUMN +o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE 09D47DF128202AB535BC2056D7C0952F6EE7AF2D TABLE +o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE 98D95275440120DC7A5FEF7E870FB6649F275AEC TABLE +o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974 TABLE +o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt C9475FE40C02BEB41F720B4284A856F2CF49E1F3 TABLE +o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy AA68071F5A253FC68706DC4244B2EEEDCFA4F477 TABLE +o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn AD6AA1B5E225BBC96B792246D095340747056399 TABLE +o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 8F1E5B0125750A5230DB73DB7816ECCFFC2D918B TABLE +o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU F93C2CA075353668A76B4718E07B741ACCD83641 TABLE +o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY E2D2B450D65F1FF241A983CBB43B54C040969908 TABLE +o-ran-smo-teiv-cloud_CloudifiedNF o-ran-smo-teiv-cloud_CloudifiedNF TABLE +o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE TABLE +o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-cloud_NFDeployment TABLE +o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE TABLE +o-ran-smo-teiv-cloud_NodeCluster o-ran-smo-teiv-cloud_NodeCluster TABLE +o-ran-smo-teiv-cloud_OCloudNamespace o-ran-smo-teiv-cloud_OCloudNamespace TABLE +o-ran-smo-teiv-cloud_OCloudSite o-ran-smo-teiv-cloud_OCloudSite TABLE +o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE +o-ran-smo-teiv-equipment_Site o-ran-smo-teiv-equipment_Site TABLE +o-ran-smo-teiv-oam_ManagedElement o-ran-smo-teiv-oam_ManagedElement TABLE +o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE +o-ran-smo-teiv-ran_NRCellCU o-ran-smo-teiv-ran_NRCellCU TABLE +o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran_NRCellDU TABLE +o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran_NRSectorCarrier TABLE +o-ran-smo-teiv-ran_NearRTRICFunction o-ran-smo-teiv-ran_NearRTRICFunction TABLE +o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-ran_OCUCPFunction TABLE +o-ran-smo-teiv-ran_OCUUPFunction o-ran-smo-teiv-ran_OCUUPFunction TABLE +o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran_ODUFunction TABLE +o-ran-smo-teiv-ran_ORUFunction o-ran-smo-teiv-ran_ORUFunction TABLE +o-ran-smo-teiv-ran_Sector o-ran-smo-teiv-ran_Sector TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION 3C2E2CE7BDF8321BC824B6318B190690F58DBB82 TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU TABLE +oruId oruId COLUMN +pLMNId pLMNId COLUMN +pLMNIdList pLMNIdList COLUMN +plmnId plmnId COLUMN +positionWithinSector positionWithinSector COLUMN +sectorId sectorId COLUMN +totalTilt totalTilt COLUMN +verticalBeamWidth verticalBeamWidth COLUMN +\. + +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +_3gpp-common-yang-extensions urn:3gpp:sa5:_3gpp-common-yang-extensions \N [] 2023-09-18 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogIHlhbmctdmVyc2lvbiAxLjE7CiAgbmFtZXNwYWNlIHVybjozZ3BwOnNhNTpfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIDsKICBwcmVmaXggeWV4dDNncHAgOwoKICBvcmdhbml6YXRpb24gIjNHUFAgU0E1IjsKICBjb250YWN0ICJodHRwczovL3d3dy4zZ3BwLm9yZy9EeW5hUmVwb3J0L1RTRy1XRy0tUzUtLW9mZmljaWFscy5odG0/SXRlbWlkPTQ2NCI7CgogIGRlc2NyaXB0aW9uICJUaGUgbW9kdWxlIGRlZmluZXMgWUFORyBleHRlbnNpb25zIG5lZWRlZCAKICAgIDNHUFAgWUFORyBtb2RlbGluZy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTkgM0dQUC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBFeHRlbnNpb25zIE1VU1QgYmUgZGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZQogICAgZGVzY3JpcHRpb24gc3RhdGVtZW50OgogICAgICAgIC0gV2hhdCBpcyB0aGlzIHN0YXRlbWVudC4KICAgICAgICAtIE5ld2xpbmUsCiAgICAgICAgLSBUaGlzIHN0YXRlbWVudCBjYW4gYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlIHh4eCBzdGF0ZW1lbnRzIHdpdGgKICAgICAgICBjYXJkaW5hbGl0eSB4Li55LgogICAgICAgIC0gVGhpcyBzdGF0ZW1lbnQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBzdWJzdGF0ZW1lbnRzIHdpdGgKICAgICAgICBjYXJkaW5hbGl0eSB4Li55LgogICAgICAgIC0gTmV3bGluZQogICAgICAgIC0gSXMgY2hhbmdpbmcgdGhpcyBzdGF0ZW1lbnQgYW4gZWRpdG9yaWFsLCBCQyhiYWNrd2FyZHMgY29tcGF0aWJsZSkgCiAgICAgICAgb3IgTkJDKG5vbi1CQykgY2hhbmdlPwogICAgICAgIC0gTmV3bGluZS4KICAgICAgICAtIFRoZSBhcmd1bWVudCBpdHMgbWVhbmluZyBhbmQgdHlwZS4gUHJlZmVyYWJseSB1c2UgWUFORyB0eXBlcyBhbmQKICAgICAgICAgIGNvbnN0cmFpbnRzIHRvIGRlZmluZSB0aGUgYXJndW1lbnQncyB0eXBlLgoKICAgIEFueSBleHRlbnNpb24gc3RhdGVtZW50IGNhbiBiZSBhZGRlZCB3aXRoIGEKICAgIGRldmlhdGlvbi9kZXZpYXRlIGFkZCBzdGF0ZW1lbnQuIEluIHRoaXMgY2FzZSB0aGUgcmVzdHJpY3Rpb24gYWJvdXQKICAgIHRoZSBwYXJlbnQgc3RhdGVtZW50IG9mIHRoZSBleHRlbnNpb24gU0hBTEwgYmUgZXZhbHVhdGVkIGJhc2VkIG9uIHRoZQogICAgdGFyZ2V0IG9mIHRoZSBkZXZpYXRpb24gc3RhdGVtZW50LgoKICAgIFN1cHBvcnQgZm9yIHRoaXMgbW9kdWxlIGRvZXMgbm90IG1lYW4gdGhhdCBhIFlBTkcgc2VydmVyIGltcGxlbWVudHMKICAgIHN1cHBvcnQgZm9yIGVhY2ggb2YgdGhlc2UgZXh0ZW5zaW9ucy4KICAgIEltcGxlbWVudGVycyBvZiBlYWNoIHNwZWNpZmljIG1vZHVsZSB1c2luZyBhbiBleHRlbnNpb25zIE1VU1QgY2hlY2sKICAgIGlmIHRoZSBzZXJ2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciB0aGUgdXNlZCBleHRlbnNpb24uCiAgICBOb3RlOiBtb2R1bGVzIHVzZSBtYW55IGV4dGVuc2lvbnMgd2hpY2ggaW5kaXZpZHVhbAogICAgaW1wbGVtZW50YXRpb25zIE1BWSBvciBNQVkgTk9UIHN1cHBvcnQuCiAgICBJZiBzdXBwb3J0IGZvciBhbiBleHRlbnNpb24gaXMgbWlzc2luZyB0aGUgZXh0ZW5zaW9uIHN0YXRlbWVudCBuZWVkcwogICAgaW5kaXZpZHVhbCBoYW5kbGluZyBvciBpdCBTSE9VTEQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgdXNpbmcKICAgIHRoZSBleHRlbnNpb24gZS5nLiB3aXRoIGEgZGV2aWF0aW9uLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLCAKICAgIFRUQSwgVFRDKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4iOwogIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjMKICAgICAgR2VuZXJpYyBOZXR3b3JrIFJlc291cmNlIE1vZGVsIChOUk0pCiAgICAgIEludGVncmF0aW9uIFJlZmVyZW5jZSBQb2ludCAoSVJQKTsKICAgICAgU29sdXRpb24gU2V0IChTUykgZGVmaW5pdGlvbnMKICAgICAgM0dQUCBUUyAyOC42MjMiOwoKICByZXZpc2lvbiAyMDIzLTA5LTE4IHsgcmVmZXJlbmNlIENSLTAyNzEgOyB9IAogIHJldmlzaW9uIDIwMjItMTAtMjAgeyByZWZlcmVuY2UgQ1ItMDE5NjsgICB9CiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7IHJlZmVyZW5jZSAiSW5pdGlhbCB2ZXJzaW9uIjsgICB9CgogIGV4dGVuc2lvbiBub3ROb3RpZnlhYmxlIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJJbmRpY2F0ZXMgdGhhdCBkYXRhIGNoYW5nZSBub3RpZmljYXRpb25zIHNoYWxsIG5vdCBiZSBzZW50IAogICAgICBmb3IgdGhpcyBhdHRyaWJ1dGUuIElmIHRoZSBleHRlbnNpb24gaXMgbm90IHByZXNlbnQgYW5kIG90aGVyIAogICAgICBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQgZGF0YSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzZW50LgogICAgICBJZiBhIGxpc3Qgb3IgY29udGFpbmVyIGFscmVhZHkgaGFzIHRoZSBub3ROb3RpZnlhYmxlIAogICAgICBleHRlbnNpb24sIHRoYXQgaXMgYWxzbyB2YWxpZCBmb3IgYWxsIGNvbnRhaW5lZCBkYXRhIG5vZGVzLgoKICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSBsZWFmLCBsZWFmLWxpc3QsIGxpc3QsCiAgICAgIGNvbnRhaW5lciBzdGF0ZW1lbnQgdGhhdCBpcyBjb250YWluZWQgd2l0aGluIHRoZSAnYXR0cmlidXRlcycgCiAgICAgIGNvbnRhaW5lciBvZiBhbiBJT0MgYW5kIHRoYXQgcmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgb3Igc3ViLXBhcnRzIG9mIAogICAgICBhbiBhdHRyaWJ1dGUgLgogICAgICAKICAgICAgWmVybyBvciBvbmUgbm90Tm90aWZ5YWJsZSBzdGF0ZW1lbnQgaXMgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KICAgICAgICAgICAgCiAgICAgIEFkZGluZyB0aGlzIHN0YXRlbWVudCBpcyBhbiBOQkMgY2hhbmdlLCByZW1vdmluZyBpdCBpcyBCQy4iOwogIH0KCiAgZXh0ZW5zaW9uIGluVmFyaWFudCB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgZGF0YSBub2RlIGNhbiBvbmx5IGJlIHNldCB3aGVuIHRoZSBsaXN0IAogICAgICBkYXRhIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBjb250YWluaW5nIG9iamVjdChNT0kpIGlzIGNyZWF0ZWQuCiAgICAgIFRoZSBhYm92ZSBzdGF0ZW1lbnQgaW4gWUFORyB0ZXJtcyBtZWFucywgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSBkYXRhIAogICAgICBub2RlIGNhbiBvbmx5IGJlIHNldCB3aGVuIHRoZSBsaXN0IGVudHJ5IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGUgCiAgICAgIHJlc3RyaWN0ZWQgbm9kZSdzIGFuY2VzdG9yIGNvbnRhaW5lciBuYW1lZCAnYXR0cmlidXRlcycgaXMgYmVpbmcgY3JlYXRlZC4gCiAgICAgIFRvIGNoYW5nZSB0aGUgdmFsdWUgYWZ0ZXIgdGhhdCwgdGhlIG1lbnRpb25lZCAKICAgICAgbGlzdCBkYXRhIG5vZGUgbXVzdCBiZSBkZWxldGVkIGFuZCByZWNyZWF0ZWQgd2l0aCB0aGUgcmVzdHJpY3RlZCBkYXRhIG5vZGUKICAgICAgaGF2aW5nIHRoZSBuZXcgdmFsdWUuCgogICAgICBJZiBhIGxpc3Qgb3IgY29udGFpbmVyIGFscmVhZHkgaGFzIHRoZSBpblZhcmlhbnQgCiAgICAgIGV4dGVuc2lvbiwgdGhhdCBpcyBhbHNvIHZhbGlkIGZvciBhbGwgY29udGFpbmVkIGRhdGEgbm9kZXMuCgogICAgICBJdCBpcyB1bm5lY2Vzc2FyeSB0byB1c2UgYW5kIE1VU1QgTk9UIGJlIHVzZWQgZm9yIGtleSBsZWFmcy4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiwgbGVhZi1saXN0LCBsaXN0IAogICAgICBzdGF0ZW1lbnQgdGhhdCBpcyBjb25maWc9dHJ1ZS4KICAgICAgWmVybyBvciBvbmUgaW5WYXJpYW50IHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBwYXJlbnQgc3RhdGVtZW50LgogICAgICBOTyBzdWJzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgQWRkaW5nIHRoaXMgc3RhdGVtZW50IGlzIGFuIE5CQyBjaGFuZ2UsIHJlbW92aW5nIGl0IGlzIEJDLiI7CiAgfQoKICBleHRlbnNpb24gaW5pdGlhbC12YWx1ZSB7CiAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIGEgdmFsdWUgdGhhdCB0aGUgc3lzdGVtIHdpbGwgc2V0IGZvciBhIGxlYWYKICAgICAgbGVhZi1saXN0IGlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgaXQgd2hlbiBpdHMgcGFyZW50IGxpc3QKICAgICAgb3IgY29udGFpbmVyIGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBoYXMgbm8gZWZmZWN0IGluIGFueSBvdGhlcgogICAgICBtb2RpZmljYXRpb24gZS5nLiBjaGFuZ2luZyBvciByZW1vdmluZyB0aGUgdmFsdWUuCgogICAgICBUaGUgZGVzY3JpcHRpb24gc3RhdGVtZW50IG9mIHRoZSBwYXJlbnQgc3RhdGVtZW50IFNIT1VMRCBjb250YWluCiAgICAgIHRoZSBsYWJlbCAnSW5pdGlhbC12YWx1ZTogJyBmb2xsb3dlZCBieSB0aGUgdGV4dCBmcm9tIHRoZSBhcmd1bWVudC4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBOT1QgYmUgcHJlc2VudCBpZiB0aGUgbGVhZiBvciB0aGUgbGVhZi1saXN0IAogICAgICBoYXMgYSBkZWZhdWx0IHN0YXRlbWVudCBvciB0aGUgdHlwZSB1c2VkIGZvciB0aGUgZGF0YSBub2RlIAogICAgICBoYXMgYSBkZWZhdWx0IHZhbHVlLgogICAgICBUaGUgc3RhdGVtZW50IE1VU1QgTk9UIGJlIHVzZWQgZm9yIGNvbmZpZz1mYWxzZSBkYXRhIG9yIGluIGFuIAogICAgICBhY3Rpb24sIHJwYyBvciBub3RpZmljYXRpb24uCiAgICAgIFplcm8gb3Igb25lIGluaXRpYWwtdmFsdWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZCBmb3IgYSBsZWFmIHBhcmVudAogICAgICBzdGF0ZW1lbnQuIFplcm8gb3IgbW9yZSBpbml0aWFsLXZhbHVlIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgZm9yIGEKICAgICAgbGVhZi1saXN0IHBhcmVudCBzdGF0ZW1lbnQuIElmIHRoZSBsZWFmLWxpc3QgaXMgb3JkZXJlZC1ieSB1c2VyLCB0aGUKICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFlBTkcgZGVmaW5pdGlvbi4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KCiAgICAgIEFsd2F5cyBjb25zaWRlciB1c2luZyBhIFlBTkctZGVmYXVsdCBzdGF0ZW1lbnQgaW5zdGVhZC4KCiAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5pdGlhbC12YWx1ZSBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuCgogICAgICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIGluaXRpYWwgdmFsdWUgZm9yIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSB2YWx1ZSBNVVNUIGJlIHBhcnQgb2YgdGhlIHZhbHVlc3BhY2Ugb2YgdGhlIGxlYWYvbGVhZi1saXN0LgogICAgICBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBhcmd1bWVudCBvZiB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQuIjsKCiAgICBhcmd1bWVudCAiaW5pdGlhbC12YWx1ZSI7CiAgfQp9 +_3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CiAgCiAgaW1wb3J0IGlldGYtaW5ldC10eXBlcyB7IHByZWZpeCBpbmV0OyB9CiAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7IHByZWZpeCB5YW5nOyB9CiAgaW1wb3J0IF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggeWV4dDNncHA7IH0KCiAgb3JnYW5pemF0aW9uICIzR1BQIFNBNSI7CiAgY29udGFjdCAiaHR0cHM6Ly93d3cuM2dwcC5vcmcvRHluYVJlcG9ydC9UU0ctV0ctLVM1LS1vZmZpY2lhbHMuaHRtP0l0ZW1pZD00NjQiOwogIGRlc2NyaXB0aW9uICJUaGUgbW9kZWwgZGVmaW5lcyBhIFlBTkcgbWFwcGluZyBvZiB0aGUgdG9wIGxldmVsIAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZCAKICAgIG5ldHdvcmsgc2xpY2luZy4KICAgIENvcHlyaWdodCAyMDIzLCAzR1BQIE9yZ2FuaXphdGlvbmFsIFBhcnRuZXJzIChBUklCLCBBVElTLCBDQ1NBLCBFVFNJLCBUU0RTSSwgCiAgICBUVEEsIFRUQykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIjsKICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjIzIjsKCiAgcmV2aXNpb24gMjAyMy0xMS0wNiB7IHJlZmVyZW5jZSBDUi0wMzA1OyB9CiAgcmV2aXNpb24gMjAyMy0wOS0xOCB7IHJlZmVyZW5jZSBDUi0wMjcxIDsgfSAKICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CiAgCiAgcmV2aXNpb24gMjAyMS0wOS0zMCB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgTG9uZ2l0dWRlLCBMYXRpdHVkZSwgVGVudGhPZkRlZ3JlZXMsIE9uT2ZmLiI7CiAgICByZWZlcmVuY2UgIkNSLTAxMzgiOwogIH0KCiAgcmV2aXNpb24gMjAyMC0xMS0wNiB7CiAgICBkZXNjcmlwdGlvbiAiUmVtb3ZlZCBpbmNvcnJlY3QgUy1OU1NBSSBkZWZpbml0aW9ucy4iOwogICAgcmVmZXJlbmNlICJDUi0wMTE4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMDMtMTAgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgZmF1bHR5IHdoZW4gc3RhdGVtZW50cy4iOwogICAgcmVmZXJlbmNlICJTUC0yMDAyMjkiOwogIH0KIAogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CiAgCiAgZ3JvdXBpbmcgbmFtZVZhbHVlUGFpciB7CiAgICBsZWFmIG5hbWUgeyB0eXBlIHN0cmluZzsgfQogICAgbGVhZiB2YWx1ZSB7IHR5cGUgc3RyaW5nOyB9CiAgfQogIAogIGdyb3VwaW5nIFByb2Nlc3NNb25pdG9yR3JwIHsKICAgIGRlc2NyaXB0aW9uICJQcm92aWRlcyBhdHRyaWJ1dGVzIHRvIG1vbml0b3IgdGhlIHByb2dyZXNzIG9mIHByb2Nlc3NlcyAKICAgICAgd2l0aCBzcGVjaWZpYyBwdXJwb3NlIGFuZCBsaW1pdGVkIGxpZmV0aW1lIHJ1bm5pbmcgb24gTW5TIHByb2R1Y2Vycy4gCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcyAKICAgICAgd2hlbiBzcGVjaWZ5aW5nIHRoZSBtYW5hZ2VtZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIHByb2Nlc3Nlcy4gCiAgICAgIFRoZSBhdHRyaWJ1dGVzIGluIHRoaXMgY2xhdXNlIGFyZSBkZWZpbmVkIGluIGEgZ2VuZXJpYyB3YXkuIAogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEgCiAgICAgIGNvbmNyZXRlIHByb2Nlc3MgcmVwcmVzZW50YXRpb24uCgogICAgICBJZiBhIG1hbmFnZW1lbnQgb3BlcmF0aW9uIG9uIHNvbWUgSU9DcyB0cmlnZ2VycyBhbiBhc3NvY2lhdGVkIAogICAgICBhc3luY2hyb25vdXMgcHJvY2VzcyAod2hvc2UgcHJvZ3Jlc3Mgc2hhbGwgYmUgbW9uaXRvcmVkKSwgdGhpcyBzaG91bGQgCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlIAogICAgICAnUHJvY2Vzc01vbml0b3InKSBpbiB0aGVzZSBJT0MocykuIFRoZSBwcm9jZXNzTW9uaXRvciBhdHRyaWJ1dGUgbWF5IGJlIAogICAgICBhY2NvbXBhbmllZCBieSB1c2UtY2FzZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGRhdGEgaXRlbXMuCgogICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHByb2Nlc3MgaXMgZGVzY3JpYmVkIGJ5IHRoZSAnc3RhdHVzJyBhbmQgCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IgCiAgICAgIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgbWF5IGJlIHByb3ZpZGVkIGJ5IHRoZSAncHJvZ3Jlc3NTdGF0ZUluZm8nIGFuZCAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlcy4KCiAgICAgIFdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkLCB0aGUgJ3N0YXR1cycgaXMgc2V0IHRvICdOT1RfUlVOTklORycgCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0byAKICAgICAgc3RhcnQgZXhlY3V0aW5nIHRoZSBwcm9jZXNzIGFuZCB0byB0cmFuc2l0aW9uIGludG8gdGhlICdSVU5OSU5HJyBzdGF0ZS4gCiAgICAgIFRoaXMgdGltZSBpcyBjYXB0dXJlZCBpbiB0aGUgJ3N0YXJ0VGltZScgYXR0cmlidXRlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lIAogICAgICBhbHRlcm5hdGl2ZSBtdXN0IGJlIHNlbGVjdGVkIHdoZW4gdXNpbmcgdGhpcyBkYXRhIHR5cGUuCgogICAgICBEdXJpbmcgdGhlICdSVU5OSU5HJyBzdGF0ZSB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgYXR0cmlidXRlIG1heSBiZSAKICAgICAgcmVwZWF0ZWRseSB1cGRhdGVkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgc3ViamVjdCB0byAKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byAKICAgICAgcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gaW4gdGhlICdOT1RfUlVOTklORycsICdDQU5DRUxMSU5HJyAKICAgICAgYW5kICdSVU5OSU5HJyBzdGF0ZXMuIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIAogICAgICB1c2VkLgoKICAgICAgVXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHByb2Nlc3MsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgc2V0IAogICAgICB0byAnRklOSVNIRUQnLCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gMTAwJS4gVGhlIHRpbWUgaXMgY2FwdHVyZWQgaW4gCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIAogICAgICBpbiB0aGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlLiBUaGUgdHlwZSBvZiAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgaW4gdGhpcyBkYXRhIHR5cGUgZGVmaW5pdGlvbiBpcyAnU3RyaW5nJy4gCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIAogICAgICB3aGVyZSB0aGlzIGRhdGEgdHlwZSBpcyB1c2VkLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBmYWlscyB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHksIHRoZSAnc3RhdHVzJyAKICAgICAgYXR0cmlidXRlIGlzIHNldCB0byAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcsIHRoZSBjdXJyZW50IHZhbHVlIG9mIAogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZSAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgc3BlY2lmaWVzIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLiAKICAgICAgU3BlY2lmaWMgZmFpbHVyZSByZWFzb25zIG1heSBiZSBzcGVjaWZpZWQgd2hlcmUgdGhlIGRhdGEgdHlwZSBkZWZpbmVkIGluIAogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IgCiAgICAgIGZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gYXMgd2VsbC4KCiAgICAgIEluIGNhc2UgdGhlIHByb2Nlc3MgaXMgY2FuY2VsbGVkLCB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIGlzIGZpcnN0IHNldCB0byAKICAgICAgJ0NBTkNFTExJTkcnIGFuZCB3aGVuIHRoZSBwcm9jZXNzIGlzIHJlYWxseSBjYW5jZWxsZWQgdGhlbiB0byAnQ0FOQ0VMTEVEJy4gCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiAKICAgICAgVGhlIHZhbHVlIG9mICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGlzIGZyb3plbi4gQWRkaXRpb25hbCB0ZXh0dWFsIAogICAgICBpbmZvcm1hdGlvbiBtYXkgYmUgcHJvdmlkZWQgaW4gdGhlICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZS4KCiAgICAgIFRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgb25seSBmb3IgYWRkaXRpb25hbCB0ZXh0dWFsIAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvciAKICAgICAgJ0NBTkNFTExFRCcuIEl0IHNoYWxsIG5vdCBiZSB1c2VkIGZvciBtYWtpbmcgdGhlIG91dGNvbWUsIHRoYXQgdGhlIAogICAgICBwcm9jZXNzIG1heSBwcm9kdWNlIGluIGNhc2Ugb2Ygc3VjY2VzcywgYXZhaWxhYmxlLgoKICAgICAgVGhlIHByb2Nlc3MgbWF5IGhhdmUgdG8gYmUgY29tcGxldGVkIHdpdGhpbiBhIGNlcnRhaW4gdGltZSBhZnRlciBpdHMgCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55IAogICAgICBtb3JlIGFmdGVyIGEgY2VydGFpbiB0aW1lLCBvciB0aGUgcHJvY2VzcyBvdXRjb21lIGlzIG5lZWRlZCB1bnRpbCBhIAogICAgICBjZXJ0YWluIHRpbWUgYW5kIHdoZW4gbm90IHByb3ZpZGVkIGJ5IHRoaXMgdGltZSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLiAKICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMgCiAgICAgIGluZGljYXRlZCBieSB0aGUgJ3RpbWVyJyBhdHRyaWJ1dGUuIjsKICAgICAgCiAgICBsZWFmIGlkIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiSWQgb2YgdGhlIHByb2Nlc3MuIEl0IGlzIHVuaXF1ZSB3aXRoaW4gYSBzaW5nbGUgCiAgICAgICAgbXVsdGl2YWx1ZSBhdHRyaWJ1dGUgb2YgdHlwZSBQcm9jZXNzTW9uaXRvci4iOwogICAgfQogICAgCiAgICBsZWFmIHN0YXR1cyB7IAogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIE5PVF9TVEFSVEVEIDsKICAgICAgICBlbnVtIFJVTk5JTkcgOwogICAgICAgIGVudW0gQ0FOQ0VMTElORyA7CiAgICAgICAgZW51bSBGSU5JU0hFRCA7CiAgICAgICAgZW51bSBGQUlMRUQgOwogICAgICAgIGVudW0gUEFSVElBTExZX0ZBSUxFRCA7CiAgICAgICAgZW51bSBDQU5DRUxMRUQgOwogICAgICB9CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVmYXVsdCAgUlVOTklORzsKICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzLCAKICAgICAgICB3aGV0aGVyIGl0IGZhaWxzLCBzdWNjZWVkcyBldGMuIAogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIAogICAgICAgIHByb2Nlc3MuICI7CiAgICB9CgogICAgbGVhZiBwcm9ncmVzc1BlcmNlbnRhZ2UgewogICAgICB0eXBlIHVpbnQ4IHsKICAgICAgICByYW5nZSAwLi4xMDA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiUHJvZ3Jlc3Mgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBhcyBwZXJjZW50YWdlIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgcHJvZ3Jlc3NTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcyAKICAgICAgICAnTk9UX1NUQVJURUQnLCAnQ0FOQ0VMTElORycgYW5kICdSVU5OSU5HJy4KCiAgICAgICAgRm9yIHNwZWNpZmljIHByb2Nlc3Nlcywgc3BlY2lmaWMgd2VsbC1kZWZpbmVkIHN0cmluZ3MgKGUuZy4gc3RyaW5nIAogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcyAKICAgICAgICAnRklOSVNIRUQnLCAnRkFJTEVEJywgJ1BBUlRJQUxMWV9GQUlMRUQgYW5kICdDQU5DRUxMRUQnLiAKICAgICAgICBGb3IgZXhhbXBsZSwgaW4gdGhlICdGQUlMRUQnIG9yICdQQVJUSUFMTFlfRkFJTEVEJyBzdGF0ZSB0aGlzIAogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MgCiAgICAgICAgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwsIGlmIGFueS4gRm9yIHRoaXMgcHVycG9zZSwgZGVkaWNhdGVkIAogICAgICAgIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3BlY2lmaWVkIHdoZW4gc3BlY2lmeWluZyB0aGUgcmVwcmVzZW50YXRpb24gb2YgCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcgCiAgICAgICAgcGF0dGVybnMgb3IgZW51bXMpIG1heSBiZSBkZWZpbmVkIGFzIGEgc3BlY2lhbGlzYXRpb24uIjsKICAgIH0KCiAgICBsZWFmIHN0YXJ0VGltZSB7CiAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJTdGFydCB0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsIGkuZS4gdGhlIHRpbWUgd2hlbiB0aGUgCiAgICAgICAgc3RhdHVzIGNoYW5nZWQgZnJvbSAnTk9UX1NUQVJURUQnIHRvICdSVU5OSU5HJy4iOwogICAgfQoKICAgIGxlYWYgZW5kVGltZSB7CiAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJEYXRlIGFuZCB0aW1lIHdoZW4gc3RhdHVzIGNoYW5nZWQgdG8gJ1NVQ0NFU1MnLCAnQ0FOQ0VMTEVEJywgCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLiAKCiAgICAgICAgSWYgdGhlIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZSwgaXQgaXMgdGhlIGVzdGltYXRlZCB0aW1lIAogICAgICAgIHRoZSBwcm9jZXNzIHdpbGwgZW5kLiI7CiAgICB9CgogICAgbGVhZiB0aW1lciB7CiAgICAgIHR5cGUgdWludDMyOwogICAgICB1bml0cyBtaW51dGVzOwogICAgICBkZXNjcmlwdGlvbiAiVGltZSB1bnRpbCB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGF1dG9tYXRpY2FsbHkgY2FuY2VsbGVkLgogICAgICAgIElmIHNldCwgdGhlIHN5c3RlbSBkZWNyZWFzZXMgdGhlIHRpbWVyIHdpdGggdGltZS4gV2hlbiBpdCByZWFjaGVzIHplcm8gCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUgCiAgICAgICAgTW5TX1Byb2R1Y2VyLiAKICAgICAgICBJZiBub3Qgc2V0LCB0aGVyZSBpcyBubyB0aW1lIGxpbWl0IGZvciB0aGUgcHJvY2Vzcy4KICAgICAgICAKICAgICAgICBPbmNlIHRoZSB0aW1lciBpcyBzZXQsIHRoZSBjb25zdW1lciBjYW4gbm90IGNoYW5nZSBpdCBhbnltb3JlLiAKICAgICAgICBJZiB0aGUgY29uc3VtZXIgaGFzIG5vdCBzZXQgdGhlIHRpbWVyIHRoZSBNblMgUHJvZHVjZXIgbWF5IHNldCBpdC4iOwogICAgICB5ZXh0M2dwcDpub3ROb3RpZnlhYmxlOwogICAgfQogIH0KICAKICB0eXBlZGVmIFRlbnRoT2ZEZWdyZWVzIHsgCiAgICB0eXBlIHVpbnQxNiB7IAogICAgICByYW5nZSAwLi4zNjAwOyAKICAgIH0KICAgIHVuaXRzICIwLjEgZGVncmVlcyI7CiAgICBkZXNjcmlwdGlvbiAiQSBzaW5nbGUgaW50ZWdyYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBhbmdsZSBpbiBkZWdyZWVzIAogICAgICBiZXR3ZWVuIDAgYW5kIDM2MCB3aXRoIGEgcmVzb2x1dGlvbiBvZiAwLjEgZGVncmVlcy4iOwogIH0KCiAgdHlwZWRlZiBMYXRpdHVkZSB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICByYW5nZSAiLTkwLjAwMDAuLis5MC4wMDAwIjsgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7IAogICAgfQogICAgZGVzY3JpcHRpb24gIkxvbmdpdHVkZSB2YWx1ZXMiOwogIH0KCiAgdHlwZWRlZiBBbHRpdHVkZSAgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgIH0KICAgIHVuaXRzICJtZXRlcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuIjsgIAogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKICAgIAogICAgbGVhZiBsYXRpdHVkZSB7CiAgICAgIHR5cGUgTGF0aXR1ZGU7CiAgICAgIG1hbmRhdG9yeSB0cnVlOyAKICAgIH0KICAgICAgCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgTG9uZ2l0dWRlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsgCiAgICB9CiAgICAKICAgIGxlYWYgYWx0aXR1ZGUgewogICAgICB0eXBlIEFsdGl0dWRlOwogICAgfQogICAgCiAgfQoKICB0eXBlZGVmIE9uT2ZmIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE9OOwogICAgICBlbnVtIE9GRjsKICAgIH0KICB9CiAgCiAgLy8gZ3JvdXBpbmcgTWFuYWdlZE5GUHJvZmlsZSB3aWxsIGJlIHJlbW92ZWQgYXMgaXQgaXMgCiAgLy8gIGJlaW5nIG1vdmVkIHRvIF8zZ3BwLTVnYy1ucm0tbmZwcm9maWxlCiAgZ3JvdXBpbmcgTWFuYWdlZE5GUHJvZmlsZSB7CiAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GIjsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy41MDEiOwogICAgCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQogICAgCiAgICBsZWFmIG5mSW5zdGFuY2VJRCB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgeWFuZzp1dWlkIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORi4gCiAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgTkYgSW5zdGFuY2UgSUQgc2hhbGwgYmUgYSAKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LCAKICAgICAgICBhcyBkZXNjcmliZWQgaW4gSUVURiBSRkMgNDEyMiAiIDsKICAgICAgeWV4dDNncHA6aW5WYXJpYW50OwogICAgfQogICAgCiAgICBsZWFmLWxpc3QgbmZUeXBlIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgdHlwZSBOZlR5cGU7CiAgICAgIGRlc2NyaXB0aW9uICJUeXBlIG9mIHRoZSBOZXR3b3JrIEZ1bmN0aW9uIiA7CiAgICB9CiAgICAKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQogICAgCiAgICBsZWFmIGF1dGh6SW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgTkYgU3BlY2lmaWMgU2VydmljZSBhdXRob3JpemF0aW9uIAogICAgICAgIGluZm9ybWF0aW9uLiBJdCBzaGFsbCBpbmNsdWRlIHRoZSBORiB0eXBlIChzKSBhbmQgTkYgcmVhbG1zL29yaWdpbnMgCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KICAgIAogICAgbGVhZiBsb2NhdGlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIkluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgTkYgaW5zdGFuY2UgCiAgICAgICAgKGUuZy4gZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgZGF0YSBjZW50ZXIpIGRlZmluZWQgYnkgb3BlcmF0b3IiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uIAogICAgICAgIGluIHRoZSByYW5nZSBvZiAwLTY1NTM1LCBleHByZXNzZWQgYXMgYSB3ZWlnaHQgcmVsYXRpdmUgdG8gb3RoZXIgCiAgICAgICAgTkYgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IGlmIGNhcGFjaXR5IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgICAgCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMgCiAgICAgICAgc2VydmVkIGJ5IHRoZSBORiBpbnN0YW5jZS4KICAgICAgICBNYXkgYmUgY29uZmlnIGZhbHNlIG9yIHRydWUgZGVwZW5kaW5nIG9uIHRoZSBNYW5hZ2VkRnVuY3Rpb24uIAogICAgICAgIENvbmZpZz10cnVlIGZvciBVZHJpbmZvLiBDb25maWc9ZmFsc2UgZm9yIFVkbUluZm8gYW5kIEF1c2ZJbmZvLiAKICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgIAogICAgbGVhZi1saXN0IHN1cHBvcnRlZERhdGFTZXRJZHMgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNVQlNDUklQVElPTjsKICAgICAgICBlbnVtIFBPTElDWTsKICAgICAgICBlbnVtIEVYUE9TVVJFOwogICAgICAgIGVudW0gQVBQTElDQVRJT047CiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2Ygc3VwcG9ydGVkIGRhdGEgc2V0cyBpbiB0aGUgVURSIGluc3RhbmNlLiAKICAgICAgICBNYXkgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVRFIiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4gCiAgICAgICAgU2hhbGwgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVUEYiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIHByaW9yaXR5IHsKICAgICAgdHlwZSB1aW50MTY7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHBhcmFtZXRlciBkZWZpbmVzIFByaW9yaXR5IChyZWxhdGl2ZSB0byBvdGhlciBORnMgCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsgCiAgICAgICAgbG93ZXIgdmFsdWVzIGluZGljYXRlIGEgaGlnaGVyIHByaW9yaXR5LiBJZiBwcmlvcml0eSBpcyBhbHNvIHByZXNlbnQgCiAgICAgICAgaW4gdGhlIG5mU2VydmljZUxpc3QgcGFyYW1ldGVycywgdGhvc2Ugd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciAKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KICAKICB0eXBlZGVmIHVzYWdlU3RhdGUgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gSURMRTsKICAgICAgZW51bSBBQ1RJVkU7CiAgICAgIGVudW0gQlVTWTsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJJdCBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIHJlc291cmNlIGlzIGFjdGl2ZWx5IGluIAogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZSAKICAgICAgY2FwYWNpdHkgZm9yIGFkZGl0aW9uYWwgdXNlcnMgYXQgdGhhdCBpbnN0YW50LiBUaGUgdmFsdWUgaXMgUkVBRC1PTkxZLiI7CiAgICByZWZlcmVuY2UgIklUVSBUIFJlY29tbWVuZGF0aW9uIFguNzMxIjsKICB9CiAgCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CiAgCiAgdHlwZWRlZiBNY2MgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIGRlY2ltYWwgZGlnaXRzLCAKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMgCiAgICAgIHJlZ2lvbiAodGhlIGRpZ2l0cyAxIGFuZCA4IGFyZSBub3QgdXNlZCk6IjsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAyLTc5XVswLTldWzAtOV0nOwogICAgfQogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjAwMyBzdWJjbGF1c2UgMi4yIGFuZCAxMi4xIjsKICB9CgogIHR5cGVkZWYgTW5jIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIG5ldHdvcmsgY29kZSBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgCiAgICAgIGRlY2ltYWwgZGlnaXRzIChmb3IgZXhhbXBsZTogTU5DIG9mIDAwMSBpcyBub3QgdGhlIHNhbWUgYXMgTU5DIG9mIDAxKSI7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1swLTldWzAtOV1bMC05XXxbMC05XVswLTldJzsKICAgIH0KICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy4wMDMgc3ViY2xhdXNlIDIuMiBhbmQgMTIuMSI7CiAgfQoKICBncm91cGluZyBQTE1OSWQgewogICAgbGVhZiBtY2MgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNY2M7CiAgICB9CiAgICBsZWFmIG1uYyB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICB0eXBlIE1uYzsKICAgIH0KICAgIHJlZmVyZW5jZSAiVFMgMzguNDEzIGNsYXVzZSA5LjMuMy41IjsKICB9CiAgCiAgdHlwZWRlZiBOY2kgewogICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIFRoZSBOQ0kgc2hhbGwgYmUgb2YgZml4ZWQgbGVuZ3RoIG9mIDM2IGJpdHMgCiAgICAgIGFuZCBzaGFsbCBiZSBjb2RlZCB1c2luZyBmdWxsIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiAKICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQogICAgCiAgdHlwZWRlZiBPcGVyYXRpb25hbFN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIHsKICAgICAgICB2YWx1ZSAwOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgdG90YWxseSBpbm9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICAgIGVudW0gRU5BQkxFRCB7CiAgICAgICAgdmFsdWUgMTsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIHBhcnRpYWxseSBvciBmdWxseSBvcGVyYWJsZS4iOwogICAgICB9CgogICAgfQogIH0KICAKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgdHlwZWRlZiBBZG1pbmlzdHJhdGl2ZVN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIExPQ0tFRCB7CiAgICAgICAgdmFsdWUgMDsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCBmcm9tIHBlcmZvcm1pbmcKICAgICAgICAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiI7CiAgICAgIH0KCiAgICAgIGVudW0gVU5MT0NLRUQgewogICAgICAgIHZhbHVlIDE7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHBlcm1pdHRlZCB0byBwZXJmb3JtCiAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGl0cyBpbmhlcmVudAogICAgICAgICAgb3BlcmFiaWxpdHkuIjsKICAgICAgfQoKICAgICAgZW51bSBTSFVUVElOR0RPV04gewogICAgICAgIHZhbHVlIDI7CiAgICAgICAgZGVzY3JpcHRpb24gIlVzZSBvZiB0aGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8KICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlcyBvZiB1c2Ugb25seS4gV2hpbGUgdGhlIHN5c3RlbSByZW1haW5zIGluCiAgICAgICAgICB0aGUgc2h1dHRpbmcgZG93biBzdGF0ZSB0aGUgbWFuYWdlciBvciB0aGUgbWFuYWdlZCBlbGVtZW50IAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZSAKICAgICAgICAgIGxvY2tlZCBzdGF0ZS4iOwogICAgICB9CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBPRkZfTElORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFR1JBREVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBMT0dfRlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICB9CiAgCiAgdHlwZWRlZiBDZWxsU3RhdGUgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIElETEU7CiAgICAgICAgZW51bSBJTkFDVElWRTsgICAgICAgICAgICAgIAogICAgICAgIGVudW0gQUNUSVZFOyAgICAgICAgICAgICAgCiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKSAKICAgICAgYXMgc3BlY2lmaWVkIGluIGNsYXVzZSAyOC42IG9mIFRTIDIzLjAwMywgY2xhdXNlIDguMiBvZiBUUyAzOC4zMDAgCiAgICAgIGFuZCBjbGF1c2UgOS4zLjMuMTEgb2YgVFMgMzguNDEzLiBJdCBpcyBjb21wb3NlZCBvZiB0aGUgUExNTiAKICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQgCiAgICAgIHRoZSBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuICI7CiAgICBsaXN0IHBsbW5JZCB7CiAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElkZW50aXR5LiI7CiAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICBtYXgtZWxlbWVudHMgMTsKICAgICAga2V5ICJtY2MgbW5jIjsKICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgfQogICAgCiAgICBsZWFmIHRhYyB7IHR5cGUgVGFjOyB9CiAgfQogICAgICAgCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsgCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICAgIHJhbmdlIC05MC4uOTAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgYmFzZWQgb24gV29ybGQgR2VvZGV0aWMgU3lzdGVtICgxOTg0IHZlcnNpb24pIAogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSAKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KICAgICAgICAKICAgIGxlYWYgbG9uZ2l0dWRlIHsKICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICAgIHJhbmdlIC0xODAuLjE4MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMb25naXR1ZGUgYmFzZWQgb24gV29ybGQgR2VvZGV0aWMgU3lzdGVtICgxOTg0IHZlcnNpb24pIAogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvIAogICAgICAgIGRlZ3JlZXMgZWFzdCBvZiAwIGRlZ3JlZXMgbG9uZ2l0dWRlLiI7CiAgICB9CiAgfQogICAKICBncm91cGluZyBHZW9BcmVhR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIGRhdGEgdHlwZSBkZWZpbmVzIGEgZ2VvZ3JhcGhpY2FsIGFyZWEuIAogICAgICBUaGUgZ2VvLWFyZWEgaXMgZGVmaW5lZCB1c2luZyBhIGNvbnZleCBwb2x5Z29uIGluIHRoZSBhdHRyaWJ1dGUgCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwogICAgCiAgICBsaXN0IGNvbnZleEdlb1BvbHlnb24gewogICAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIHRoZSBnZW9ncmFwaGljYWwgYXJlYSB3aXRoIGEgY29udmV4IHBvbHlnb24uIAogICAgICAgIFRoZSBjb252ZXggcG9seWdvbiBpcyBzcGVjaWZpZWQgYnkgaXRzIGNvcm5lcnMuIjsKICAgICAgICBrZXkgImxhdGl0dWRlIGxvbmdpdHVkZSI7CiAgICAgIG1pbi1lbGVtZW50cyAzOwogICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgIAogICAgICB1c2VzIEdlb0Nvb3JkaW5hdGVHcnA7CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQW1mUmVnaW9uSWQgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQ4IDsKICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA4OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIHR5cGVkZWYgQW1mU2V0SWQgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQ4IHsKICAgICAgICByYW5nZSAnMC4uNjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggNjsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQogICAgICAgIAogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgeyAgICAgICAgCiAgICBsZWFmIGFtZlJlZ2lvbklkIHsKICAgICAgdHlwZSBBbWZSZWdpb25JZDsKICAgIH0KICAgIGxlYWYgYW1mU2V0SWQgewogICAgICB0eXBlIEFtZlNldElkOwogICAgfQogICAgbGVhZiBhbWZQb2ludGVyIHsKICAgICAgdHlwZSBBbWZQb2ludGVyOwogICAgfSAKICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsIAogICAgICBhbiBBTUYgU2V0IElEIGFuZCBhbiBBTUYgUG9pbnRlci4gCiAgICAgIFRoZSBBTUYgUmVnaW9uIElEIGlkZW50aWZpZXMgdGhlIHJlZ2lvbiwgCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQgCiAgICAgIHRoZSBBTUYgUG9pbnRlciB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBBTUYgd2l0aGluIHRoZSBBTUYgU2V0LiAiOyAKICB9ICAgIAoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0gICAgICAgICAgCiAgfQogIAogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9ICAgICAgCiAgfQogIAogIHR5cGVkZWYgTG9hZCB7CiAgICBkZXNjcmlwdGlvbiAiTGF0ZXN0IGtub3duIGxvYWQgaW5mb3JtYXRpb24gb2YgdGhlIE5GLCBwZXJjZW50YWdlICI7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgMC4uMTAwOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMU1lc3NhZ2VDbGFzcyB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSA1R01NOwogICAgICBlbnVtIFNNOwogICAgICBlbnVtIExQUDsKICAgICAgZW51bSBTTVM7IAogICAgfSAgICAgIAogIH0KICAKICB0eXBlZGVmIE4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBOUlBQQTsKICAgICAgZW51bSBQV1M7CiAgICAgIGVudW0gUFdTX0JDQUw7CiAgICAgIGVudW0gUFdTX1JGOwogICAgfSAgICAgICAgICAgICAgCiAgfQogIAogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewogICAgCiAgICBsZWFmIG5vdGlmaWNhdGlvblR5cGUgewogICAgICB0eXBlIE5vdGlmaWNhdGlvblR5cGU7CiAgICB9CiAgICAKICAgIGxlYWYgY2FsbGJhY2tVcmkgewogICAgICB0eXBlIGluZXQ6dXJpOwogICAgfQogICAgCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KICAgIAogICAgbGVhZiBuMkluZm9ybWF0aW9uQ2xhc3MgewogICAgICB0eXBlIE4ySW5mb3JtYXRpb25DbGFzczsKICAgIH0gICAgCiAgfSAgCiAgICAgICAgCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9ICAgIAogIH0KICAgIAogIGdyb3VwaW5nIElwdjZQcmVmaXhSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgbGVhZiBlbmQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfSAgICAKICB9CiAgICAgCiAgdHlwZWRlZiBOc2lJZCB7CiAgICB0eXBlIHN0cmluZzsKICB9CiAgICAKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CiAgICAgIAogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CiAgICAgIAogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CiAgICAgIAogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOyAgIAogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9ICAKICB9CgogIC8qIERpc3Rpbmd1aXNoZWROYW1lIHBhdHRlcm4gaXMgYnVpbHQgdXAgYmFzZWQgb24gdGhlIAogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KICAKICAgIGxlYWYgRE4geyB0eXBlIHN0cmluZyB7ICAgLy8gIFNhbWUgcGF0dGVybiBhcyBMb2NhbEROCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBmdWxsTG9jYWxETiB7IHR5cGUgc3RyaW5nIHsgICAvLyBMb2NhbFJETiAsIHsgUkROU2VwYXJhdG9yICwgTG9jYWxSRE4gfSAgICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkICAgTWUubXlrZXk9MSBhbGxvd2VkCiAgICAgIC8vICAoZnVsbExvY2FsUkROKSgsKGZ1bGxMb2NhbFJETikpKgogICAgICBwYXR0ZXJuICcoKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSkoLCgoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSkqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBmdWxsTG9jYWxSRE4geyB0eXBlIHN0cmluZyB7ICAgLy8gc2FtZSBhcyBmdWxsTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBMb2NhbFJETiB7IHR5cGUgc3RyaW5nIHsgICAvLyBzYW1lIGFzIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8nOyAgICAgIAogICAgfSB9CiAgCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZSAKICAgICAgLy8gcGF0dGVybiBMb2NhbEROQXR0cmlidXRlVHlwZT1SZWd1bGFyQXR0cmlidXRlVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7ICAgICAgCiAgICB9IH0KICAgIAogICAgICAvLyBsaW1pdGF0aW9uOiBOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGVub3Qgc3VwcG9ydGVkIE1lLm15a2V5PTEKICAgIGxlYWYgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSB7IHR5cGUgc3RyaW5nIHsgCiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7ICAgICAgCiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOyAgICAgIAogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7IAogICAgfSB9CiAgICAKICAgIGxlYWYgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICB7IHR5cGUgc3RyaW5nIHsgIC8vIENsYXNzTmFtZSAsIENsYXNzTmFtaW5nQXR0cmlidXRlU2VwYXJhdG9yICwgTmFtaW5nQXR0cmlidXRlTmFtZQogICAgICAvLyBwYXR0ZXJuOiBDbGFzc05hbWVcLk5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKicgOyAKICAgIH0gfQogIAogICAgbGVhZiByZXN0cmljdGl2ZUNsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIAogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7IAogICAgfSB9CiAgCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7IAogICAgfSB9CiAgCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7IAogICAgfSB9ICAgIAogICAgCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsgICAgCiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18JwogICAgICArICcoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPycKICAgICAgKyAnKCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSknCiAgICAgICsgJygoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqJwogICAgICArICcoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7ICAgICAgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgM0dQUCBzdGFuZGFyZCBmb3IgRGlzdGluZ3Vpc2hlZE5hbWUuIAogICAgICAKICAgICAgTGltaXRhdGlvbnM6IAogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZCAKICAgICAgICAoZWcuIE1hbmFnZWRFbGVtZW50Lm15a2V5PTM0NTQzNikiOwogICAgcmVmZXJlbmNlICAiM0dQUCBUUyAzMi4zMDAiOwogIH0gCiAKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsgCiAgICAgIHJhbmdlICItMjQgfCAtMjIgfCAtMjAgfCAtMTggfCAtMTYgfCAtMTQgfCAtMTIgfCAtMTAgfCAtOCB8IC02IHwgIiArCiAgICAgICAgIiAtNSB8IC00IHwgLTMgfCAtMiB8IC0xIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDggfCAxMCB8ICIgKwogICAgICAgICIgMTIgfCAxNCB8IDE2IHwgMTggfCAyMCB8IDIyIHwgMjQiOyAKICAgIH0KICAgIHVuaXRzIGRCOwogIH0KCiAgZ3JvdXBpbmcgUmVwb3J0aW5nQ3RybCB7CiAgICBjaG9pY2UgcmVwb3J0aW5nQ3RybCB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiCiAgICAgICAgVGhpcyBjaG9pY2UgZGVmaW5lcyB0aGUgbWV0aG9kIGZvciByZXBvcnRpbmcgY29sbGVjdGVkIHBlcmZvcm1hbmNlCiAgICAgICAgbWV0cmljcyB0byBNblMgY29uc3VtZXJzIGFzIHdlbGwgYXMgdGhlIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyaW5nIHRoZQogICAgICAgIHJlcG9ydGluZyBmdW5jdGlvbi4gSXQgaXMgYSBjaG9pY2UgYmV0d2VlbiB0aGUgY29udHJvbCBwYXJhbWV0ZXIKICAgICAgICByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydGluZyBtZXRob2RzLCB3aG9zZSBwcmVzZW5jZSBzZWxlY3RzIHRoZQogICAgICAgIHJlcG9ydGluZyBtZXRob2QgYXMgZm9sbG93czoKCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYXR0cmlidXRlIGlzIHByZXNlbnQsIHRoZSBNblMKICAgICAgICBwcm9kdWNlciBzaGFsbCBzdG9yZSBmaWxlcyBvbiB0aGUgTW5TIHByb2R1Y2VyIGF0IGEgbG9jYXRpb24gc2VsZWN0ZWQKICAgICAgICBieSB0aGUgTW5TIHByb2R1Y2VyIGFuZCwgb24gY29uZGl0aW9uIHRoYXQgYW4gYXBwcm9wcmlhdGUgc3Vic2NyaXB0aW9uCiAgICAgICAgaXMgaW4gcGxhY2UsIGluZm9ybSB0aGUgTW5TIGNvbnN1bWVyIGFib3V0IHRoZSBhdmFpbGFiaWxpdHkgb2YgbmV3CiAgICAgICAgZmlsZXMgYW5kIHRoZSBmaWxlIGxvY2F0aW9uIHVzaW5nIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLgogICAgICAgIEluIGNhc2UgdGhlIHByZXBhcmF0aW9uIG9mIGEgZmlsZSBmYWlscywgJ25vdGlmeUZpbGVQcmVwYXJhdGlvbkVycm9yJwogICAgICAgIHNoYWxsIGJlIHNlbnQgaW5zdGVhZC4KCiAgICAgICAgLSBXaGVuIHRoZSAnZmlsZVJlcG9ydGluZ1BlcmlvZCcgYW5kICdub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzJwogICAgICAgIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQsIHRoZW4gdGhlIE1uUyBwcm9kdWNlciBzaGFsbCBiZWhhdmUgbGlrZQogICAgICAgIGRlc2NyaWJlZCBmb3IgdGhlIGNhc2UgdGhhdCBvbmx5IHRoZSAnZmlsZVJlcG9ydGluZ1BlcmlvZCcgaXMgcHJlc2VudC4KICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIE1uUyBwcm9kdWNlciBzaGFsbCBjcmVhdGUgb24gYmVoYWxmIG9mIHRoZSBNblMKICAgICAgICBjb25zdW1lciBhIHN1YnNjcmlwdGlvbiwgdXNpbmcgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnLCBmb3IgdGhlCiAgICAgICAgbm90aWZpY2F0aW9uIHR5cGVzICdub3RpZnlNT0lDcmVhdGlvbicgYW5kICdub3RpZnlNT0lEZWxldGlvbicgcmVsYXRlZAogICAgICAgIHRvIHRoZSAnRmlsZScgaW5zdGFuY2VzIHRoYXQgd2lsbCBiZSBwcm9kdWNlZCBsYXRlci4gSW4gY2FzZSBhbiBleGlzdGluZwogICAgICAgIHN1YnNjcmlwdGlvbiBkb2VzIGFscmVhZHkgaW5jbHVkZSB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0byBiZSBwcm9kdWNlZCwKICAgICAgICBubyBuZXcgc3Vic2NyaXB0aW9uIHNoYWxsIGJlIGNyZWF0ZWQuIFRoZQogICAgICAgICdub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzJyBhdHRyaWJ1dGUgaW4gdGhlIGNyZWF0ZWQKICAgICAgICAnTnRmU3Vic2NyaXB0aW9uQ29udHJvbCcgaW5zdGFuY2Ugc2hhbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgaW4gdGhlIHJlbGF0ZWQgJ1BlcmZNZXRyaWNKb2InLiBUaGlzCiAgICAgICAgZmVhdHVyZSBpcyBjYWxsZWQgaW1wbGljaXQgbm90aWZpY2F0aW9uIHN1YnNjcmlwdGlvbiwgYXMgb3Bwb3NlZCB0byB0aGUKICAgICAgICBjYXNlIHdoZXJlIHRoZSBNblMgY29uc3VtZXIgY3JlYXRlcyB0aGUgc3Vic2NyaXB0aW9uIChleHBsaWNpdAogICAgICAgIG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24pLiBXaGVuIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJyBpcwogICAgICAgIGRlbGV0ZWQsIHRoZSAnTnRmU3Vic2NyaXB0aW9uQ29udHJvbCcgaW5zdGFuY2UgY3JlYXRlZCBkdWUgdG8gdGhlCiAgICAgICAgcmVxdWVzdCBmb3IgaW1wbGljaXQgc3Vic2NyaXB0aW9uIHNoYWxsIGJlIGRlbGV0ZWQgYXMgd2VsbC4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYW5kIGZpbGVMb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgIHByZXNlbnQsIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgc3RvcmUgdGhlIGZpbGVzIG9uIGEgTW5TIGNvbnN1bWVyLCB0aGF0CiAgICAgICAgY2FuIGJlIGFueSBlbnRpdHkgc3VjaCBhcyBhIGZpbGUgc2VydmVyLCBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5CiAgICAgICAgZmlsZUxvY2F0aW9uLiBObyBub3RpZmljYXRpb24gaXMgZW1pdHRlZCBieSB0aGUgTW5TIHByb2R1Y2VyLgoKICAgICAgICAtIFdoZW4gb25seSB0aGUgc3RyZWFtVGFyZ2V0IGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyCiAgICAgICAgc2hhbGwgc3RyZWFtIHRoZSBkYXRhIHRvIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgc3RyZWFtVGFyZ2V0LgoKICAgICAgICBGb3IgdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZHMgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYXR0cmlidXRlCiAgICAgICAgc3BlY2lmaWVzIHRoZSB0aW1lIHdpbmRvdyBkdXJpbmcgd2hpY2ggY29sbGVjdGVkIG1lYXN1cmVtZW50cyBhcmUKICAgICAgICBzdG9yZWQgaW50byB0aGUgc2FtZSBmaWxlIGJlZm9yZSB0aGUgZmlsZSBpcyBjbG9zZWQgYW5kIGEgbmV3IGZpbGUgaXMKICAgICAgICBvcGVuZWQuIjsKCiAgICAgIGNhc2UgZmlsZS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgZmlsZVJlcG9ydGluZ1BlcmlvZCB7CiAgICAgICAgICB0eXBlIHVpbnQzMiB7CiAgICAgICAgICAgIHJhbmdlIDEuLm1heDsKICAgICAgICAgIH0KICAgICAgICAgIHVuaXRzIG1pbnV0ZXM7CiAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICAgIGRlc2NyaXB0aW9uICJGb3IgdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZCB0aGlzIGlzIHRoZSB0aW1lCiAgICAgICAgICAgIHdpbmRvdyBkdXJpbmcgd2hpY2ggY29sbGVjdGVkIG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkIGludG8gdGhlIHNhbWUKICAgICAgICAgICAgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzIG9wZW5lZC4KICAgICAgICAgICAgVGhlIHRpbWUtcGVyaW9kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZ3JhbnVsYXJpdHlQZXJpb2QuCgogICAgICAgICAgICBBcHBsaWNhYmxlIHdoZW4gdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQuIjsKICAgICAgICB9CiAgICAgICAgY2hvaWNlIHJlcG9ydGluZy10YXJnZXQgewogICAgICAgICAgY2FzZSBmaWxlLXRhcmdldCB7CiAgICAgICAgICAgIGxlYWYgZmlsZUxvY2F0aW9uIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmcgOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSBhbmQgbXVzdCBiZSBwcmVzZW50IHdoZW4gdGhlIGZpbGUtYmFzZWQKICAgICAgICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGlzIHN1cHBvcnRlZCwgYW5kIHRoZSBmaWxlcyBhcmUgc3RvcmVkIG9uIHRoZSBNblMKICAgICAgICAgICAgICBjb25zdW1lci4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIG5vdGlmaWNhdGlvbi10YXJnZXQgewogICAgICAgICAgICBsZWFmIG5vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBub3RpZmljYXRpb24tYmFzZWQgcmVwb3J0aW5nCiAgICAgICAgICAgICAgbWV0aG9kIGlzIHN1cHBvcnRlZCwgYW5kIHRoZSB0aGUgZmlsZXMgYXJlIGF2YWlsYWJsZSBhcwogICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBNblMgY29uc3VtZXIgdG8gc3Vic2NyaWJlIHRvLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBkZXNjcmlwdGlvbiAiV2hlbiBuZXRpaGVyIGZpbGVMb2NhdGlvbiBvciBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzCiAgICAgICAgICBhcmUgcHJlc2VudCwgdGhlIGZpbGVzIGFyZSBzdG9yZWQgYW5kIGF2YWlsYWJsZSB0byB0aGUgTW5TIGNvbnN1bWVyCiAgICAgICAgICBpZiB0aGUgTW5TIHN1YnNjcmliZXMgdG8gdGhlIG5vdGlmeUZpbGVSZWFkeSBub3RpZmljYXRpb24uIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNhc2Ugc3RyZWFtLWJhc2VkLXJlcG9ydGluZyB7CiAgICAgICAgbGVhZiBzdHJlYW1UYXJnZXQgewogICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICAgIGRlc2NyaXB0aW9uICJBcHBsaWNhYmxlIHdoZW4gc3RyZWFtLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMKICAgICAgICAgICAgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9 +ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo= +ietf-inet-types urn:ietf:params:xml:ns:yang:ietf-inet-types \N [] 2013-07-15 bW9kdWxlIGlldGYtaW5ldC10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtaW5ldC10eXBlcyI7CiAgcHJlZml4ICJpbmV0IjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcyBmb3IgSW50ZXJuZXQgYWRkcmVzc2VzIGFuZCByZWxhdGVkIHRoaW5ncy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSBpcC1hZGRyZXNzLW5vLXpvbmUKICAgICAgLSBpcHY0LWFkZHJlc3Mtbm8tem9uZQogICAgICAtIGlwdjYtYWRkcmVzcy1uby16b25lIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBwcm90b2NvbCBmaWVsZHMgKioqLwoKICB0eXBlZGVmIGlwLXZlcnNpb24gewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gdW5rbm93biB7CiAgICAgICAgdmFsdWUgIjAiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJBbiB1bmtub3duIG9yIHVuc3BlY2lmaWVkIHZlcnNpb24gb2YgdGhlIEludGVybmV0CiAgICAgICAgICBwcm90b2NvbC4iOwogICAgICB9CiAgICAgIGVudW0gaXB2NCB7CiAgICAgICAgdmFsdWUgIjEiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJUaGUgSVB2NCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFJGQyA3OTEuIjsKICAgICAgfQogICAgICBlbnVtIGlwdjYgewogICAgICAgIHZhbHVlICIyIjsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAiVGhlIElQdjYgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiBSRkMgMjQ2MC4iOwogICAgICB9CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHZlcnNpb24gb2YgdGhlIElQIHByb3RvY29sLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEluZXRWZXJzaW9uIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgIDc5MTogSW50ZXJuZXQgUHJvdG9jb2wKICAgICAgUkZDIDI0NjA6IEludGVybmV0IFByb3RvY29sLCBWZXJzaW9uIDYgKElQdjYpIFNwZWNpZmljYXRpb24KICAgICAgUkZDIDQwMDE6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIEludGVybmV0IE5ldHdvcmsgQWRkcmVzc2VzIjsKICB9CgogIHR5cGVkZWYgZHNjcCB7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgIjAuLjYzIjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBkc2NwIHR5cGUgcmVwcmVzZW50cyBhIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIENvZGUgUG9pbnQKICAgICAgdGhhdCBtYXkgYmUgdXNlZCBmb3IgbWFya2luZyBwYWNrZXRzIGluIGEgdHJhZmZpYyBzdHJlYW0uCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBEc2NwIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzI4OTogTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIGZvciB0aGUgRGlmZmVyZW50aWF0ZWQKICAgICAgICAgICAgICAgIFNlcnZpY2VzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgMjQ3NDogRGVmaW5pdGlvbiBvZiB0aGUgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgRmllbGQKICAgICAgICAgICAgICAgIChEUyBGaWVsZCkgaW4gdGhlIElQdjQgYW5kIElQdjYgSGVhZGVycwogICAgICBSRkMgMjc4MDogSUFOQSBBbGxvY2F0aW9uIEd1aWRlbGluZXMgRm9yIFZhbHVlcyBJbgogICAgICAgICAgICAgICAgdGhlIEludGVybmV0IFByb3RvY29sIGFuZCBSZWxhdGVkIEhlYWRlcnMiOwogIH0KCiAgdHlwZWRlZiBpcHY2LWZsb3ctbGFiZWwgewogICAgdHlwZSB1aW50MzIgewogICAgICByYW5nZSAiMC4uMTA0ODU3NSI7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2Ni1mbG93LWxhYmVsIHR5cGUgcmVwcmVzZW50cyB0aGUgZmxvdyBpZGVudGlmaWVyIG9yIEZsb3cKICAgICAgTGFiZWwgaW4gYW4gSVB2NiBwYWNrZXQgaGVhZGVyIHRoYXQgbWF5IGJlIHVzZWQgdG8KICAgICAgZGlzY3JpbWluYXRlIHRyYWZmaWMgZmxvd3MuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSVB2NkZsb3dMYWJlbCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM1OTU6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIElQdjYgRmxvdyBMYWJlbAogICAgICBSRkMgMjQ2MDogSW50ZXJuZXQgUHJvdG9jb2wsIFZlcnNpb24gNiAoSVB2NikgU3BlY2lmaWNhdGlvbiI7CiAgfQoKICB0eXBlZGVmIHBvcnQtbnVtYmVyIHsKICAgIHR5cGUgdWludDE2IHsKICAgICAgcmFuZ2UgIjAuLjY1NTM1IjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBwb3J0LW51bWJlciB0eXBlIHJlcHJlc2VudHMgYSAxNi1iaXQgcG9ydCBudW1iZXIgb2YgYW4KICAgICAgSW50ZXJuZXQgdHJhbnNwb3J0LWxheWVyIHByb3RvY29sIHN1Y2ggYXMgVURQLCBUQ1AsIERDQ1AsIG9yCiAgICAgIFNDVFAuICBQb3J0IG51bWJlcnMgYXJlIGFzc2lnbmVkIGJ5IElBTkEuICBBIGN1cnJlbnQgbGlzdCBvZgogICAgICBhbGwgYXNzaWdubWVudHMgaXMgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cuaWFuYS5vcmcvPi4KCiAgICAgIE5vdGUgdGhhdCB0aGUgcG9ydCBudW1iZXIgdmFsdWUgemVybyBpcyByZXNlcnZlZCBieSBJQU5BLiAgSW4KICAgICAgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdmFsdWUgemVybyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4KICAgICAgYmUgZXhjbHVkZWQgYnkgc3VidHlwaW5nIHRoZSBwb3J0LW51bWJlciB0eXBlLgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSW5ldFBvcnROdW1iZXIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgNzY4OiBVc2VyIERhdGFncmFtIFByb3RvY29sCiAgICAgIFJGQyAgNzkzOiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbAogICAgICBSRkMgNDk2MDogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sCiAgICAgIFJGQyA0MzQwOiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKERDQ1ApCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBhdXRvbm9tb3VzIHN5c3RlbXMgKioqLwoKICB0eXBlZGVmIGFzLW51bWJlciB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBhcy1udW1iZXIgdHlwZSByZXByZXNlbnRzIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlcnMKICAgICAgd2hpY2ggaWRlbnRpZnkgYW4gQXV0b25vbW91cyBTeXN0ZW0gKEFTKS4gIEFuIEFTIGlzIGEgc2V0CiAgICAgIG9mIHJvdXRlcnMgdW5kZXIgYSBzaW5nbGUgdGVjaG5pY2FsIGFkbWluaXN0cmF0aW9uLCB1c2luZwogICAgICBhbiBpbnRlcmlvciBnYXRld2F5IHByb3RvY29sIGFuZCBjb21tb24gbWV0cmljcyB0byByb3V0ZQogICAgICBwYWNrZXRzIHdpdGhpbiB0aGUgQVMsIGFuZCB1c2luZyBhbiBleHRlcmlvciBnYXRld2F5CiAgICAgIHByb3RvY29sIHRvIHJvdXRlIHBhY2tldHMgdG8gb3RoZXIgQVNlcy4gIElBTkEgbWFpbnRhaW5zCiAgICAgIHRoZSBBUyBudW1iZXIgc3BhY2UgYW5kIGhhcyBkZWxlZ2F0ZWQgbGFyZ2UgcGFydHMgdG8gdGhlCiAgICAgIHJlZ2lvbmFsIHJlZ2lzdHJpZXMuCgogICAgICBBdXRvbm9tb3VzIHN5c3RlbSBudW1iZXJzIHdlcmUgb3JpZ2luYWxseSBsaW1pdGVkIHRvIDE2CiAgICAgIGJpdHMuICBCR1AgZXh0ZW5zaW9ucyBoYXZlIGVubGFyZ2VkIHRoZSBhdXRvbm9tb3VzIHN5c3RlbQogICAgICBudW1iZXIgc3BhY2UgdG8gMzIgYml0cy4gIFRoaXMgdHlwZSB0aGVyZWZvcmUgdXNlcyBhbiB1aW50MzIKICAgICAgYmFzZSB0eXBlIHdpdGhvdXQgYSByYW5nZSByZXN0cmljdGlvbiBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgIGEgbGFyZ2VyIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlciBzcGFjZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBJbmV0QXV0b25vbW91c1N5c3RlbU51bWJlciB0ZXh0dWFsIGNvbnZlbnRpb24gb2YKICAgICAgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDE5MzA6IEd1aWRlbGluZXMgZm9yIGNyZWF0aW9uLCBzZWxlY3Rpb24sIGFuZCByZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgIG9mIGFuIEF1dG9ub21vdXMgU3lzdGVtIChBUykKICAgICAgUkZDIDQyNzE6IEEgQm9yZGVyIEdhdGV3YXkgUHJvdG9jb2wgNCAoQkdQLTQpCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcwogICAgICBSRkMgNjc5MzogQkdQIFN1cHBvcnQgZm9yIEZvdXItT2N0ZXQgQXV0b25vbW91cyBTeXN0ZW0gKEFTKQogICAgICAgICAgICAgICAgTnVtYmVyIFNwYWNlIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIElQIGFkZHJlc3NlcyBhbmQgaG9zdG5hbWVzICoqKi8KCiAgdHlwZWRlZiBpcC1hZGRyZXNzIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgICB0eXBlIGluZXQ6aXB2Ni1hZGRyZXNzOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGlwLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBzdXBwb3J0cyBzY29wZWQgYWRkcmVzc2VzCiAgICAgIGJ5IGFsbG93aW5nIHpvbmUgaWRlbnRpZmllcnMgaW4gdGhlIGFkZHJlc3MgZm9ybWF0LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQwMDc6IElQdjYgU2NvcGVkIEFkZHJlc3MgQXJjaGl0ZWN0dXJlIjsKICB9CgogIHR5cGVkZWYgaXB2NC1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybgogICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICsgICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKScKICAgICAgKyAnKCVbXHB7Tn1ccHtMfV0rKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIlRoZSBpcHY0LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBpbgogICAgICAgZG90dGVkLXF1YWQgbm90YXRpb24uICBUaGUgSVB2NCBhZGRyZXNzIG1heSBpbmNsdWRlIGEgem9uZQogICAgICAgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgICBUaGUgem9uZSBpbmRleCBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBpZGVudGljYWwgYWRkcmVzcwogICAgICAgdmFsdWVzLiAgRm9yIGxpbmstbG9jYWwgYWRkcmVzc2VzLCB0aGUgem9uZSBpbmRleCB3aWxsCiAgICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgIGludGVyZmFjZS4gIElmIHRoZSB6b25lIGluZGV4IGlzIG5vdCBwcmVzZW50LCB0aGUgZGVmYXVsdAogICAgICAgem9uZSBvZiB0aGUgZGV2aWNlIHdpbGwgYmUgdXNlZC4KCiAgICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IgdGhlIHpvbmUgaW5kZXggaXMgdGhlIG51bWVyaWNhbAogICAgICAgZm9ybWF0IjsKICB9CgogIHR5cGVkZWYgaXB2Ni1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoJVtccHtOfVxwe0x9XSspPyc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKCUuKyk/JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjYgYWRkcmVzcyBpbiBmdWxsLAogICAgICBtaXhlZCwgc2hvcnRlbmVkLCBhbmQgc2hvcnRlbmVkLW1peGVkIG5vdGF0aW9uLiAgVGhlIElQdjYKICAgICAgYWRkcmVzcyBtYXkgaW5jbHVkZSBhIHpvbmUgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgIFRoZSB6b25lIGluZGV4IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGlkZW50aWNhbCBhZGRyZXNzCiAgICAgIHZhbHVlcy4gIEZvciBsaW5rLWxvY2FsIGFkZHJlc3NlcywgdGhlIHpvbmUgaW5kZXggd2lsbAogICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgaW50ZXJmYWNlLiAgSWYgdGhlIHpvbmUgaW5kZXggaXMgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0CiAgICAgIHpvbmUgb2YgdGhlIGRldmljZSB3aWxsIGJlIHVzZWQuCgogICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBvZiBJUHY2IGFkZHJlc3NlcyB1c2VzIHRoZSB0ZXh0dWFsCiAgICAgIHJlcHJlc2VudGF0aW9uIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiAgVGhlCiAgICAgIGNhbm9uaWNhbCBmb3JtYXQgZm9yIHRoZSB6b25lIGluZGV4IGlzIHRoZSBudW1lcmljYWwKICAgICAgZm9ybWF0IGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDExLjIgb2YgUkZDIDQwMDcuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDI5MTogSVAgVmVyc2lvbiA2IEFkZHJlc3NpbmcgQXJjaGl0ZWN0dXJlCiAgICAgIFJGQyA0MDA3OiBJUHY2IFNjb3BlZCBBZGRyZXNzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNTk1MjogQSBSZWNvbW1lbmRhdGlvbiBmb3IgSVB2NiBBZGRyZXNzIFRleHQKICAgICAgICAgICAgICAgIFJlcHJlc2VudGF0aW9uIjsKICB9CgogIHR5cGVkZWYgaXAtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzLW5vLXpvbmU7CiAgICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3Mtbm8tem9uZTsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcC1hZGRyZXNzLW5vLXpvbmUgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzCiAgICAgIElQIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHNjb3BlZAogICAgICBhZGRyZXNzZXMgc2luY2UgaXQgZG9lcyBub3QgYWxsb3cgem9uZSBpZGVudGlmaWVycyBpbiB0aGUKICAgICAgYWRkcmVzcyBmb3JtYXQuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUiOwogIH0KCiAgdHlwZWRlZiBpcHY0LWFkZHJlc3Mtbm8tem9uZSB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzIHsKICAgICAgcGF0dGVybiAnWzAtOVwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjQgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY0LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3MgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GOlwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjYgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY2LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQyOTE6IElQIFZlcnNpb24gNiBBZGRyZXNzaW5nIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICB0eXBlZGVmIGlwLXByZWZpeCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSBpbmV0OmlwdjQtcHJlZml4OwogICAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXAtcHJlZml4IHR5cGUgcmVwcmVzZW50cyBhbiBJUCBwcmVmaXggYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb25zCiAgICAgIGltcGxpZXMgdGhlIElQIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgaXB2NC1wcmVmaXggewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICArICAnKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSknCiAgICAgICArICcvKChbMC05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMl0pKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2NC1wcmVmaXggdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBwcmVmaXguCiAgICAgIFRoZSBwcmVmaXggbGVuZ3RoIGlzIGdpdmVuIGJ5IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZQogICAgICBzbGFzaCBjaGFyYWN0ZXIgYW5kIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYW4gSVB2NCBwcmVmaXggaGFzIGFsbCBiaXRzIG9mCiAgICAgIHRoZSBJUHY0IGFkZHJlc3Mgc2V0IHRvIHplcm8gdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCiAgICAgIElQdjQgcHJlZml4LiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtcHJlZml4IHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoLygoWzAtOV0pfChbMC05XXsyfSl8KDFbMC0xXVswLTldKXwoMTJbMC04XSkpKSc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKC8uKyknOwogICAgfQoKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LXByZWZpeCB0eXBlIHJlcHJlc2VudHMgYW4gSVB2NiBhZGRyZXNzIHByZWZpeC4KICAgICAgVGhlIHByZWZpeCBsZW5ndGggaXMgZ2l2ZW4gYnkgdGhlIG51bWJlciBmb2xsb3dpbmcgdGhlCiAgICAgIHNsYXNoIGNoYXJhY3RlciBhbmQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTI4LgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIElQdjYgYWRkcmVzcyBzaG91bGQgaGF2ZSBhbGwgYml0cyB0aGF0IGRvIG5vdCBiZWxvbmcKICAgICAgdG8gdGhlIHByZWZpeCBzZXQgdG8gemVyby4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGFuIElQdjYgcHJlZml4IGhhcyBhbGwgYml0cyBvZgogICAgICB0aGUgSVB2NiBhZGRyZXNzIHNldCB0byB6ZXJvIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZQogICAgICBJUHY2IHByZWZpeC4gIEZ1cnRoZXJtb3JlLCB0aGUgSVB2NiBhZGRyZXNzIGlzIHJlcHJlc2VudGVkCiAgICAgIGFzIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgZG9tYWluIG5hbWUgYW5kIFVSSSB0eXBlcyAqKiovCgogIHR5cGVkZWYgZG9tYWluLW5hbWUgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgJygoKFthLXpBLVowLTlfXShbYS16QS1aMC05XC1fXSl7MCw2MX0pP1thLXpBLVowLTldXC4pKicKICAgICAgKyAnKFthLXpBLVowLTlfXShbYS16QS1aMC05XC1fXSl7MCw2MX0pP1thLXpBLVowLTldXC4/KScKICAgICAgKyAnfFwuJzsKICAgICAgbGVuZ3RoICIxLi4yNTMiOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGRvbWFpbi1uYW1lIHR5cGUgcmVwcmVzZW50cyBhIEROUyBkb21haW4gbmFtZS4gIFRoZQogICAgICBuYW1lIFNIT1VMRCBiZSBmdWxseSBxdWFsaWZpZWQgd2hlbmV2ZXIgcG9zc2libGUuCgogICAgICBJbnRlcm5ldCBkb21haW4gbmFtZXMgYXJlIG9ubHkgbG9vc2VseSBzcGVjaWZpZWQuICBTZWN0aW9uCiAgICAgIDMuNSBvZiBSRkMgMTAzNCByZWNvbW1lbmRzIGEgc3ludGF4IChtb2RpZmllZCBpbiBTZWN0aW9uCiAgICAgIDIuMSBvZiBSRkMgMTEyMykuICBUaGUgcGF0dGVybiBhYm92ZSBpcyBpbnRlbmRlZCB0byBhbGxvdwogICAgICBmb3IgY3VycmVudCBwcmFjdGljZSBpbiBkb21haW4gbmFtZSB1c2UsIGFuZCBzb21lIHBvc3NpYmxlCiAgICAgIGZ1dHVyZSBleHBhbnNpb24uICBJdCBpcyBkZXNpZ25lZCB0byBob2xkIHZhcmlvdXMgdHlwZXMgb2YKICAgICAgZG9tYWluIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXMgdXNlZCBmb3IgQSBvciBBQUFBIHJlY29yZHMKICAgICAgKGhvc3QgbmFtZXMpIGFuZCBvdGhlciByZWNvcmRzLCBzdWNoIGFzIFNSViByZWNvcmRzLiAgTm90ZQogICAgICB0aGF0IEludGVybmV0IGhvc3QgbmFtZXMgaGF2ZSBhIHN0cmljdGVyIHN5bnRheCAoZGVzY3JpYmVkCiAgICAgIGluIFJGQyA5NTIpIHRoYW4gdGhlIEROUyByZWNvbW1lbmRhdGlvbnMgaW4gUkZDcyAxMDM0IGFuZAogICAgICAxMTIzLCBhbmQgdGhhdCBzeXN0ZW1zIHRoYXQgd2FudCB0byBzdG9yZSBob3N0IG5hbWVzIGluCiAgICAgIHNjaGVtYSBub2RlcyB1c2luZyB0aGUgZG9tYWluLW5hbWUgdHlwZSBhcmUgcmVjb21tZW5kZWQgdG8KICAgICAgYWRoZXJlIHRvIHRoaXMgc3RyaWN0ZXIgc3RhbmRhcmQgdG8gZW5zdXJlIGludGVyb3BlcmFiaWxpdHkuCgogICAgICBUaGUgZW5jb2Rpbmcgb2YgRE5TIG5hbWVzIGluIHRoZSBETlMgcHJvdG9jb2wgaXMgbGltaXRlZAogICAgICB0byAyNTUgY2hhcmFjdGVycy4gIFNpbmNlIHRoZSBlbmNvZGluZyBjb25zaXN0cyBvZiBsYWJlbHMKICAgICAgcHJlZml4ZWQgYnkgYSBsZW5ndGggYnl0ZXMgYW5kIHRoZXJlIGlzIGEgdHJhaWxpbmcgTlVMTAogICAgICBieXRlLCBvbmx5IDI1MyBjaGFyYWN0ZXJzIGNhbiBhcHBlYXIgaW4gdGhlIHRleHR1YWwgZG90dGVkCiAgICAgIG5vdGF0aW9uLgoKICAgICAgVGhlIGRlc2NyaXB0aW9uIGNsYXVzZSBvZiBzY2hlbWEgbm9kZXMgdXNpbmcgdGhlIGRvbWFpbi1uYW1lCiAgICAgIHR5cGUgTVVTVCBkZXNjcmliZSB3aGVuIGFuZCBob3cgdGhlc2UgbmFtZXMgYXJlIHJlc29sdmVkIHRvCiAgICAgIElQIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdCB0aGUgcmVzb2x1dGlvbiBvZiBhIGRvbWFpbi1uYW1lIHZhbHVlCiAgICAgIG1heSByZXF1aXJlIHRvIHF1ZXJ5IG11bHRpcGxlIEROUyByZWNvcmRzIChlLmcuLCBBIGZvciBJUHY0CiAgICAgIGFuZCBBQUFBIGZvciBJUHY2KS4gIFRoZSBvcmRlciBvZiB0aGUgcmVzb2x1dGlvbiBwcm9jZXNzIGFuZAogICAgICB3aGljaCBETlMgcmVjb3JkIHRha2VzIHByZWNlZGVuY2UgY2FuIGVpdGhlciBiZSBkZWZpbmVkCiAgICAgIGV4cGxpY2l0bHkgb3IgbWF5IGRlcGVuZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKICAgICAgcmVzb2x2ZXIuCgogICAgICBEb21haW4tbmFtZSB2YWx1ZXMgdXNlIHRoZSBVUy1BU0NJSSBlbmNvZGluZy4gIFRoZWlyIGNhbm9uaWNhbAogICAgICBmb3JtYXQgdXNlcyBsb3dlcmNhc2UgVVMtQVNDSUkgY2hhcmFjdGVycy4gIEludGVybmF0aW9uYWxpemVkCiAgICAgIGRvbWFpbiBuYW1lcyBNVVNUIGJlIEEtbGFiZWxzIGFzIHBlciBSRkMgNTg5MC4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgOTUyOiBEb0QgSW50ZXJuZXQgSG9zdCBUYWJsZSBTcGVjaWZpY2F0aW9uCiAgICAgIFJGQyAxMDM0OiBEb21haW4gTmFtZXMgLSBDb25jZXB0cyBhbmQgRmFjaWxpdGllcwogICAgICBSRkMgMTEyMzogUmVxdWlyZW1lbnRzIGZvciBJbnRlcm5ldCBIb3N0cyAtLSBBcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgYW5kIFN1cHBvcnQKICAgICAgUkZDIDI3ODI6IEEgRE5TIFJSIGZvciBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiBzZXJ2aWNlcwogICAgICAgICAgICAgICAgKEROUyBTUlYpCiAgICAgIFJGQyA1ODkwOiBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgaW4gQXBwbGljYXRpb25zCiAgICAgICAgICAgICAgICAoSUROQSk6IERlZmluaXRpb25zIGFuZCBEb2N1bWVudCBGcmFtZXdvcmsiOwogIH0KCiAgdHlwZWRlZiBob3N0IHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXAtYWRkcmVzczsKICAgICAgdHlwZSBpbmV0OmRvbWFpbi1uYW1lOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGhvc3QgdHlwZSByZXByZXNlbnRzIGVpdGhlciBhbiBJUCBhZGRyZXNzIG9yIGEgRE5TCiAgICAgIGRvbWFpbiBuYW1lLiI7CiAgfQoKICB0eXBlZGVmIHVyaSB7CiAgICB0eXBlIHN0cmluZzsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB1cmkgdHlwZSByZXByZXNlbnRzIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyCiAgICAgIChVUkkpIGFzIGRlZmluZWQgYnkgU1REIDY2LgoKICAgICAgT2JqZWN0cyB1c2luZyB0aGUgdXJpIHR5cGUgTVVTVCBiZSBpbiBVUy1BU0NJSSBlbmNvZGluZywKICAgICAgYW5kIE1VU1QgYmUgbm9ybWFsaXplZCBhcyBkZXNjcmliZWQgYnkgUkZDIDM5ODYgU2VjdGlvbnMKICAgICAgNi4yLjEsIDYuMi4yLjEsIGFuZCA2LjIuMi4yLiAgQWxsIHVubmVjZXNzYXJ5CiAgICAgIHBlcmNlbnQtZW5jb2RpbmcgaXMgcmVtb3ZlZCwgYW5kIGFsbCBjYXNlLWluc2Vuc2l0aXZlCiAgICAgIGNoYXJhY3RlcnMgYXJlIHNldCB0byBsb3dlcmNhc2UgZXhjZXB0IGZvciBoZXhhZGVjaW1hbAogICAgICBkaWdpdHMsIHdoaWNoIGFyZSBub3JtYWxpemVkIHRvIHVwcGVyY2FzZSBhcyBkZXNjcmliZWQgaW4KICAgICAgU2VjdGlvbiA2LjIuMi4xLgoKICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBub3JtYWxpemF0aW9uIGlzIHRvIGhlbHAgcHJvdmlkZQogICAgICB1bmlxdWUgVVJJcy4gIE5vdGUgdGhhdCB0aGlzIG5vcm1hbGl6YXRpb24gaXMgbm90CiAgICAgIHN1ZmZpY2llbnQgdG8gcHJvdmlkZSB1bmlxdWVuZXNzLiAgVHdvIFVSSXMgdGhhdCBhcmUKICAgICAgdGV4dHVhbGx5IGRpc3RpbmN0IGFmdGVyIHRoaXMgbm9ybWFsaXphdGlvbiBtYXkgc3RpbGwgYmUKICAgICAgZXF1aXZhbGVudC4KCiAgICAgIE9iamVjdHMgdXNpbmcgdGhlIHVyaSB0eXBlIG1heSByZXN0cmljdCB0aGUgc2NoZW1lcyB0aGF0CiAgICAgIHRoZXkgcGVybWl0LiAgRm9yIGV4YW1wbGUsICdkYXRhOicgYW5kICd1cm46JyBzY2hlbWVzCiAgICAgIG1pZ2h0IG5vdCBiZSBhcHByb3ByaWF0ZS4KCiAgICAgIEEgemVyby1sZW5ndGggVVJJIGlzIG5vdCBhIHZhbGlkIFVSSS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICAgZXhwcmVzcyAnVVJJIGFic2VudCcgd2hlcmUgcmVxdWlyZWQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgVXJpIFNNSXYyIHRleHR1YWwgY29udmVudGlvbiBkZWZpbmVkIGluIFJGQyA1MDE3LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM5ODY6IFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKTogR2VuZXJpYyBTeW50YXgKICAgICAgUkZDIDMzMDU6IFJlcG9ydCBmcm9tIHRoZSBKb2ludCBXM0MvSUVURiBVUkkgUGxhbm5pbmcgSW50ZXJlc3QKICAgICAgICAgICAgICAgIEdyb3VwOiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIChVUklzKSwgVVJMcywKICAgICAgICAgICAgICAgIGFuZCBVbmlmb3JtIFJlc291cmNlIE5hbWVzIChVUk5zKTogQ2xhcmlmaWNhdGlvbnMKICAgICAgICAgICAgICAgIGFuZCBSZWNvbW1lbmRhdGlvbnMKICAgICAgUkZDIDUwMTc6IE1JQiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBVbmlmb3JtIFJlc291cmNlCiAgICAgICAgICAgICAgICBJZGVudGlmaWVycyAoVVJJcykiOwogIH0KCn0K +ietf-yang-types urn:ietf:params:xml:ns:yang:ietf-yang-types \N [] 2013-07-15 bW9kdWxlIGlldGYteWFuZy10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYteWFuZy10eXBlcyI7CiAgcHJlZml4ICJ5YW5nIjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSB5YW5nLWlkZW50aWZpZXIKICAgICAgLSBoZXgtc3RyaW5nCiAgICAgIC0gdXVpZAogICAgICAtIGRvdHRlZC1xdWFkIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgY291bnRlciBhbmQgZ2F1Z2UgdHlwZXMgKioqLwoKICB0eXBlZGVmIGNvdW50ZXIzMiB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBjb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKICAgICAgdGhhdCBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyB1bnRpbCBpdCByZWFjaGVzIGEKICAgICAgbWF4aW11bSB2YWx1ZSBvZiAyXjMyLTEgKDQyOTQ5NjcyOTUgZGVjaW1hbCksIHdoZW4gaXQKICAgICAgd3JhcHMgYXJvdW5kIGFuZCBzdGFydHMgaW5jcmVhc2luZyBhZ2FpbiBmcm9tIHplcm8uCgogICAgICBDb3VudGVycyBoYXZlIG5vIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlLCBhbmQgdGh1cywgYQogICAgICBzaW5nbGUgdmFsdWUgb2YgYSBjb3VudGVyIGhhcyAoaW4gZ2VuZXJhbCkgbm8gaW5mb3JtYXRpb24KICAgICAgY29udGVudC4gIERpc2NvbnRpbnVpdGllcyBpbiB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCiAgICAgIHZhbHVlIG5vcm1hbGx5IG9jY3VyIGF0IHJlLWluaXRpYWxpemF0aW9uIG9mIHRoZQogICAgICBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIGF0IG90aGVyIHRpbWVzIGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgYSBzY2hlbWEgbm9kZSB1c2luZyB0aGlzIHR5cGUuICBJZiBzdWNoCiAgICAgIG90aGVyIHRpbWVzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHRoZSBjcmVhdGlvbiBvZgogICAgICBhIHNjaGVtYSBub2RlIG9mIHR5cGUgY291bnRlcjMyIGF0IHRpbWVzIG90aGVyIHRoYW4KICAgICAgcmUtaW5pdGlhbGl6YXRpb24sIHRoZW4gYSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCiAgICAgIHNob3VsZCBiZSBkZWZpbmVkLCB3aXRoIGFuIGFwcHJvcHJpYXRlIHR5cGUsIHRvIGluZGljYXRlCiAgICAgIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkuCgogICAgICBUaGUgY291bnRlcjMyIHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uCiAgICAgIHNjaGVtYSBub2Rlcy4gIEEgZGVmYXVsdCBzdGF0ZW1lbnQgU0hPVUxEIE5PVCBiZSB1c2VkIGluCiAgICAgIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgY291bnRlcjMyLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXIzMiB0eXBlIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc4OiBTdHJ1Y3R1cmUgb2YgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBWZXJzaW9uIDIKICAgICAgICAgICAgICAgIChTTUl2MikiOwogIH0KCiAgdHlwZWRlZiB6ZXJvLWJhc2VkLWNvdW50ZXIzMiB7CiAgICB0eXBlIHlhbmc6Y291bnRlcjMyOwogICAgZGVmYXVsdCAiMCI7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgemVyby1iYXNlZC1jb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgY291bnRlcjMyCiAgICAgIHRoYXQgaGFzIHRoZSBkZWZpbmVkICdpbml0aWFsJyB2YWx1ZSB6ZXJvLgoKICAgICAgQSBzY2hlbWEgbm9kZSBvZiB0aGlzIHR5cGUgd2lsbCBiZSBzZXQgdG8gemVybyAoMCkgb24gY3JlYXRpb24KICAgICAgYW5kIHdpbGwgdGhlcmVhZnRlciBpbmNyZWFzZSBtb25vdG9uaWNhbGx5IHVudGlsIGl0IHJlYWNoZXMKICAgICAgYSBtYXhpbXVtIHZhbHVlIG9mIDJeMzItMSAoNDI5NDk2NzI5NSBkZWNpbWFsKSwgd2hlbiBpdAogICAgICB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyMzIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgNDUwMjogUmVtb3RlIE5ldHdvcmsgTW9uaXRvcmluZyBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgQmFzZSBWZXJzaW9uIDIiOwogIH0KCiAgdHlwZWRlZiBjb3VudGVyNjQgewogICAgdHlwZSB1aW50NjQ7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgY291bnRlcjY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCiAgICAgIHRoYXQgbW9ub3RvbmljYWxseSBpbmNyZWFzZXMgdW50aWwgaXQgcmVhY2hlcyBhCiAgICAgIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIENvdW50ZXJzIGhhdmUgbm8gZGVmaW5lZCAnaW5pdGlhbCcgdmFsdWUsIGFuZCB0aHVzLCBhCiAgICAgIHNpbmdsZSB2YWx1ZSBvZiBhIGNvdW50ZXIgaGFzIChpbiBnZW5lcmFsKSBubyBpbmZvcm1hdGlvbgogICAgICBjb250ZW50LiAgRGlzY29udGludWl0aWVzIGluIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKICAgICAgdmFsdWUgbm9ybWFsbHkgb2NjdXIgYXQgcmUtaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgICAgIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgYXQgb3RoZXIgdGltZXMgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhIHNjaGVtYSBub2RlIHVzaW5nIHRoaXMgdHlwZS4gIElmIHN1Y2gKICAgICAgb3RoZXIgdGltZXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgdGhlIGNyZWF0aW9uIG9mCiAgICAgIGEgc2NoZW1hIG5vZGUgb2YgdHlwZSBjb3VudGVyNjQgYXQgdGltZXMgb3RoZXIgdGhhbgogICAgICByZS1pbml0aWFsaXphdGlvbiwgdGhlbiBhIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKICAgICAgc2hvdWxkIGJlIGRlZmluZWQsIHdpdGggYW4gYXBwcm9wcmlhdGUgdHlwZSwgdG8gaW5kaWNhdGUKICAgICAgdGhlIGxhc3QgZGlzY29udGludWl0eS4KCiAgICAgIFRoZSBjb3VudGVyNjQgdHlwZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KICAgICAgc2NoZW1hIG5vZGVzLiAgQSBkZWZhdWx0IHN0YXRlbWVudCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBjb3VudGVyNjQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgQ291bnRlcjY0IHR5cGUgb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzg6IFN0cnVjdHVyZSBvZiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFZlcnNpb24gMgogICAgICAgICAgICAgICAgKFNNSXYyKSI7CiAgfQoKICB0eXBlZGVmIHplcm8tYmFzZWQtY291bnRlcjY0IHsKICAgIHR5cGUgeWFuZzpjb3VudGVyNjQ7CiAgICBkZWZhdWx0ICIwIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB6ZXJvLWJhc2VkLWNvdW50ZXI2NCB0eXBlIHJlcHJlc2VudHMgYSBjb3VudGVyNjQgdGhhdAogICAgICBoYXMgdGhlIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlIHplcm8uCgogICAgICBBIHNjaGVtYSBub2RlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHNldCB0byB6ZXJvICgwKSBvbiBjcmVhdGlvbgogICAgICBhbmQgd2lsbCB0aGVyZWFmdGVyIGluY3JlYXNlIG1vbm90b25pY2FsbHkgdW50aWwgaXQgcmVhY2hlcwogICAgICBhIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyNjQgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgdHlwZWRlZiBnYXVnZTMyIHsKICAgIHR5cGUgdWludDMyOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGdhdWdlMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHdoaWNoCiAgICAgIG1heSBpbmNyZWFzZSBvciBkZWNyZWFzZSwgYnV0IHNoYWxsIG5ldmVyIGV4Y2VlZCBhIG1heGltdW0KICAgICAgdmFsdWUsIG5vciBmYWxsIGJlbG93IGEgbWluaW11bSB2YWx1ZS4gIFRoZSBtYXhpbXVtIHZhbHVlCiAgICAgIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMl4zMi0xICg0Mjk0OTY3Mjk1IGRlY2ltYWwpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2UzMiBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTMyIGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEdhdWdlMzIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgZ2F1Z2U2NCB7CiAgICB0eXBlIHVpbnQ2NDsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBnYXVnZTY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aGljaAogICAgICBtYXkgaW5jcmVhc2Ugb3IgZGVjcmVhc2UsIGJ1dCBzaGFsbCBuZXZlciBleGNlZWQgYSBtYXhpbXVtCiAgICAgIHZhbHVlLCBub3IgZmFsbCBiZWxvdyBhIG1pbmltdW0gdmFsdWUuICBUaGUgbWF4aW11bSB2YWx1ZQogICAgICBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDJeNjQtMSAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2U2NCBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTY0IGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXJCYXNlZEdhdWdlNjQgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQKICAgICAgaW4gUkZDIDI4NTYiOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgLyoqKiBjb2xsZWN0aW9uIG9mIGlkZW50aWZpZXItcmVsYXRlZCB0eXBlcyAqKiovCgogIHR5cGVkZWYgb2JqZWN0LWlkZW50aWZpZXIgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICcoKFswLTFdKFwuWzEtM10/WzAtOV0pKXwoMlwuKDB8KFsxLTldXGQqKSkpKScKICAgICAgICAgICAgKyAnKFwuKDB8KFsxLTldXGQqKSkpKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgb2JqZWN0LWlkZW50aWZpZXIgdHlwZSByZXByZXNlbnRzIGFkbWluaXN0cmF0aXZlbHkKICAgICAgYXNzaWduZWQgbmFtZXMgaW4gYSByZWdpc3RyYXRpb24taGllcmFyY2hpY2FsLW5hbWUgdHJlZS4KCiAgICAgIFZhbHVlcyBvZiB0aGlzIHR5cGUgYXJlIGRlbm90ZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1lcmljYWwKICAgICAgbm9uLW5lZ2F0aXZlIHN1Yi1pZGVudGlmaWVyIHZhbHVlcy4gIEVhY2ggc3ViLWlkZW50aWZpZXIKICAgICAgdmFsdWUgTVVTVCBOT1QgZXhjZWVkIDJeMzItMSAoNDI5NDk2NzI5NSkuICBTdWItaWRlbnRpZmllcnMKICAgICAgYXJlIHNlcGFyYXRlZCBieSBzaW5nbGUgZG90cyBhbmQgd2l0aG91dCBhbnkgaW50ZXJtZWRpYXRlCiAgICAgIHdoaXRlc3BhY2UuCgogICAgICBUaGUgQVNOLjEgc3RhbmRhcmQgcmVzdHJpY3RzIHRoZSB2YWx1ZSBzcGFjZSBvZiB0aGUgZmlyc3QKICAgICAgc3ViLWlkZW50aWZpZXIgdG8gMCwgMSwgb3IgMi4gIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWUgc3BhY2UKICAgICAgb2YgdGhlIHNlY29uZCBzdWItaWRlbnRpZmllciBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQogICAgICAwIHRvIDM5IGlmIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllciBpcyAwIG9yIDEuICBGaW5hbGx5LAogICAgICB0aGUgQVNOLjEgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBhbiBvYmplY3QgaWRlbnRpZmllcgogICAgICBoYXMgYWx3YXlzIGF0IGxlYXN0IHR3byBzdWItaWRlbnRpZmllcnMuICBUaGUgcGF0dGVybgogICAgICBjYXB0dXJlcyB0aGVzZSByZXN0cmljdGlvbnMuCgogICAgICBBbHRob3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpcyBub3QgbGltaXRlZCwKICAgICAgbW9kdWxlIGRlc2lnbmVycyBzaG91bGQgcmVhbGl6ZSB0aGF0IHRoZXJlIG1heSBiZQogICAgICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdGljayB3aXRoIHRoZSBTTUl2MiBsaW1pdCBvZiAxMjgKICAgICAgc3ViLWlkZW50aWZpZXJzLgoKICAgICAgVGhpcyB0eXBlIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFNNSXYyIE9CSkVDVCBJREVOVElGSUVSIHR5cGUKICAgICAgc2luY2UgaXQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gMTI4IHN1Yi1pZGVudGlmaWVycy4gIEhlbmNlLAogICAgICB0aGlzIHR5cGUgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgU01JdjIgT0JKRUNUCiAgICAgIElERU5USUZJRVIgdHlwZTsgdGhlIG9iamVjdC1pZGVudGlmaWVyLTEyOCB0eXBlIFNIT1VMRCBiZQogICAgICB1c2VkIGluc3RlYWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJJU085ODM0LTE6IEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLS0gT3BlbiBTeXN0ZW1zCiAgICAgIEludGVyY29ubmVjdGlvbiAtLSBQcm9jZWR1cmVzIGZvciB0aGUgb3BlcmF0aW9uIG9mIE9TSQogICAgICBSZWdpc3RyYXRpb24gQXV0aG9yaXRpZXM6IEdlbmVyYWwgcHJvY2VkdXJlcyBhbmQgdG9wCiAgICAgIGFyY3Mgb2YgdGhlIEFTTi4xIE9iamVjdCBJZGVudGlmaWVyIHRyZWUiOwogIH0KCiAgdHlwZWRlZiBvYmplY3QtaWRlbnRpZmllci0xMjggewogICAgdHlwZSBvYmplY3QtaWRlbnRpZmllciB7CiAgICAgIHBhdHRlcm4gJ1xkKihcLlxkKil7MSwxMjd9JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoaXMgdHlwZSByZXByZXNlbnRzIG9iamVjdC1pZGVudGlmaWVycyByZXN0cmljdGVkIHRvIDEyOAogICAgICBzdWItaWRlbnRpZmllcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgT0JKRUNUIElERU5USUZJRVIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgeWFuZy1pZGVudGlmaWVyIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgbGVuZ3RoICIxLi5tYXgiOwogICAgICBwYXR0ZXJuICdbYS16QS1aX11bYS16QS1aMC05XC1fLl0qJzsKICAgICAgcGF0dGVybiAnLnwuLnxbXnhYXS4qfC5bXm1NXS4qfC4uW15sTF0uKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQSBZQU5HIGlkZW50aWZpZXIgc3RyaW5nIGFzIGRlZmluZWQgYnkgdGhlICdpZGVudGlmaWVyJwogICAgICAgcnVsZSBpbiBTZWN0aW9uIDEyIG9mIFJGQyA2MDIwLiAgQW4gaWRlbnRpZmllciBtdXN0CiAgICAgICBzdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIG9yIGFuIHVuZGVyc2NvcmUKICAgICAgIGZvbGxvd2VkIGJ5IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBhbHBoYWJldGljIG9yCiAgICAgICBudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBvciBkb3RzLgoKICAgICAgIEEgWUFORyBpZGVudGlmaWVyIE1VU1QgTk9UIHN0YXJ0IHdpdGggYW55IHBvc3NpYmxlCiAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgbG93ZXJjYXNlIG9yIHVwcGVyY2FzZSBjaGFyYWN0ZXIKICAgICAgIHNlcXVlbmNlICd4bWwnLiI7CiAgICByZWZlcmVuY2UKICAgICAgIlJGQyA2MDIwOiBZQU5HIC0gQSBEYXRhIE1vZGVsaW5nIExhbmd1YWdlIGZvciB0aGUgTmV0d29yawogICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wgKE5FVENPTkYpIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUqKiovCgogIHR5cGVkZWYgZGF0ZS1hbmQtdGltZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1xkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT8nCiAgICAgICAgICAgICsgJyhafFtcK1wtXVxkezJ9OlxkezJ9KSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGEgcHJvZmlsZSBvZiB0aGUgSVNPIDg2MDEKICAgICAgc3RhbmRhcmQgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKICAgICAgR3JlZ29yaWFuIGNhbGVuZGFyLiAgVGhlIHByb2ZpbGUgaXMgZGVmaW5lZCBieSB0aGUKICAgICAgZGF0ZS10aW1lIHByb2R1Y3Rpb24gaW4gU2VjdGlvbiA1LjYgb2YgUkZDIDMzMzkuCgogICAgICBUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGF0ZVRpbWUgWE1MCiAgICAgIHNjaGVtYSB0eXBlIHdpdGggdGhlIGZvbGxvd2luZyBub3RhYmxlIGV4Y2VwdGlvbnM6CgogICAgICAoYSkgVGhlIGRhdGUtYW5kLXRpbWUgdHlwZSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSB5ZWFycy4KCiAgICAgIChiKSBUaGUgZGF0ZS1hbmQtdGltZSB0aW1lLW9mZnNldCAtMDA6MDAgaW5kaWNhdGVzIGFuIHVua25vd24KICAgICAgICAgIHRpbWUgem9uZSAoc2VlIFJGQyAzMzM5KSB3aGlsZSAtMDA6MDAgYW5kICswMDowMCBhbmQgWgogICAgICAgICAgYWxsIHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIHpvbmUgaW4gZGF0ZVRpbWUuCgogICAgICAoYykgVGhlIGNhbm9uaWNhbCBmb3JtYXQgKHNlZSBiZWxvdykgb2YgZGF0YS1hbmQtdGltZSB2YWx1ZXMKICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgY2Fub25pY2FsIGZvcm1hdCB1c2VkIGJ5IHRoZSBkYXRlVGltZSBYTUwKICAgICAgICAgIHNjaGVtYSB0eXBlLCB3aGljaCByZXF1aXJlcyBhbGwgdGltZXMgdG8gYmUgaW4gVVRDIHVzaW5nCiAgICAgICAgICB0aGUgdGltZS1vZmZzZXQgJ1onLgoKICAgICAgVGhpcyB0eXBlIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBEYXRlQW5kVGltZSB0ZXh0dWFsCiAgICAgIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyIHNpbmNlIFJGQyAzMzM5IHVzZXMgYSBkaWZmZXJlbnQKICAgICAgc2VwYXJhdG9yIGJldHdlZW4gZnVsbC1kYXRlIGFuZCBmdWxsLXRpbWUgYW5kIHByb3ZpZGVzCiAgICAgIGhpZ2hlciByZXNvbHV0aW9uIG9mIHRpbWUtc2VjZnJhYy4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBkYXRlLWFuZC10aW1lIHZhbHVlcyB3aXRoIGEga25vd24gdGltZQogICAgICB6b25lIHVzZXMgYSBudW1lcmljIHRpbWUgem9uZSBvZmZzZXQgdGhhdCBpcyBjYWxjdWxhdGVkIHVzaW5nCiAgICAgIHRoZSBkZXZpY2UncyBjb25maWd1cmVkIGtub3duIG9mZnNldCB0byBVVEMgdGltZS4gIEEgY2hhbmdlIG9mCiAgICAgIHRoZSBkZXZpY2UncyBvZmZzZXQgdG8gVVRDIHRpbWUgd2lsbCBjYXVzZSBkYXRlLWFuZC10aW1lIHZhbHVlcwogICAgICB0byBjaGFuZ2UgYWNjb3JkaW5nbHkuICBTdWNoIGNoYW5nZXMgbWlnaHQgaGFwcGVuIHBlcmlvZGljYWxseQogICAgICBpbiBjYXNlIGEgc2VydmVyIGZvbGxvd3MgYXV0b21hdGljYWxseSBkYXlsaWdodCBzYXZpbmcgdGltZQogICAgICAoRFNUKSB0aW1lIHpvbmUgb2Zmc2V0IGNoYW5nZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IKICAgICAgZGF0ZS1hbmQtdGltZSB2YWx1ZXMgd2l0aCBhbiB1bmtub3duIHRpbWUgem9uZSAodXN1YWxseQogICAgICByZWZlcnJpbmcgdG8gdGhlIG5vdGlvbiBvZiBsb2NhbCB0aW1lKSB1c2VzIHRoZSB0aW1lLW9mZnNldAogICAgICAtMDA6MDAuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzMzOTogRGF0ZSBhbmQgVGltZSBvbiB0aGUgSW50ZXJuZXQ6IFRpbWVzdGFtcHMKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyCiAgICAgIFhTRC1UWVBFUzogWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbiI7CiAgfQoKICB0eXBlZGVmIHRpbWV0aWNrcyB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB0aW1ldGlja3MgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdAogICAgICByZXByZXNlbnRzIHRoZSB0aW1lLCBtb2R1bG8gMl4zMiAoNDI5NDk2NzI5NiBkZWNpbWFsKSwgaW4KICAgICAgaHVuZHJlZHRocyBvZiBhIHNlY29uZCBiZXR3ZWVuIHR3byBlcG9jaHMuICBXaGVuIGEgc2NoZW1hCiAgICAgIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgdGhlIHNjaGVtYSBub2RlIGlkZW50aWZpZXMgYm90aCBvZiB0aGUgcmVmZXJlbmNlIGVwb2Nocy4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBUaW1lVGlja3MgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgdGltZXN0YW1wIHsKICAgIHR5cGUgeWFuZzp0aW1ldGlja3M7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgdGltZXN0YW1wIHR5cGUgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYW4gYXNzb2NpYXRlZAogICAgICB0aW1ldGlja3Mgc2NoZW1hIG5vZGUgYXQgd2hpY2ggYSBzcGVjaWZpYyBvY2N1cnJlbmNlCiAgICAgIGhhcHBlbmVkLiAgVGhlIHNwZWNpZmljIG9jY3VycmVuY2UgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgZGVmaW5lZCB1c2luZyB0aGlzIHR5cGUuICBXaGVuCiAgICAgIHRoZSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9jY3VycmVkIHByaW9yIHRvIHRoZSBsYXN0IHRpbWUgdGhlCiAgICAgIGFzc29jaWF0ZWQgdGltZXRpY2tzIGF0dHJpYnV0ZSB3YXMgemVybywgdGhlbiB0aGUgdGltZXN0YW1wCiAgICAgIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhbGwgdGltZXN0YW1wIHZhbHVlcwogICAgICB0byBiZSByZXNldCB0byB6ZXJvIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIHRpbWV0aWNrcwogICAgICBhdHRyaWJ1dGUgcmVhY2hlcyA0OTcrIGRheXMgYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvLgoKICAgICAgVGhlIGFzc29jaWF0ZWQgdGltZXRpY2tzIHNjaGVtYSBub2RlIG11c3QgYmUgc3BlY2lmaWVkCiAgICAgIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgdXNpbmcgdGhpcyB0eXBlLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIFRpbWVTdGFtcCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBnZW5lcmljIGFkZHJlc3MgdHlwZXMgKioqLwoKICB0eXBlZGVmIHBoeXMtYWRkcmVzcyB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJyhbMC05YS1mQS1GXXsyfSg6WzAtOWEtZkEtRl17Mn0pKik/JzsKICAgIH0KCiAgICBkZXNjcmlwdGlvbgogICAgICJSZXByZXNlbnRzIG1lZGlhLSBvciBwaHlzaWNhbC1sZXZlbCBhZGRyZXNzZXMgcmVwcmVzZW50ZWQKICAgICAgYXMgYSBzZXF1ZW5jZSBvY3RldHMsIGVhY2ggb2N0ZXQgcmVwcmVzZW50ZWQgYnkgdHdvIGhleGFkZWNpbWFsCiAgICAgIG51bWJlcnMuICBPY3RldHMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGUgY2Fub25pY2FsCiAgICAgIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgUGh5c0FkZHJlc3MgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc5OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBTTUl2MiI7CiAgfQoKICB0eXBlZGVmIG1hYy1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAtOWEtZkEtRl17Mn0oOlswLTlhLWZBLUZdezJ9KXs1fSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgbWFjLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElFRUUgODAyIE1BQyBhZGRyZXNzLgogICAgICBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgTWFjQWRkcmVzcyB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiSUVFRSA4MDI6IElFRUUgU3RhbmRhcmQgZm9yIExvY2FsIGFuZCBNZXRyb3BvbGl0YW4gQXJlYQogICAgICAgICAgICAgICAgTmV0d29ya3M6IE92ZXJ2aWV3IGFuZCBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBYTUwtc3BlY2lmaWMgdHlwZXMgKioqLwoKICB0eXBlZGVmIHhwYXRoMS4wIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGV4cHJlc3Npb24uCgogICAgICBXaGVuIGEgc2NoZW1hIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBub2RlIE1VU1Qgc3BlY2lmeSB0aGUgWFBhdGgKICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJYUEFUSDogWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBoZXgtc3RyaW5nIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFswLTlhLWZBLUZdezJ9KDpbMC05YS1mQS1GXXsyfSkqKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiQSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBvY3RldHMgcmVwcmVzZW50ZWQgYXMgaGV4IGRpZ2l0cwogICAgICBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzCiAgICAgIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLiI7CiAgfQoKICB0eXBlZGVmIHV1aWQgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS0nCiAgICAgICAgICAgICsgJ1swLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJRGVudGlmaWVyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgZGVmaW5lZCBpbiBSRkMgNDEyMi4gIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcwogICAgICBsb3dlcmNhc2UgY2hhcmFjdGVycy4KCiAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFVVSUQgaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOgogICAgICBmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYKICAgICAgIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDEyMjogQSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOCiAgICAgICAgICAgICAgICBOYW1lc3BhY2UiOwogIH0KCiAgdHlwZWRlZiBkb3R0ZWQtcXVhZCB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4KICAgICAgICAnKChbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXC4pezN9JwogICAgICArICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQW4gdW5zaWduZWQgMzItYml0IG51bWJlciBleHByZXNzZWQgaW4gdGhlIGRvdHRlZC1xdWFkCiAgICAgICBub3RhdGlvbiwgaS5lLiwgZm91ciBvY3RldHMgd3JpdHRlbiBhcyBkZWNpbWFsIG51bWJlcnMKICAgICAgIGFuZCBzZXBhcmF0ZWQgd2l0aCB0aGUgJy4nIChmdWxsIHN0b3ApIGNoYXJhY3Rlci4iOwogIH0KfQo= +o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5ncywgT3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycCBvciBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdG9wb2xvZ3kgb2JqZWN0cy4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOwoKICAgIGxpc3QgQ2xvdWRpZmllZE5GIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBSQU4gTmV0d29yayBGdW5jdGlvbiBzb2Z0d2FyZSB0aGF0IGlzIGRlcGxveWVkIGluIHRoZSBPLUNsb3VkIHZpYSBvbmUgb3IgbW9yZSBORiBEZXBsb3ltZW50cy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWRpZmllZCBORiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5GRGVwbG95bWVudCB7CiAgICAgICAgZGVzY3JpcHRpb24gIkEgc29mdHdhcmUgZGVwbG95bWVudCBvbiBPLUNsb3VkIHJlc291cmNlcyB0aGF0IHJlYWxpemVzLCBhbGwgb3IgcGFydCBvZiwgYSBDbG91ZGlmaWVkIE5GLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBORiBEZXBsb3ltZW50IjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkTmFtZXNwYWNlIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGlzb2xhdGluZwogICAgICAgIGdyb3VwcyBvZiByZXNvdXJjZXMgd2l0aGluIGEgc2luZ2xlIGNsdXN0ZXIuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIE5hbWVzcGFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5vZGVDbHVzdGVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBOb2RlQ2x1c3RlciBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBOb2Rlcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgTm9kZSBDbHVzdGVyIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkU2l0ZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIGluZnJhc3RydWN0dXJlIHRoYXQKICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBDTE9VRElGSUVETkZfQ09NUFJJU0VTX05GREVQTE9ZTUVOVCB7IC8vIDEgdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGNvbXByaXNlZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBjb21wcmlzZXMgb2YgdGhlc2UgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQ2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBjb21wcmlzZWQtYnktY2xvdWRpZmllZE5GIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgcGFydCBvZiBDbG91ZGlmaWVkIE5GLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX0RFUExPWUVEX09OX09DTE9VRE5BTUVTUEFDRSB7IC8vIDEuLm4gdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9uLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IGRlcGxveWVkIG9uIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk9DbG91ZCBOYW1lc3BhY2UgZGVwbG95cyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NMT1VETkFNRVNQQUNFX0RFUExPWUVEX09OX05PREVDTFVTVEVSIHsgLy8gMS4ubiB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLW9uLW5vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgTmFtZXNwYWNlIGRlcGxveWVkIG9uIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0Nsb3VkTmFtZXNwYWNlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb2RlIENsdXN0ZXIgZGVwbG95cyBPLUNsb3VkIE5hbWVzcGFjZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTk9ERUNMVVNURVJfTE9DQVRFRF9BVF9PQ0xPVURTSVRFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRlZC1hdC1vY2xvdWRTaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBsb2NhdGVkIGF0IE8tQ2xvdWQgU2l0ZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRpb24tb2Ytb25vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgU2l0ZSBpcyBsb2NhdGlvbiBvZiBOb2RlIENsdXN0ZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2025-02-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsLgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcwoKICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNC0yMDI1IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjUtMDItMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVXBkYXRlcyBmb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAyLjAwIjsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0xMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAxLjAwIjsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KICAgICAgICAgICAgQSBiaS1kaXJlY3Rpb25hbC1hc3NvY2lhdGlvbiAoQkRBKSBpcyBhIHJlbGF0aW9uc2hpcCBjb21wcmlzaW5nIG9mCiAgICAgICAgICAgIGFuIGFTaWRlIGFuZCBhIGJTaWRlLiBUaGUgYVNpZGUgaXMgY29uc2lkZXJlZCB0aGUgb3JpZ2luYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwOyB0aGUgYlNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgYVNpZGUgYW5kIGJTaWRlIGlzIG9mCiAgICAgICAgICAgIGltcG9ydGFuY2UgYW5kIE1VU1QgTk9UIGJlIGNoYW5nZWQgb25jZSBkZWZpbmVkLgoKICAgICAgICAgICAgQm90aCBhU2lkZSBhbmQgYlNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgYVNpZGUgYW5kIHRoZSBiU2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzCiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUKICAgICAgICAgICAgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aAogICAgICAgICAgICB0aGUgJ2FTaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiU2lkZScgZXh0ZW5zaW9uLiBPdGhlciBkYXRhIG5vZGVzIGRlZmluZSBwcm9wZXJ0aWVzIG9mIHRoZQogICAgICAgICAgICByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIHJlbGF0aW9uc2hpcCBuYW1lCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgbmFtZXNwYWNlIG9mIHRoZSBkZWNsYXJpbmcgbW9kdWxlIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLiI7CiAgICB9CgogICAgZXh0ZW5zaW9uIGFTaWRlIHsKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIGFTaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ2JpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lCiAgICAgICAgICAgIG9mIHRoZSByb2xlIG9mIHRoZSBhU2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIGFTaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZSB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBhU2lkZSByZXNpZGVzLgogICAgICAgICAgICBJZiB0aGUgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZQogICAgICAgICAgICBwcmVmaXhlZCwgYW5kIGEgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlCiAgICAgICAgICAgIHRoZSBwcmVmaXguIjsKICAgIH0KCiAgICBleHRlbnNpb24gYlNpZGUgewogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgYlNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAnYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIGJTaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgYlNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5CiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIGJTaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwogICAgfQoKICAgIGV4dGVuc2lvbiBkb21haW4gewogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgIH0KCiAgICBleHRlbnNpb24gbGFiZWwgewogICAgICAgIGFyZ3VtZW50IHNlbXZlcnNpb247CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYwogICAgICAgICAgICB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzICd4LnkueicgLSBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMKICAgICAgICAgICAgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwogICAgfQp9 +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2025-03-20 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgaWV0Zi15YW5nLXR5cGVzIHsgcHJlZml4IHlhbmc7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyByZS11c2FibGUgZGF0YSB0eXBlcyB0aGF0IHRvcG9sb2d5IGFuZCBpbnZlbnRvcnkgbW9kZWxzCiAgICB3aWxsIGZyZXF1ZW50bHkgdXNlIGFzIHBhcnQgb2YgdHlwZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNC0yMDI1IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNS0wMy0yMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJQcm9wb3NlZCBtZXRhZGF0YSwgZGVjb3JhdG9ycyBhbmQgY2xhc3NpZmllcnMiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAxLjEuMTsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNS0wMi0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJSZW5hbWVkIEFkYXB0ZXIgRW50aXR5IHRvIE9yaWdpbiBFbnRpdHkuIEFkZGVkIEdlby1JbmZvcm1hdGlvbiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAyLjAwIjsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0xMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAxLjAwLjAwIjsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZSBFbnRpdHkgSW5zdGFuY2UgSWRlbnRpZmllci4iOwogICAgICAgIH0KICAgIH0KCiAgICBncm91cGluZyBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgc291cmNlSWRzIG9uIGEgdG9wb2xvZ3kgZW50aXR5LiI7CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUKICAgICAgICAgICAgICAgIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eSdzIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUKICAgICAgICAgICAgICAgIGNvbnN1bWVycyBhbmQgY2FuIG9ubHkgYmUgc2V0IGJ5IHRoZSByZXNwb25zaWJsZSBhZGFwdGVyLiBUaGlzCiAgICAgICAgICAgICAgICBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkCiAgICAgICAgICAgICAgICBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwogICAgICAgIH0KICAgIH0KCiAgICBncm91cGluZyBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgc291cmNlSWRzIG9uIGEgdG9wb2xvZ3kgcmVsYXRpb25zaGlwLiI7CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMjsKICAgICAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CiAgICAgICAgfQogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBhbiBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIG1ldGFkYXRhLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlycy4KCiAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLAogICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MKICAgICAgICAgICAgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZSBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieQogICAgICAgICAgICBUb3BvbG9neSBhbmQgSW52ZW50b3J5IEV4cG9zdXJlIEhhbmRsaW5nIGFuZCBEaXNjb3ZlcnkgYW5kIFJlY29uY2lsaWF0aW9uIEFkYXB0ZXIuCiAgICAgICAgICAgIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LAogICAgICAgICAgICB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyBpcyBhd2FyZS4iOwogICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbnVtIFJFU1RPUkVEIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgd2FzIHJlc3RvcmVkIGZyb20gYmFja3VwIGFuZCB0aGUgcmVzcG9uc2libGUKICAgICAgICAgICAgICAgICAgICBhZGFwdGVycyBhcmUgY2hlY2tpbmcgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGN1cnJlbnQuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBBRFZJU0VEIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRW50aXR5IGltcGxpY2l0bHkgY3JlYXRlZCBieSBUb3BvbG9neSBhbmQgSW52ZW50b3J5IEV4cG9zdXJlCiAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgYW5kIHBvdGVudGlhbGx5IG5vdCBhbGlnbmVkIHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aC4iOwogICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxlYWYgZmlyc3REaXNjb3ZlcmVkIHsKICAgICAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIGFuIGluc3RhbmNlIG9mIFRvcG9sb2d5IEVudGl0eSBvciBSZWxhdGlvbgogICAgICAgICAgICB3YXMgZmlyc3QgcmVwcmVzZW50ZWQgaW4gVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyB2aWEgZGlzY292ZXJ5LiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGxhc3RNb2RpZmllZCB7CiAgICAgICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiBhbiBpbnN0YW5jZSBvZiBUb3BvbG9neSBFbnRpdHkgb3IgUmVsYXRpb24KICAgICAgICAgICAgd2FzIGxhc3QgdXBkYXRlZCAoZXhjbHVkaW5nIGNsYXNzaWZpZXJzIGFuZCBkZWNvcmF0b3JzKS4iOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgZGVjb3JhdG9ycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgZm9yIGFwcGxpY2F0aW9ucyB3aXNoaW5nCiAgICAgICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gZGVjb3JhdG9ycy4gVGhpcyBpcyBkb25lIHZpYSBhdWdtZW50YXRpb25zLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJDb25zdW1lciBkZWZpbmVkIHRhZ3MgdG8gdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIGlkZW50aXR5cmVmIHsgYmFzZSBjbGFzc2lmaWVyOyB9CiAgICB9CgogICAgaWRlbnRpdHkgY2xhc3NpZmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjbGFzc2lmaWVyIGlzIHVzZWQgYXMgYSBiYXNlIHRvIHByb3ZpZGUgYWxsIGNsYXNzaWZpZXJzCiAgICAgICAgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ== +o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-10-21 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgaW5zdGFsbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9JTlNUQUxMRURfQVRfU0lURSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2l0ZSB0eXBlLgogICAgICAgICAgICBUaGUgU2l0ZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSB0aGUgQW50ZW5uYU1vZHVsZSBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIGF0IG9uZSBTaXRlLgogICAgICAgICAgICBBIFNpdGUgaW5zdGFuY2UgY2FuIGhhdmUgbWFueSBpbnN0YWxsZWQgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gT0FNOwoKICAgIGxpc3QgTWFuYWdlZEVsZW1lbnQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9 +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2025-03-20 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAiUkFOIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICAgICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkKICAgICAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNSBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI1LTAzLTIwIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlByb3Bvc2VkIGVudGl0aWVzLCByZWxhdGlvbnNoaXBzIGFuZCBhdHRyaWJ1dGVzIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMS4xLjE7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjUtMDItMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmV2aXNpb24gdG8gcmVuYW1lIGFkYXB0ZXIgZ3JvdXAgdG8gb3JpZ2luIGdyb3VwLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAyLjAwIjsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0xMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAxLjAwIjsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgTy1EVSBpcyBhbiBPLVJBTiBORiBpbiB0aGUgTy1SQU4gQXJjaGl0ZWN0dXJlLiBBbiBPLURVLCBjb21iaW5lZCB3aXRoCiAgICAgICAgb25lIG9yIG1vcmUgTy1SVShzKSBjb25uZWN0ZWQgdG8gaXQsIHN1cHBvcnRzIGFuZCBpcyBmdWxseSBjb21wYXRpYmxlCiAgICAgICAgd2l0aCB0aGUgZnVuY3Rpb25zIG9mIGEgZ05CLURVIGFzIGRlZmluZWQgYnkgM0dQUCBUUyAzOC40MDEuCgogICAgICAgIFRoZSBPLURVIHRlcm1pbmF0ZXMgdGhlIEUyIGFuZCB0aGUgRjEgaW50ZXJmYWNlLCBhbmQgdGhlIE9wZW4gRnJvbnRoYXVsCiAgICAgICAgaW50ZXJmYWNlIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgdGhlIFJMQywgTUFDLCBhbmQKICAgICAgICBIaWdoLVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4KCiAgICAgICAgTm90ZTogTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLURVIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLURVIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5IHRoZQogICAgICAgIElPQyBHTkJEVUZ1bmN0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIE5SIE5STSBtb2RlbCwgYXMgcGVyIDNHUFAgVFMgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKSBhdHRyaWJ1dGVzIjsKCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWwgVW5pdCDigJMgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgTkctYywgWDItYywgWG4tYywgRjEtYywgYW5kIEUxIGludGVyZmFjZXMgYXMKICAgICAgICB3ZWxsIGFzIHRoZSBSUkMgYW5kIFBEQ1AgKGZvciBTUkIpIHByb3RvY29scyB0b3dhcmRzIHRoZSBVRSBhcyBkZWZpbmVkIGJ5CiAgICAgICAgM0dQUCBUUyAzOC40MDEuIFRoZSBPLUNVLUNQIHRlcm1pbmF0ZXMgRTIgaW50ZXJmYWNlIHRvIE5lYXItUlQgUklDIGFuZCBpcwogICAgICAgIG1hbmFnZWQgdmlhIE8xIGludGVyZmFjZSBieSB0aGUgU01PLgoKICAgICAgICBOb3RlOiBPLUNVLUNQIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBPUkFOTmV0d29ya0Z1bmN0aW9uCiAgICAgICAgYWJzdHJhY3QgY2xhc3MuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIHRoZQogICAgICAgIE8tQ1UtQ1Agb2JqZWN0LgogICAgICAgICAgICAKICAgICAgICBUaGUgbWFuYWdlbWVudCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIE8tQ1UtQ1AgTy1SQU4gTkYgaXMgcmVwcmVzZW50ZWQgYnkKICAgICAgICB0aGUgSU9DIEdOQkNVQ1BGdW5jdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBOUiBOUk0gbW9kZWwsIGFzIHBlciAzR1BQIFRTCiAgICAgICAgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBDZW50cmFsIFVuaXQg4oCTIENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApIGF0dHJpYnV0ZXMiOwogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTiBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24geyAgICAgICAgCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIFRoZSBPLUNVLVVQIHRlcm1pbmF0ZXMgdGhlIE5HLXUsIFgyLXUsIFhuLXUsIEYxLXUsIGFuZCBFMSBpbnRlcmZhY2VzIGFzCiAgICAgICAgd2VsbCBhcyB0aGUgUERDUCBhbmQgU0RBUCBwcm90b2NvbHMgdG93YXJkcyB0aGUgVUUgYXMgZGVmaW5lZCBieSAzR1BQIFRTCiAgICAgICAgMzguNDAxLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIEUyIGludGVyZmFjZSB0byBOZWFyLVJUIFJJQyBhbmQgaXMgbWFuYWdlZAogICAgICAgIHZpYSBPMSBpbnRlcmZhY2UgYnkgdGhlIFNNTy4KCiAgICAgICAgTm90ZTogTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLUNVLVVQIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLUNVLVVQIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5CiAgICAgICAgdGhlIElPQyBHTkJDVVVQRnVuY3Rpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgTlIgTlJNIG1vZGVsLCBhcyBwZXIgM0dQUCBUUwogICAgICAgIDI4LjU0MSI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gQ2VudHJhbCBVbml0IOKAkyBVc2VyIFBsYW5lIChPLUNVLVVQKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGlzdCBwTE1OSWRMaXN0IHsKICAgICAgICAgICAgICAgIGtleSAibWNjIG1uYyI7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiB1bmlxdWUgaWRlbnRpdGllcyBmb3IgUExNTiI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJOZWFyLVJlYWwtVGltZSBSQU4gSW50ZWxsaWdlbnQgQ29udHJvbGxlciAoTmVhci1SVCBSSUMpLgoKICAgICAgICBOZWFyLVJUIFJJQyBpcyBhbiBPLVJBTiBORiB0aGF0IGVuYWJsZXMgbmVhciByZWFsLXRpbWUgY29udHJvbCBhbmQKICAgICAgICBvcHRpbWl6YXRpb24gb2Ygc2VydmljZXMgYW5kIHJlc291cmNlcyBvZiBFMiBOb2RlcyB2aWEgZmluZS1ncmFpbmVkIGRhdGEKICAgICAgICBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgdGhlIEUyIGludGVyZmFjZSB3aXRoIGNvbnRyb2wgbG9vcHMgaW4gdGhlCiAgICAgICAgb3JkZXIgb2YgMTAgbXMtMXMuIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5lYXJSdFJpY0lkIHsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGlmaWVyIG9mIE5lYXItUlQgUklDIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpCgogICAgICAgIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZSAoYWxzbyBrbm93biBhcyBMTFMKICAgICAgICBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIAogICAgICAgIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4KCiAgICAgICAgVGhlIE8tUlUgdGVybWluYXRlcyB0aGUgT3BlbiBGcm9udGhhdWwgTS1QbGFuZSBpbnRlcmZhY2UgdG93YXJkcyB0aGUgTy1EVQogICAgICAgIGFuZCBTTU8uIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gUmFkaW8gVW5pdCAoTy1SVSkgYXR0cmlidXRlcyI7CiAgICAgICAgICAgIGxlYWYgb3J1SWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiB0aGUgTy1SVSBhcyBkaXNjb3ZlcmVkIGZyb20gdGhlIHNvdXJjZSBkb21haW4gYmFzZWQgb24gTS1QbGFuZSBhcmNoaXRlY3R1cmUgbW9kZWwiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1DVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIFNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbgogICAgICAgIFNpZ25hbCAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kCiAgICAgICAgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItRFUuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBzaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24gc2lnbmFsCiAgICAgICAgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZCBwcm92aWRlCiAgICAgICAgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE5SIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZCB3aXRoIGEgYmFzZSBzdGF0aW9uCiAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsIGludGVyZmVyZW5jZQogICAgICAgIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzIHN5c3RlbXMgdXNlIHRocmVlIHNlY3RvcgogICAgICAgIGNlbGxzLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgVGhlIE1PIGFsc28gY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIkEgZ3JvdXAgb2YgY28tbG9jYXRlZCBDZWxscyB0aGF0IGhhdmUgYSBzaGFyZWQKICAgICAgICBjb3ZlcmFnZSBhcmVhLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9EVUZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTERVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJDZWxsRFUgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQSBPRFVGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBPRFVGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBEVSBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0RVRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ1VDUEZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTENVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9DVUNQRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxDVSB0eXBlLgogICAgICAgICAgICBUaGUgT0NVQ1BGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBDVS1DUCBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJDZWxsQ1UuCiAgICAgICAgICAgIEEgT0NVQ1BGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbENVLgogICAgICAgICAgICBBbiBOUkNlbGxDVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsQ3UgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBwcm92aWRlcyBOUiBDZWxsLUNVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9jdWNwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1DVSBwcm92aWRlZCBieSBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxDVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUkNFTExEVV9VU0VTX05SU0VDVE9SQ0FSUklFUiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgTlJDZWxsRFUgcmVwcmVzZW50cyB0aGUgY2VsbCB0aGF0IHVzZXMgdGhlIE5SU2VjdG9yQ2Fycmllci4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIHVzZSBtYW55IE5SU2VjdG9yQ2FycmllcnMuCiAgICAgICAgICAgIEFuIE5SU2VjdG9yQ2FycmllciBpbnN0YW5jZSBjYW4gb25seSBiZSB1c2VkIGJ5IG9uZSBOUkNlbGxEVS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHVzZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5SQ2VsbERVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlZCBieSBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUlNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eSB0eXBlLgogICAgICAgICAgICBUaGUgTlJTZWN0b3JDYXJyaWVyIHJlcHJlc2VudHMgdGhlIGNhcnJpZXIgdGhhdCB1c2VzIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiB1c2Ugb25seSBvbmUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFDYXBhYmlsaXR5IGluc3RhbmNlIGNhbiBiZSB1c2VkIGJ5IG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTZWN0b3IgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEEgU2VjdG9yIGluc3RhbmNlIGNhbiBncm91cCBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-rel-cloud-ran urn:o-ran:smo-teiv-rel-cloud-ran REL_CLOUD_RAN ["o-ran-smo-teiv-cloud", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBncm91cGluZywgT3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycCB0byB0aGUgdG9wb2xvZ3kgb2JqZWN0LiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0NMT1VEX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0RVRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09DVUNQRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtQ1AgRnVuY3Rpb24gc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgdGhhdCBzZXJ2ZXMgdGhpcyBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VVUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyUlRSSUNGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE5lYXJSVFJJQ0Z1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOZWFyUlRSSUNGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +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-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX05SQ0VMTERVIHsgLy8gMS4ubiB0byAwLi5tCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgc2VydmVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQW4gQW50ZW5uYU1vZHVsZSBpbnN0YW5jZSBjYW4gc2VydmUgbWFueSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEFuIE5SQ2VsbERVIGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2VjdG9yIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZ3JvdXBlZCBieSBTZWN0b3IuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-oam-cloud urn:o-ran:smo-teiv-rel-oam-cloud REL_OAM_CLOUD ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-cloud"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fQ0xPVUQ7CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9ERVBMT1lFRF9BU19DTE9VRElGSUVETkYgeyAgLy8gMC4uMSB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLWFzLWNsb3VkaWZpZWRORiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgZGVwbG95ZWQgYXMgQ2xvdWRpZmllZCBORi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZGVwbG95ZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBkZXBsb3lzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1jbG91ZDpDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19NQU5BR0VERUxFTUVOVCB7IC8vIDEuLm4gdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBzZXJ2aWNlZC1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LW9hbTpNYW5hZ2VkRWxlbWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-rel-oam-ran urn:o-ran:smo-teiv-rel-oam-ran REL_OAM_RAN ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-equipment-test urn:o-ran:smo-teiv-equipment-test EQUIPMENT [] 2024-10-21 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudC10ZXN0IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1lcXVpcG1lbnQtdGVzdCI7CiAgICBwcmVmaXggb3ItdGVpdi1lcXVpcC10ZXN0OwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJUaGVzZSBhcmUganVzdCB0ZXN0IEVxdWlwbWVudCB0b3BvbG9neSBtb2RlbCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVFRUVFRUVFRUVFRV9SRUFMSVNFRF9CWV9BTlRFTk5BTU9EVUxFRUVFRUVFRUVFRUVFRUUgewoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgcmVhbGlzZWQgYnkgdGhlIEFudGVubmFNb2R1bGUuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHJlYWxpc2VkIG9uZSBBbnRlbm5hTW9kdWxlLgogICAgICAgICAgICBBbiBBbnRlbm5hTW9kdWxlIGluc3RhbmNlIGNhbiBiZSByZWFsaXNlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzZWQgYnkgbWFueSBBbnRlbm5hIE1vZHVsZXMuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXAtdGVzdDpBbnRlbm5hTW9kdWxlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcmVhbGlzaW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzaW5nIHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXAtdGVzdDpBbnRlbm5hTW9kdWxlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRUVFRUVFRUVFRUVFX0RFUExPWUVEX09OX0FOVEVOTkFNT0RVTEVFRUVFRUVFRUVFRUVFRSB7IC8vIDEuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgZGV2ZWxvcGVkIG9uIHRoZSBBbnRlbm5hTW9kdWxlLgogICAgICAgICAgICBBbiBBbnRlbm5hTW9kdWxlIGluc3RhbmNlIGNhbiBkZXZlbG9wZWQgb25lIEFudGVubmFNb2R1bGUuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIGJlIGRldmVsb3BlZCBvbiBvbmUgQW50ZW5uYU1vZHVsZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBkZXZlbG9wZWQtb24tYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBkZXZlbG9wZWQgb24gdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcC10ZXN0OkFudGVubmFNb2R1bGVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXZlbG9waW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZGV2ZWxvcGluZyB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LWVxdWlwLXRlc3Q6QW50ZW5uYU1vZHVsZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-oam-test urn:o-ran:smo-teiv-oam-test OAM [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbS10ZXN0IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1vYW0tdGVzdCI7CiAgICBwcmVmaXggb3ItdGVpdi1vYW0tdGVzdDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJUaGVzZSBhcmUganVzdCB0ZXN0IE8mTSB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5nLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIHRvIHRoZSB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIE9BTTsKCiAgICBsaXN0IE1hbmFnZWRFbGVtZW50dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9 +o-ran-smo-teiv-ran-test urn:o-ran:smo-teiv-ran-test RAN [] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbi10ZXN0IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yYW4tdGVzdCI7CiAgICBwcmVmaXggb3ItdGVpdi1yYW4tdGVzdDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJUaGVzZSBhcmUganVzdCB0ZXN0IFJBTiB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IE9EVUZ1bmN0aW9ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCIERpc3RyaWJ1dGVkIFVuaXQgKGdOQi1EVSkuCgogICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQgKGdOQi1DVSkgYW5kIGEgZ05CLURVLgogICAgICAgIFRoZSBDVSBwcm9jZXNzZXMgbm9uLXJlYWwgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVCiAgICAgICAgcHJvY2Vzc2VzIFBIWSBsZXZlbCBwcm90b2NvbCBhbmQgcmVhbCB0aW1lIHNlcnZpY2VzLiBUaGUgZ05CLUNVIGFuZAogICAgICAgIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEgRjEgbG9naWNhbCBpbnRlcmZhY2UuCgogICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBmb3IgYSBnTkItRFU6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBnTkItQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIGdOQi1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ1UtQ1AsIG11bHRpcGxlIGdOQi1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4KICAgICAgICBub2RlIG9iamVjdC4gSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgZ05CLURVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBjb250YWluZXIgZFVwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB1c2VkIGFzIHBhcnQgb2YgUE0gRXZlbnRzIGRhdGEiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQkRVSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIGxpc3QgTlJDZWxsRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSAgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SUENJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgUGh5c2ljYWwgQ2VsbCBJZGVudGl0eSAoUENJKSBvZiB0aGUgTlIgY2VsbC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlRBQyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgVHJhY2tpbmcgQXJlYSBDb2RlIChUQUMpLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlIGluIGEgY2VydGFpbiBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTFRFU2VjdG9yQ2FycmllcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIExURSBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvckNhcnJpZXJUeXBlIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNlY3RvciBjYXJyaWVyCiAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsKICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgICAgIGVudW0gbm9ybWFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb3QgYSBkaWdpdGFsIHNlY3RvciI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIG1pZGRsZV9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9EVUZVTkNUSU9OTk5OTk5OTk5OTk5OTk5OTl9QUk9WSURFU19OUkNFTExEVVVVVVVVVVVVVVVVVVVVVVVVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LWduYmR1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBnTm9kZUItRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbERVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUlJSUlJSUlJSUlJSUlJSUlJSUlJSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFlZWVlZWVlZWVlZWVlZWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxURSBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1sdGVTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-rel-equipment-ran-test urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment-test", "o-ran-smo-teiv-ran-test"] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuLXRlc3QgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJlbC1lcXVpcHJhbi10ZXN0OwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudC10ZXN0IHsgcHJlZml4IG9yLXRlaXYtZXF1aXAtdGVzdDsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4tdGVzdCB7IHByZWZpeCBvci10ZWl2LXJhbi10ZXN0OyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlRoZXNlIGFyZSBqdXN0IHRlc3QgRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFRUVFRUVFRUVFRUVFRUVFRUVFRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFlZWVlZWVlZWVlZWVlZWVlZWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwLXRlc3Q6QW50ZW5uYU1vZHVsZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuLXRlc3Q6QW50ZW5uYUNhcGFiaWxpdHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-rel-oam-ran-test urn:o-ran:smo-teiv-rel-oam-ran-test REL_OAM_RAN ["o-ran-smo-teiv-oam-test", "o-ran-smo-teiv-ran-test"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuLXRlc3QgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tcmFuLXRlc3QiOwogICAgcHJlZml4IG9yLXRlaXYtcmVsLW9hbS1yYW4tdGVzdDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1vYW0tdGVzdCB7IHByZWZpeCBvci10ZWl2LW9hbS10ZXN0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbi10ZXN0IHsgcHJlZml4IG9yLXRlaXYtcmFuLXRlc3Q7IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiVGhlc2UgYXJlIGp1c3QgdGVzdCBPJk0gYW5kIFJBTiB0b3BvbG9neSByZWxhdGlvbiBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5nLCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwIHRvIHRoZSB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTWFuYWdlZEVsZW1lbnR0dHR0dHR0dHR0dHR0dHR0dF9VU0VTX05SQ2VsbERVVVVVVVVVVVVVVVUgeyAvLyAxIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUItRFUgRnVuY3Rpb24gdXNlcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LW9hbS10ZXN0Ok1hbmFnZWRFbGVtZW50dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHVzZWQgYnkgbWFuYWdlZEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuLXRlc3Q6TlJDZWxsRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CgogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRUVFRUVFRUVFRUVFRUVF9NQU5BR0VTX0dOQkRVRlVOQ1RJT05OTk5OTk5OTk5OTk5OTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtZ25iZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgbWFuYWdlcyBnTm9kZUItRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtLXRlc3Q6TWFuYWdlZEVsZW1lbnR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBtYW5hZ2VkLWJ5LW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQi1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW4tdGVzdDpHTkJEVUZ1bmN0aW9ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +\. + +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud ["geo-location", "name"] +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"] +o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment ["geo-location", "name"] +o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam [] +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] +o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRTAC", "plmnId"] +o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRPCI", "nRTAC"] +o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran ["arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL"] +o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran ["nearRtRicId", "pLMNId"] +o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran ["gNBCUName", "gNBId", "gNBIdLength", "pLMNId"] +o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran ["gNBId", "gNBIdLength", "pLMNIdList"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran ["oruId"] +o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran ["azimuth", "geo-location", "sectorId"] +o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment-test ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"] +o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-oam-test [] +o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy o-ran-smo-teiv-ran-test ["eUtranFqBands", "geranFqBands", "nRFqBands"] +o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-test ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr o-ran-smo-teiv-ran-test ["sectorCarrierType"] +o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran-test ["cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd", "nCI", "nRPCI", "nRTAC"] +\. + +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +ANTENNAMODULE_INSTALLED_AT_SITE installed-at-site AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 installed-antennaModule Site o-ran-smo-teiv-equipment 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment +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 +ANTENNAMODULE_SERVES_NRCELLDU serviced-nrCellDu AntennaModule o-ran-smo-teiv-equipment 1 9223372036854775807 serving-antennaModule NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran +CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT comprised-nFDeployment CloudifiedNF o-ran-smo-teiv-cloud 1 1 comprised-by-cloudifiedNF NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-cloud +MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF deployed-as-cloudifiedNF ManagedElement o-ran-smo-teiv-oam 1 1 deployed-managedElement CloudifiedNF o-ran-smo-teiv-cloud 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-oam_ManagedElement o-ran-smo-teiv-rel-oam-cloud +MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION managed-nearRTRICFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NearRTRICFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_OCUCPFUNCTION managed-ocucpFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_OCUUPFUNCTION managed-ocuupFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_OCUUPFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_ODUFUNCTION managed-oduFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_ORUFUNCTION managed-oruFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement ORUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_ORUFunction o-ran-smo-teiv-rel-oam-ran +NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE deployed-on-ocloudNamespace NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 deployed-nFDeployment OCloudNamespace o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE o-ran-smo-teiv-cloud +NFDEPLOYMENT_SERVES_MANAGEDELEMENT serviced-managedElement NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 serving-nFDeployment ManagedElement o-ran-smo-teiv-oam 1 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-rel-oam-cloud +NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION serviced-nearRTRICFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_OCUCPFUNCTION serviced-ocucpFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_OCUUPFUNCTION serviced-ocuupFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_ODUFUNCTION serviced-oduFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran +NODECLUSTER_LOCATED_AT_OCLOUDSITE located-at-ocloudSite NodeCluster o-ran-smo-teiv-cloud 1 9223372036854775807 location-of-onodeCluster OCloudSite o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud +NRCELLDU_USES_NRSECTORCARRIER used-nrSectorCarrier NRCellDU o-ran-smo-teiv-ran 0 1 used-by-nrCellDu NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran +NRSECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-nrSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran +OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER deployed-on-nodeCluster OCloudNamespace o-ran-smo-teiv-cloud 1 9223372036854775807 deployed-ocloudNamespace NodeCluster o-ran-smo-teiv-cloud 1 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-cloud_OCloudNamespace o-ran-smo-teiv-cloud +OCUCPFUNCTION_PROVIDES_NRCELLCU provided-nrCellCu OCUCPFunction o-ran-smo-teiv-ran 1 1 provided-by-ocucpFunction NRCellCU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellCU o-ran-smo-teiv-ran +ODUFUNCTION_PROVIDES_NRCELLDU provided-nrCellDu ODUFunction o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran +ODUFUNCTION_PROVIDES_NRSECTORCARRIER provided-nrSectorCarrier ODUFunction o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran +SECTOR_GROUPS_ANTENNAMODULE grouped-antennaModule Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-rel-equipment-ran +SECTOR_GROUPS_NRCELLDU grouped-nrCellDu Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran +ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY serviced-antennaCapability AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment-test 0 9223372036854775807 serving-antennaModule AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy o-ran-smo-teiv-ran-test 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY o-ran-smo-teiv-rel-equipment-ran-test +ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE developed-on-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment-test 0 9223372036854775807 developing-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment-test 0 9223372036854775807 BI_DIRECTIONAL true RELATION o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE o-ran-smo-teiv-equipment-test +ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE realised-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment-test 0 9223372036854775807 realising-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment-test 0 9223372036854775807 BI_DIRECTIONAL true RELATION o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE o-ran-smo-teiv-equipment-test +ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU provided-nrCellDu ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-test 1 1 provided-by-oduFunction NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran-test 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran-test +LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY used-antennaCapability LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr o-ran-smo-teiv-ran-test 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy o-ran-smo-teiv-ran-test 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr o-ran-smo-teiv-ran-test +MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN managed-oduFunction ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-oam-test 1 1 managed-by-managedElement ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-test 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-rel-oam-ran-test +ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU used-nrCellDu ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-oam-test 1 1 used-by-managedElement NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran-test 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-rel-oam-ran-test +\. + +; + +COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql b/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql index 9207aa1..b1b03da 100644 --- a/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql +++ b/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql @@ -21,6 +21,14 @@ BEGIN; +COPY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata" ) FROM stdin; +urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1 ["urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1","urn:cmHandle:C4388D6BB970EC663F88B46CC14F8620"] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +\. + +COPY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id", "dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "metadata", "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" ) FROM stdin; +urn:3gpp:dn:SubNetwork=ODUFunctionForDeletion,MeContext=1,ManagedElement=1,ODUFunction=1 {"mcc":"123","mnc":"82"} \N 9 1 ["urn:3gpp:dn:SubNetwork=ODUFunctionForDeletion,MeContext=1,ManagedElement=1,ODUFunction=1","urn:cmHandle:C4388D6BB970EC663F88B46CC14F8619"] ["test-app-module:Indoor","test-app-module:Weekend"] {"test-app-module:textdata":"Ericsson"} urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6CF471226915C74CF5FE4BDA6FA3CF7D897473007B46DF7FC50230BD6B8B4256116A6AFBF4D822CF9379EB56DE9490C1C0B54238263F2574B345 ["urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1"] ["test-app-module:Indoor","test-app-module:Weekend"] {"test-app-module:textdata":"Ericsson"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-09T10:40:36.461565Z","lastModified":"2025-01-09T10:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-09T10:40:36.461565Z","lastModified":"2025-01-09T10:40:36.461565Z"} +\. + COPY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id", "metadata", "cellLocalId", "nCI", "nRPCI", "nRTAC") FROM stdin; myReliabilityCell_1 {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 \N \N myReliabilityCell_2 {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 \N diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang new file mode 100644 index 0000000..512bfb4 --- /dev/null +++ b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang @@ -0,0 +1,192 @@ +module o-ran-smo-teiv-equipment-test { + yang-version 1.1; + namespace "urn:o-ran:smo-teiv-equipment-test"; + prefix or-teiv-equip-test; + + 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 ietf-geo-location { + prefix geo; + reference "RFC 9179: A YANG Grouping for Geographic Locations"; + } + + organization "ORAN"; + contact "The Authors"; + description + "These are just test Equipment topology model"; + + revision "2024-10-21" { + description "Deprecate AntennaModule attribute antennaBeamWidth. + To be replaced by horizontalBeamWidth and verticalBeamWidth."; + or-teiv-yext:label 0.6.0; + } + + revision "2024-10-08" { + description "Added azimuth attribute for AntennaModule."; + or-teiv-yext:label 0.5.0; + } + + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology objects."; + or-teiv-yext:label 0.4.0; + } + + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + + or-teiv-yext:domain EQUIPMENT; + + list AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee { + description "An Antenna Module represents the physical aspect of an + antenna."; + + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; + 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."; + type string; + } + + leaf mechanicalAntennaBearing { + 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 int32; + } + + leaf positionWithinSector { + 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 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 int32; + } + + leaf-list antennaBeamWidth { + description "The angular span of the main lobe of the antenna + radiation pattern in the horizontal plane. Measured in + degrees. + + Deprecated: Since 24.Q4. Replaced by AntennaModule::horizontalBeamWidth + and AntennaModule::verticalBeamWidth. Planned to be removed."; + type uint32; + } + + leaf horizontalBeamWidth { + description "The angular span of the main lobe of the antenna + radiation pattern in the horizontal plane."; + type decimal64 { + fraction-digits 1; + range "0..360"; + } + units "decimal degrees"; + } + + leaf verticalBeamWidth { + description "The angular span of the main lobe of the antenna + radiation pattern in the vertical plane."; + type decimal64 { + fraction-digits 1; + range "0..360"; + } + units "decimal degrees"; + } + + leaf azimuth { + description "The value of the azimuth of the Antenna Module."; + type decimal64 { + fraction-digits 1; + range "0..360"; + } + units "decimal degrees"; + } + + uses geo:geo-location; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE { + + description + "The aSide of this relationship is an instance of the AntennaModule type. + The bSide of this relationship is an instance of the AntennaModule type. + The AntennaModule represents the physical antenna that realised by the AntennaModule. + An AntennaModule instance can realised one AntennaModule. + An AntennaModule instance can be realised by many AntennaModules. + "; + + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; + key id; + + leaf-list realised-antennaModule { + description "Antenna Module realised by many Antenna Modules."; + or-teiv-yext:aSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; + type instance-identifier; + } + + leaf-list realising-antennaModule { + description "Antenna Module realising this Antenna Module."; + or-teiv-yext:bSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; + type instance-identifier; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE { // 1..n to 0..m + + description + "The aSide of this relationship is an instance of the AntennaModule type. + The bSide of this relationship is an instance of the AntennaModule type. + The AntennaModule represents the physical antenna that developed on the AntennaModule. + An AntennaModule instance can developed one AntennaModule. + An AntennaModule instance can be developed on one AntennaModule. + "; + + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; + key id; + + leaf-list developed-on-antennaModule { + description "Antenna Module developed on this Antenna Module."; + or-teiv-yext:aSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; + type instance-identifier; + } + + leaf-list developing-antennaModule { + description "Antenna Module developing this Antenna Module."; + or-teiv-yext:bSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; + type instance-identifier; + } + } +} \ No newline at end of file diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang new file mode 100644 index 0000000..21ca695 --- /dev/null +++ b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang @@ -0,0 +1,38 @@ +module o-ran-smo-teiv-oam-test { + yang-version 1.1; + namespace "urn:o-ran:smo-teiv-oam-test"; + prefix or-teiv-oam-test; + + import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; } + + import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; } + + organization "ORAN"; + contact "The Authors"; + description + "These are just test O&M topology model."; + + revision "2024-10-04" { + description "Added grouping, Origin_Entity_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + + or-teiv-yext:domain OAM; + + list ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt { + description "A Managed Element (ME) is a node into a telecommunication + network providing support and/or service to subscribers. An ME + communicates with a manager application (directly or indirectly) + over one or more interfaces for the purpose of being monitored + and/or controlled."; + + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; + key id; + } +} \ No newline at end of file diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang new file mode 100644 index 0000000..ff8c7c3 --- /dev/null +++ b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang @@ -0,0 +1,240 @@ +module o-ran-smo-teiv-ran-test { + yang-version 1.1; + namespace "urn:o-ran:smo-teiv-ran-test"; + prefix or-teiv-ran-test; + + 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 + "These are just test RAN topology model."; + + revision "2024-10-08" { + description "Added range for azimuth attribute of Sector."; + or-teiv-yext:label 0.5.0; + } + + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology object."; + or-teiv-yext:label 0.4.0; + } + + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + + or-teiv-yext:domain RAN; + + list ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn { + 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."; + + uses or-teiv-types:Top_Grp_Type; + key id; + + container attributes { + container dUpLMNId { + description "PLMN identifier used as part of PM Events data"; + uses types3gpp:PLMNId; + } + + leaf gNBDUId { + description "Unique identifier for the DU within a gNodeB"; + type int64; + } + + leaf gNBId { + description "Identity of gNodeB within a PLMN"; + type int64; + } + + leaf gNBIdLength { + description "Length of gNBId bit string representation"; + type int32; + } + } + } + + + list NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU { + description "Represents an NR Cell in gNodeB-DU. + + 5G NR is a new radio access technology (RAT) developed by 3GPP for + the 5G (fifth generation) mobile network. It is designed to be the + global standard for the air interface of 5G networks. + + 5G NR has synchronization signal that is known as Primary + Synchronization signal (PSS) and Secondary Synchronization signal + (SSS). These signals are specific to NR physical layer and provide + the following information required by UE for downlink + synchronization: PSS provides Radio Frame Boundary (Position of 1st + Symbol in a Radio frame) SSS provides Subframe Boundary (Position of + 1st Symbol in a Subframe) Physical Layer Cell ID (PCI) information + using both PSS and SSS."; + + uses or-teiv-types:Top_Grp_Type; + key id; + + container attributes { + leaf cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd { + description "Used together with gNodeB identifier to identify NR + cell in PLMN. Used together with gNBId to form NCI."; + type int32; + } + + leaf nCI { + description "NR Cell Identity."; + type int64; + } + + leaf nRPCI { + description "The Physical Cell Identity (PCI) of the NR cell."; + type int32; + } + + leaf nRTAC { + description "NR Tracking Area Code (TAC)."; + type int32; + } + } + } + + list AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy { + 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 LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr { + 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; + + container attributes { + leaf sectorCarrierType { + description "Indicates whether or not the sector carrier + modelled by MO SectorCarrier is a digital sector."; + type enumeration { + enum normal_sector { + value 0; + description "Not a digital sector"; + } + enum left_digital_sector { + value 1; + description "Left digital sector for 2DS"; + } + enum right_digital_sector { + value 2; + description "Right digital sector for 2DS"; + } + enum left_digital_sector_3ds { + value 3; + description "Left digital sector for 3DS"; + } + enum right_digital_sector_3ds { + value 4; + description "Right digital sector for 3DS"; + } + enum middle_digital_sector_3ds { + value 5; + description "Middle digital sector for 3DS"; + } + } + } + } + } + + or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU { // 1 to 0..n + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf-list provided-nrCellDu { + description "gNodeB-DU Function provides NR Cell-DU."; + or-teiv-yext:aSide ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn; + type instance-identifier; + } + + leaf provided-by-gnbduFunction { + description "NR Cell-DU provided by gNodeB-DU Function."; + or-teiv-yext:bSide NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU; + type instance-identifier; + mandatory true; + } + } + + or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY { // 0..n 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 LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr; + type instance-identifier; + } + + leaf-list used-by-lteSectorCarrier { + description "Antenna Capability used by LTE Sector Carrier."; + or-teiv-yext:bSide AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy; + type instance-identifier; + } + } +} \ No newline at end of file diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang new file mode 100644 index 0000000..d143ea2 --- /dev/null +++ b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang @@ -0,0 +1,43 @@ +module o-ran-smo-teiv-rel-equipment-ran-test { + yang-version 1.1; + namespace "urn:o-ran:smo-teiv-rel-equipment-ran"; + prefix or-teiv-rel-equipran-test; + + 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 o-ran-smo-teiv-equipment-test { prefix or-teiv-equip-test; } + + import o-ran-smo-teiv-ran-test { prefix or-teiv-ran-test; } + + organization "ORAN"; + contact "The Authors"; + description + "These are just test Equipment and RAN topology relation model."; + + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + + or-teiv-yext:domain REL_EQUIPMENT_RAN; + + or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY { // 0..n to 0..m + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf-list serviced-antennaCapability { + description "Antenna Capability serviced by this Antenna Module."; + or-teiv-yext:aSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; + type instance-identifier; + } + + leaf-list serving-antennaModule { + description "Antenna Module serves this Antenna Capability."; + or-teiv-yext:bSide or-teiv-ran-test:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy; + type instance-identifier; + } + } +} \ No newline at end of file diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang new file mode 100644 index 0000000..161736c --- /dev/null +++ b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang @@ -0,0 +1,69 @@ +module o-ran-smo-teiv-rel-oam-ran-test { + yang-version 1.1; + namespace "urn:o-ran:smo-teiv-rel-oam-ran-test"; + prefix or-teiv-rel-oam-ran-test; + + 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 o-ran-smo-teiv-oam-test { prefix or-teiv-oam-test; } + + import o-ran-smo-teiv-ran-test { prefix or-teiv-ran-test; } + + organization "ORAN"; + contact "The Authors"; + description + "These are just test O&M and RAN topology relation model."; + + revision "2024-10-04" { + description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + + or-teiv-yext:domain REL_OAM_RAN; + + or-teiv-yext:biDirectionalTopologyRelationship ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU { // 1 to 0..1 + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf used-nrCellDu { + description "gNodeB-DU Function uses NR Cell-DU."; + or-teiv-yext:aSide or-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt; + type instance-identifier; + } + + leaf used-by-managedElement { + description "NR Cell-DU used by managedElement."; + or-teiv-yext:bSide or-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU; + type instance-identifier; + mandatory true; + } + + } + + or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN { // 1 to 0..n + + uses or-teiv-types:Top_Grp_Type; + key id; + + leaf-list managed-gnbduFunction { + description "Managed Element manages gNodeB-DU Function."; + or-teiv-yext:aSide or-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt; + type instance-identifier; + } + + leaf managed-by-managedElement { + description "gNodeB-DU Function managed by Managed Element."; + or-teiv-yext:bSide or-teiv-ran-test:GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn; + type instance-identifier; + mandatory true; + } + } +} \ No newline at end of file -- 2.16.6